这个指针是如何在C代码中解析的?

这个指针是如何在C代码中解析的?,c,pointers,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 但是,这两个函数都打

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

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

这不是我所期望的。有人能解释发生了什么事吗


谁能告诉我如何使指针指向整个数组而不是单个元素。

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


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

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

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

 warning: initialization from incompatible pointer type
因为
p
的类型是指向整数的指针,而
&a
的类型是指向整数数组的
指针。编译第二个程序很好,因为同样
p
具有type
int*
a
具有type
int[]`(即整数数组),但在C中,可以将整数数组传递/分配给整数指针。指针的值被指定为数组的起始地址

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

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

再说一次,如果你用malloc设置,事情会有所不同。(试试!!)顺便说一句,注意警告这是一个有趣的问题,因为C的类型非常弱,在第一种情况下它只给了您一个警告。stronly类型的语言不喜欢将整数指针与整数数组指针混合使用

附录

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


可能是@Phimueme的副本我找不到与您建议的完全相同的副本!!我以为你在谈论我提出的重复问题中的前两行输出。我猜在第一种情况下,它的指针指向整个数组,而不是相反!!很公平!但是因为你写int*p,C只知道它是指向int的指针。当你写int*p=a时,指针指向数组的开头。谢谢@Ray,这简化了丢失的东西!!但有一件事我想知道,我如何定义一个指向整体的指针array@Amit,当然没问题。我将在一秒钟内添加一个解释。它看起来是这样的,因为您正在键入
p
作为指向5个元素数组的指针。我不理解您所说的使用
malloc
创建的数组是不同的,我怀疑它包含错误的推理。你能澄清一下吗?@R。。例如,如果您声明
inta[5]
,那么
a
&a
都将“是相同的地址”(在堆栈上或全局数据部分),但是如果您声明
int*a=malloc(5*sizeof(int))
那么
a
将“是”分配数组的帮助地址,但是
&a
将是堆栈或数据段中指针变量本身的地址。当然,在这两种情况下
a==&a[0]
。所以我刚才是说
a
&a
的“等价性”适用于就地分配的实际数组,但当
a
声明为指针且实际数组为malloced时不适用。
#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