*ptr 和 *(&ptr + 1) 之间的区别

  • 本文关键字:ptr 之间 区别 c
  • 更新时间 :
  • 英文 :


我是指针新手,学习指针的基础知识。我想知道两者之间的区别*PTR 和 *(&PTR + 1) 来自以下代码。

#include<stdio.h>
int main()
{
     int a[3] = {1, 2, 3};
     int *ptr = a;
     printf("*ptr = %dn",*ptr);
     printf("&ptr = %pn",&ptr);
     printf("(&ptr + 1) = %pn",(&ptr + 1));
     printf("*(&ptr + 1) = %dn",*(&ptr + 1));
     return 0;
}       

根据我的分析,gcc产生了以下输出,

*ptr = 1    // as ptr = a, Ultimately *ptr will print the first value of array i.e. 1
&ptr = 0x7fffa7e97788   // Starting Address of array or address of first element
(&ptr + 1) = 0x7fffa7e97790   //address of next element in the array
*(&ptr + 1) = 1  // I want to know how this is getting dereffered 

提前谢谢。

&ptr是指针变量ptr的地址。此地址与数组的地址无关。

*(&ptr + 1)是未定义的行为&ptr + 1因为它比ptr的地址高出一步。取消引用此类指针会产生未定义的行为。

你可能的意思是*(ptr + 1).

编译器似乎通过以下方式将定义的对象放置在堆栈上

--------------------------------
|   ptr   | a[0] | a[1] | a[2] | 
--------------------------------

因此,&ptr是分配 ptr 的地址。 &ptr + 1 是 PTR 之后的下一个地址,同时也是 a[0] 的地址。

考虑到未指定编译器必须在堆栈上放置局部变量的顺序。

此外,似乎在编译程序的环境中sizeof( int * )对应的to sizeof( *( &ptr + 1 ) )等于sizeof( int ),反过来又等于4。或 sizeof( int * )等于 8,但sizeof( int )等于 4。当您在 printf 中使用格式说明符 %d 作为表达式*( &ptr + 1 )时,则正好输出 a[0]。

顺便说一下,您可以通过打印来检查此方案是否与变量的实际放置相对应

printf("(&ptr + 1) = %pn", &ptr + 1 );
printf("(&a[0]) = %pn",  &a[0] );

如果地址不相等,则意味着地址&ptr + 1处存在一些与 a[0] 不对应的任意值。

至于你帖子标题中的问题

*ptr 和 *(&ptr + 1) 之间的区别

然后*ptr对应于使用表达式时a[0] *(&ptr + 1)会导致未定义的行为,因为您试图在 PTR 之后取消引用地址。

ptr是一个

指针,它指向一些有效的内存位置。

&ptr是指针的地址,可以分配给双指针

int **ptr1 = &ptr; 

否则,第一个元素的地址仅由 ptr 给出。

如果你想解析你的数组,那么有

for(i=0;i<4;i++)
{
printf("Value %d is stored in %pn",ptr[i],(void *)(ptr+i));
}

(&ptr+1)被取消引用会导致未定义的行为,因为这不是您分配的内存。 &ptr在您的控制之下,而不是它之后的位置,即 &ptr+1

嗯,这似乎很有趣。首先,正如你所知道的*ptr给出了a[0]的值,ptr包含a[0]的地址,&ptrptr的地址,即整数指针变量。

考虑到这一点,当您打印*ptr时,a[0]的值,即 1将被打印,(&ptr+1)地址将在ptr地址之后一步,*(&ptr+1)将在地址(&ptr+1)处打印值。在上面的代码中,a[0]的地址紧跟在ptr的地址(即&ptr)之后。所以当你打印*(&ptr+1)时,它会打印1,因为&ptr+1指向a[0]。这取决于分配给变量的内存。

将上述变量声明为全局变量,*(&ptr+1)将打印值为零(如果"*(&ptr+1)"没有指向任何位置,因为全局变量初始化为零)。此外,观察分配给变量的地址的差异,当声明为全局和局部时。希望这会有所帮助。

最新更新