开发者社区> 问答> 正文

数组的地址如何等于C中的值?

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

但是数组值和地址不行!

怎么会这样?

输出量

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; }

展开
收起
保持可爱mmm 2020-01-16 17:23:47 550 0
1 条回答
写回答
取消 提交回答
  • 数组的名称通常以数组的第一个元素的地址求值,因此,array且&array具有相同的值(但类型不同,因此array+1,如果数组长于1个元素,&array+1则将不相等)。

    对此有两个例外:当数组名称是sizeof或一元运算符&(地址)的操作数时,名称是指数组对象本身。因此sizeof array,您可以得到整个数组的大小(以字节为单位),而不是指针的大小。

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

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

    char array[16]; printf("%p\t%p", (void*)&array, (void*)(&array+1)); 我们可以预期第二个指针比第一个指针大16(因为它是16个char的数组)。由于%p通常将指针转换为十六进制,因此它可能类似于:

    0x12341000 0x12341010 问题来源于stack overflow

    2020-01-16 17:23:59
    赞同 展开评论 打赏
问答分类:
C#
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载