指针和数组:指针常量

时间:2014-08-22 11:18:02

标签: c arrays pointers

我所说的那本书数组名是一个指针常量。 所以,我试过这个:

int A[3][4] = {0};
A[0][0] = 1;
A[1][0] = 2;
A[2][0] = 3;
printf("A : %x\n", A);
printf("*A : %x\n", *A);

我预计第一个printf的结果是A的地址,另一个是1。 因为,我认为数组名是一个指针常量,结果将是*(A的地址)。 但是,结果具有相同的价值; A.的地址 你知道为什么吗?请给我一些建议。

4 个答案:

答案 0 :(得分:1)

首先,数组不是指针!你的书错了。数组和指针共享一些操作,在某些情况下,数组名称可以自动转换为指向其第一个元素的指针,但请记住它们是不同的。

其次,在您的代码中,A是一个二维数组,即一个数组数组。所以*AA[0]相同,是它的第一个子阵列。要访问A[0][0],您需要**A

答案 1 :(得分:1)

数组不是指针。除非它是sizeof或一元&运算符的操作数,或者是用于初始化声明中的另一个数组的字符串文字,否则类型为“N”的表达式T“的元素数组转换(”衰减“)为”指向T的指针“的表达式,表达式的值将是数组的第一个元素的地址。

鉴于A的声明,以下所有内容都是正确的:

Expression        Type            Decays to        Value
----------        ----            ---------        -----
         A        int [3][4]      int (*)[4]       &A[0][0]
        *A        int [4]         int *            &A[0][0]
        &A        int (*)[3][4]   n/a              &A[0][0]
      A[i]        int [4]         int *            &A[i][0]
     *A[i]        int             n/a              A[i][0]
     &A[i]        int (*)[4]      n/a              &A[i][0]

A衰减为“指向int的4元素数组的指针”类型的表达式。 A[i]衰减到“int指针类型的表达式。数组的第一个元素的地址与数组本身的地址相同,因此表达式

A
*A
&A
A[0]
&A[0]
&A[0][0]

所有评估为相同的,但表达式的类型将不同。

答案 2 :(得分:0)

数组和指针不相同。 主要区别在于您无法对数组名称执行指针递增或递减。您可以将数组视为常量指针。 如果你想打印一个数组的元素,那么在循环中尝试** A或*(A + i),其中i是循环索引

答案 3 :(得分:0)

不要与数组和指针混淆!两者都是不同的东西!并且数组也不是指针!但是数组名称代表数组的基地址!

在您的代码中 -

int A[3][4];

这是一个二维数组,所以你需要两次dererence。如果你有一次取消它只会获取数组的地址。 AA[0]*A&A&A[0]都代表它的起始地址。

尝试 -

printf("%d\n",**A);

printf("%d\n",A[0][0]);

printf("%d\n",*A[0]);