【问题标题】:Why the address of pointer of an Array is the same of the data stored in that pointer?为什么数组的指针地址与该指针中存储的数据相同?
【发布时间】:2018-10-09 01:24:43
【问题描述】:

如果你尝试那段代码

#include<stdio.h> int main() { 


// Pointer to an integer 
int *p;  

// Pointer to an array of 5 integers 
int (*ptr)[5];  
int arr[] = { 3, 5, 6, 7, 9 };

// Points to 0th element of the arr. 


// Points to the whole array arr. 
ptr = &arr;  

printf("p = %p, address of P = %p\n", p, &p); 
return 0; }

你会得到类似p = 0x7fff8e9b4370, P address = 0x7fff8e9b4340 这意味着指针P的地址是一个东西,它里面的数据是另一个

但是如果你用这样的数组指针尝试同样的操作

#include<stdio.h> int main() { 


// Pointer to an integer 
int *p;  

// Pointer to an array of 5 integers 
int (*ptr)[5];  
int arr[] = { 3, 5, 6, 7, 9 };

// Points to 0th element of the arr. 
p = arr; 

// Points to the whole array arr. 
ptr = &arr;  

printf("arr  = %p, arr address = %p\n", arr, &arr); 
return 0; } 

你会得到类似arr = 0x7ffda0a04310, arr address = 0x7ffda0a04310的东西

那么为什么指针数据与内存中的指针地址相同?!当我们取消引用 arr 指针的地址时,我们应该得到数字 3,但据我了解,这是内存中的地址位置 0x7ffda0a043100x7ffda0a04310 作为数据

那么我错在哪里了?

【问题讨论】:

  • 你觉得int (*ptr)[5]是什么类型的?

标签: c arrays pointers


【解决方案1】:

打印p 表示打印p 的值,而p 的值是整数地址或整数数组的地址。

打印&amp;p 意味着您在内存中打印p 的位置。

打印arr将显示数组第一个元素的地址,它是&amp;arr[0]

打印&amp;arr 将显示 arr 在内存中的位置,它也是数组第一个元素的地址

所以打印p 与打印&amp;p 会有所不同。 arr&amp;arr 是不同的类型,但它会给你相同的结果。

【讨论】:

  • &amp;arrarr 是不同的类型还是相同的类型,正如birdfreeyahoo 所说的不同?
  • 它们是不同的类型,但它们具有相同的值。
  • 它们各自的类型是什么?
  • 正如我在回答中提到的那样。 arr = &arr[0],它是第一个元素的地址,表示单个变量的地址。另一方面,&amp;arr 是数组的地址,如果是连续数字,则表示该地址。简而言之,arrint*arr 是同一类型 int (*ptr)[5]
  • 您的意思是如果数组是 5 个元素,每个元素 2 个字节,那么 &arr+1 将向地址添加 10 个字节。我理解你吗?
【解决方案2】:

这是因为当您使用数组的符号时,它实际上计算为&amp;arr(第一个元素的地址)。所以因为这个arr&amp;arr是同一个地址(但不是同一个类型!)。

arr 的类型为 int*

&amp;arr 的类型为 int(*)[5]

不同之处在于您进行指针算术。递增arr 将转到下一个元素的地址。所以*(arr+1) 本质上与arr[1] 相同。 递增&amp;arr 会跳过整个数组(递增指针总是会跳转整个类型的大小)

【讨论】:

  • 首先谢谢你的回答,但它们都是什么不同的类型?你能告诉我吗?
【解决方案3】:

您发现数组的地址与其第一个成员的地址相同。

当您在表达式中使用数组arr 时,在大多数 情况下,它会衰减为指向其第一个元素的指针。所以表达式中的arr 等价于&amp;arr[0]。由于arr 的成员具有int 类型,因此表达式&amp;arr[0](以及扩展arr)具有int * 类型。

然而,在某些情况下,这种衰减不会发生。其中之一是当数组是 &amp; 运算符的操作数时。所以表达式&amp;arr 具有int (*)[5] 类型,即指向大小为5 的int 数组的指针。

至于为什么这两个地址的值是一样的,你看看就明白了:

                  arr 
                -------
0x7ffda0a04310  |  0  |
                -------
                |  0  |
                -------
                |  0  |
                -------
                |  0  |
                -------
0x7ffda0a04314  |  1  |
                -------
                |  1  |
                -------
                |  1  |
                -------
                |  1  |
                -------
                ...

看这个,可以看到数组本身和数组的第一个元素都是从同一个地址开始的。

所以arr(作为表达式)的类型为int *,而&amp;arr 的类型为int(*)[5],但两者的值相同。

【讨论】:

    猜你喜欢
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 2011-12-16
    • 1970-01-01
    • 2021-11-28
    相关资源
    最近更新 更多