Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 表达式之间的差异:int*a=0;int*a=10;_C_Pointers - Fatal编程技术网

C 表达式之间的差异:int*a=0;int*a=10;

C 表达式之间的差异:int*a=0;int*a=10;,c,pointers,C,Pointers,两者的区别是什么 int* a = 0; 及 ? 将0指定给指针 int* a = 10; 为指针指定10。注意,指向指针(即应包含地址的变量),而不是指针对象 最后一个是危险的,因为它会破坏NULL指针检查。这里我们将赋值给指针,int*a=0;表示int a*=NULL;但是,在C++中,int *a=10不会编译,因为“从整数类型到指针类型的转换需要重新解释Type,C风格的CAST或函数类型的CAST”,因为编译器认为10是一个整数类型而不是一个指针。 int *A < /C> >

两者的区别是什么

int* a = 0;

?

将0指定给指针

int* a = 10;
为指针指定10。注意,指向指针(即应包含地址的变量),而不是指针对象


最后一个是危险的,因为它会破坏
NULL
指针检查。

这里我们将赋值给指针,int*a=0;表示int a*=NULL;但是,在C++中,int *a=10不会编译,因为“从整数类型到指针类型的转换需要重新解释Type,C风格的CAST或函数类型的CAST”,因为编译器认为10是一个整数类型而不是一个指针。

<代码> int *A < /C> >声明变量<代码> A<代码>作为指针,以整数。
int* a = 10;
=0
=10
为变量赋值

请注意,
a
是指针,其值应该是地址

  • 地址
    0
    有一个特殊的含义:它是
    NULL
    ,表示一个空指针

  • 地址
    10
    没有任何意义:它是一个随机内存地址。因为它不是<代码> null ,大多数函数会认为它是一个有效的地址,将去引用它,因此它会给应用程序造成问题(未定义的行为)。


其中一个应触发警告。启动编译器警告

int *a = 0;
这个没问题。它声明一个指向
int
的指针
a
,并将其初始化为0,或
NULL
指针,这意味着它不指向任何内容。试图去引用它会导致不好的结果,但在去引用之前可以检查指针是否有效,因此
NULL
指针实际上是好的

int *a = 10;

这不好。它声明了指向
int
的相同指针,但将其初始化为10。首先,编译器会抱怨
int
10不能隐式转换为指针类型。如果忽略此项,指针将指向内存位置10,您无法保证该位置是有效的
int
或有效的任何内容,甚至不属于您的进程。取消对
a
的引用将是不好的,就像取消对
a
的引用时它是
NULL
,但更糟糕的是,我们无法检查
a
的有效性,因为10可能是好的,也可能是坏的-在我们使用它并得到我们想要的/垃圾/鼻腔恶魔之前,我们无法知道,它们是声明

int* a = 0;
这声明了一个指向整数的指针,并使用零编译时整数常量对其进行初始化,该常量被转换为空指针值。换句话说,它声明一个指向整数的空指针

int* a = 10;

这声明了一个指向整数的指针,该指针指向特定编译器定义的位于整数10表示的地址的任何内容。在绝大多数情况下,这里没有任何内容,因此您只需声明此指针,就可以得到未定义的行为。

int*a和int*a都是相同的?仅定义
=10
的行为就是未定义的行为,除非编译器赋予该地址特殊含义(“视频内存缓冲区的地址”)。你甚至不需要使用它。@U eclair先生:是的@peoro:特别挑剔的是,10不是一个随机地址,它是任意的。总是10,但没有明显的原因。@U eclair先生-是的。哪一个“更好”是一个正在进行的风格辩论,没有很好的答案。忽略这场圣战和密码。我想添加
int*a=0是初始化指针的常见(良好)实践。您还可以使用
int*a=NULL这是一个很好的答案,但是OP没有提到C++。1如果你拿出C++特定的语言。C已经足够让人迷惑了,以至于开始学习时没有人试图用黑暗面来引诱你P
int* a = 10;