假设我将x定义为这样的数组:int x[30]={2,4,8,9,6,3,5,4,7,8,9,6,3,2,}
和A
作为指向int
的指针,如下所示:int *A
。
现在我想知道它们之间有什么区别:
int *A=x[5]
int *A ; A=&x[5]
int *A=x+5
int *A ; *A=x+5
int *A ; A=*(x+5)
为什么1号,4号和5号出错?
虽然数字3没有,但是数字4给出了错误。为什么这些不相等?
答案 0 :(得分:1)
在数字1中,您创建的变量A
是指向int
的指针,而x[5]
是int
,而不是指针。所以你给了一个int
指针,这会产生一个错误。
在数字2中,您创建指向int
的指针,然后指向变量x[5]
,因为&x[5]
是x[5]
的地址。这将编译得很好,你编写它的方式不会产生任何错误,但不建议创建一个没有任何初始值的指针。如果在不初始化的情况下创建A
,它将获取内存中已存在的值,该值可以是任何值。因此,如果在给出错误之前使用变量A
,程序将崩溃。相反,它建议做:
int *A = NULL;
A = &x[5];
或简单地说:
int *A= &x[5];
在数字3中,您正在创建指向int
的指针,并为其指定值x + 5
。这没关系,因为x
实际上是指向x[0]
的指针(x
和&x[0]
执行完全相同的事情)。所以x + 5
是指向x[0]
之后5个存储空间的值的指针,即x[5]
。实际上,当编译器看到x[5]
时,它会将其转换为*(x + 5)
。
在数字4中,A
是指向int
的指针,因此*A
是A
指向的值,即int
。在您的代码中,*A = x + 5
错误有两个原因:第一个原因,代码不会编译,因为x + 5
是指针而*A
是{ {1}},因此您需要将指针值分配给int
,这不是有效的。但那里还有另一个错误。由于某种原因对其进行成像。然后,在运行时,它所做的是,它需要int
指向的内存空间并为其赋值A
。问题是x + 5
未初始化,因此A
很可能指向另一个程序使用的变量。为防止此类损坏,您的操作系统将使程序崩溃。如果你很幸运",A
将指向程序中的变量,这样它就会为程序中的变量赋值,而不知道它是哪个变量,所以您的程序将继续运行但无法正常工作。
在数字5中,A
是指向A
的指针,您可以为其指定值int
。正如我之前解释的那样,*(x + 5)
与*(x + 5)
完全相同,即x[5]
。因此,您要为指针指定一个int
值,该指针无效。请注意,如果由于某种原因您希望为指针分配int
值,则可以执行int
,这将正确编译(但程序可能会在运行时崩溃)。然后A = (int*)(*(x + 5))
将是指向内存空间A
的指针。同样,您也可以执行3
,x[5] = (int)A
将A
指向的变量的地址存储为int
中的x[5]
。但是,我从来没有见过任何这种事情在实践中有用的情况。