指向整数数组的指针如何在C中工作?

时间:2014-07-20 15:20:11

标签: c arrays pointers

看一下这个例子:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int a[5] = {1,2,3,4,5};   // LINE A
    int (*b)[5] = &a;         // LINE B
    printf("%d\n", (*b)[0]);  // LINE C
}
  1. 我尝试在int (*b)[5] = a上写LINE B,但它没有用。任何人都可以解释为什么这不起作用?我虽然数组已经衰减成指针,但我不能理解为什么我需要明确地通过a获取&a的地址。就像a已经是一个指针因为它已经腐烂了,但现在我拿了一个指针的地址?双指针?咦?

  2. 任何人都可以解释(*b)[0]的工作原理吗?它就像我取消引用b,它本身就是一个指向5个整数的数组的指针,但我不知何故取了它的[0]&#39;元素?在这种情况下,不是[0]元素是5个整数吗?我不知何故最终得到一个整数,它打印1

  3. 我真的很困惑。感谢。

3 个答案:

答案 0 :(得分:2)

int a[5]={1,2,3,4,5};

-------In Memory----------
| 1 || 2 || 3 || 4 || 5 |
---------------------------                                         
101   105  109  113  117  //Assume these are addresses

默认情况下,数组名称就像指向第一个元素的指针一样。 所以a就像指向第一个元素的指针(这里的元素是整数)

因此a已经沦为int *a; 这就是为什么如果你增加1然后它将跳转到元素的下一个地址,如下所示 它会像这样计算:第一个元素的地址+(n * sizeof(int))

(a+0)--->101  // 101 + 0*sizeof(int)
(a+1)--->105 //  101 + 1*sizeof(int)
(a+2)--->109 //  101 + 2*sizeof(int)
(a+3)--->113 //  101 + 3*sizeof(int)
(a+4)--->117 //  101 + 4*sizeof(int)

但是&a就像一个指向完整数组的指针(在这种情况下指向5个整数),这意味着 当你向它添加一个时,它将尝试指向接下来的5个整数。如下所示

(&a+1)----->121 //101 + 1*sizeof(a)

这就是为什么在这一行中int (*b)[5] = &a;没有问题,但当你尝试int(*b)[5]=a;时 它给出了错误,因为 a是指向单个整数的指针,其中as(* b)[5]是指向5个整数的指针。你不能指定不兼容的指针类型。

答案 1 :(得分:0)

b是指向数组a的指针。取消引用b将提供整个数组a。因此,当您在表达式中使用*b时,它表示该解除引用数组的名称。由于数组名称被转换为指向数组第一个元素的指针,*b衰减到指向a(或*b)的第一个元素的指针。衰变后*b的类型为int *。因此(*b)[i]将给出b指向的数组的i th 元素。

答案 2 :(得分:-4)

当你声明 - int a [5]时 -​​ 编译器使用'a'作为内部存储器的引用。 'a'本身不是变量。因此,&amp; a不起作用。