这个指针是如何在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