在下面的代码中,指针值和指针地址与预期的不同。
但是数组值和地址不行!
怎么会这样?
输出量
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具有相同的值(但类型不同,因此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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。