c - 为什么数组的地址等于它在 C 中的值?

标签 c pointers arrays

在下面的代码中,指针值和指针地址与预期的不同。

但是数组值和地址不是!

这怎么可能?

输出

my_array = 0022FF00
&my_array = 0022FF00
pointer_to_array = 0022FF00
&pointer_to_array = 0022FEFC
#include <stdio.h>

int main()
{
  char my_array[100] = "some cool string";
  printf("my_array = %p\n", my_array);
  printf("&my_array = %p\n", &my_array);

  char *pointer_to_array = my_array;
  printf("pointer_to_array = %p\n", pointer_to_array);
  printf("&pointer_to_array = %p\n", &pointer_to_array);

  printf("Press ENTER to continue...\n");
  getchar();
  return 0;
}

最佳答案

数组名的计算结果通常是数组第一个元素的地址,因此 array&array具有相同的值(但类型不同,所以如果数组的长度超过 1 个元素,array+1&array+1相等)。

这有两个异常(exception):当数组名称是 sizeof 的操作数时或一元 & (address-of),名称指的是数组对象本身。因此 sizeof array为您提供整个数组的字节大小,而不是指针的大小。

对于定义为 T array[size] 的数组,它将具有类型 T * .当/如果您递增它,您将到达数组中的下一个元素。

&array计算出相同的地址,但给定相同的定义,它创建一个类型为 T(*)[size] 的指针-- 即,它是指向数组的指针,而不是指向单个元素的指针。如果你增加这个指针,它会增加整个数组的大小,而不是单个元素的大小。例如,使用如下代码:

char array[16];
printf("%p\t%p", (void*)&array, (void*)(&array+1));

我们可以预期第二个指针比第一个指针大 16(因为它是一个 16 个字符的数组)。由于 %p 通常将指针转换为十六进制,因此它可能类似于:

0x12341000    0x12341010

关于c - 为什么数组的地址等于它在 C 中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37896625/

相关文章:

objective-c - 初始化作为 C 数组的 Objective-C 类 ivar

c - 使用结构传输变量

c++ - 将原始指针视为基于范围的 for 循环中的范围

arrays - 科学/ NumPy : summation over multiple indices

java - 从 JPanel/JFrame 的 JTextfields 添加到商店

c - 我可以在同一进程中通过管道发送指针吗,安全吗?

c - 如何制作没有.bashrc的可执行脚本文件

c - 错误包 SplashScreen.Fody

c++ - free():下一个大小无效(正常)&munmap_chunk():C中的无效指针

JavaScript - 使用 for 循环和 if-else 语句来遍历数组