如何在此C代码中解析此指针?

时间:2011-09-02 08:07:59

标签: c pointers

我有一些代码(下面),我将整数数组的地址分配给指针。我以两种方式分配并期望两种不同的输出,但在两种情况下输出都是相同的。

main()
{
   int a[]={11,2,3};
   int *p=&a;
   printf("%d",*(p+1));
}

它应该给我一些垃圾值,因为p指向下一个1D数组

main()
{
   int a[]={11,2,3};
   int *p=a;
   printf("%d",*(p+1));
}

这应打印2

然而,这些功能同时打印2

这不是我的预期。谁能解释发生了什么?

任何人都可以告诉我如何使指针指向整个数组而不是单个元素。

3 个答案:

答案 0 :(得分:3)

这是因为在这种情况下,裸数组标识符会衰减为类型为int *的指针。

&a计算指向整个数组(类型为int (*)[3])的指针,尽管它的类型不同,但它与第一​​个元素的地址是相同的地址。

答案 1 :(得分:3)

如果您编译第一个程序,您将收到编译器警告:

 warning: initialization from incompatible pointer type

因为p的类型是指向整数的指针,但&a的类型是pointer to array of integer. Compiling the second program is fine, because again p has type int * and a has type int []`(即整数数组)但在C中,你可以传递/分配一个整数数组到一个整数指针就好了。指针的值被赋予数组的起始地址。

在C中定义带方括号的数组时,数组会立即放在堆栈或数据部分中,因此数组的起始地址与数组变量本身的地址相同!这与使用malloc创建的数组不同。

这对您意味着什么:假设变量a分配在地址4e78ccba。这意味着&a是4e78ccba。但是在C中,a在传递/分配给指针时的值是定义为数组开头的地址,所以这也是 4e78ccba。

同样,如果你用malloc设置东西会有所不同。 (尝试!!)顺便说一下,注意警告。 :)这是一个有趣的问题,因为C类型很弱,它只在第一种情况下给你一个警告。一个stronly类型的语言不会喜欢整数指针与整数数组指针的混合。

<强>附录

以下是一些代码,展示了如何实际区分指向第一个元素的指针和指向整个数组的指针

#include <stdio.h>
int main() {
    /* a is an array of ints, but can be used as a pointer to int */
    int a[] = {11, 2, 3};

    /* Using a as an int pointer */
    int* p = a;
    printf("%d\n", *(p+1));

    /* Now here is how to make a pointer to the array itself! */
    int (*q)[] = &a;
    printf("%d\n", (*q)[2]);

    return 0;
}

该程序输出

2
3

答案 2 :(得分:1)

两次都是一个指向int的指针,无论指针实际来自何处,p + 1只会以int的大小前进。