指向数组的方法之间有什么区别?

时间:2016-12-17 15:29:15

标签: c arrays pointers

假设我将x定义为这样的数组:int x[30]={2,4,8,9,6,3,5,4,7,8,9,6,3,2,}A作为指向int的指针,如下所示:int *A

现在我想知道它们之间有什么区别:

  1. int *A=x[5]

  2. int *A ; A=&x[5]

  3. int *A=x+5

  4. int *A ; *A=x+5

  5. int *A ; A=*(x+5)

  6. 为什么1号,4号和5号出错?

    虽然数字3没有,但是数字4给出了错误。为什么这些不相等?

1 个答案:

答案 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的指针,因此*AA指向的值,即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的指针。同样,您也可以执行3x[5] = (int)AA指向的变量的地址存储为int中的x[5]。但是,我从来没有见过任何这种事情在实践中有用的情况。