gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:02:45 25 4
gpt4 key购买 nike

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

但是数组值和地址则不然!

怎么会这样?

输出

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/36458288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com