为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C C++
拉莫斯之舞 2019-05-27 15:05:17
为什么数组的地址等于它在C中的值?在下面的代码中,指针值和指针地址按预期不同。但数组值和地址不行!怎么会这样?产量my_array = 0022FF00&my_array = 0022FF00pointer_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;}
查看完整描述

3 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

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

这有两个例外:当数组名称是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


查看完整回答
反对 回复 2019-05-27
?
茅侃侃

TA贡献1842条经验 获得超21个赞

那是因为数组namemy_array)与指向数组的指针不同。它是数组地址的别名,其地址定义为数组本身的地址。

但是,指针是堆栈上的普通C变量。因此,您可以获取其地址并从其中包含的地址获取不同的值。

在这里写了这个主题- 请看一下。


查看完整回答
反对 回复 2019-05-27
?
梦里花落0921

TA贡献1772条经验 获得超6个赞

在C中,当您在表达式中使用数组的名称(包括将其传递给函数)时,除非它是address-of(&)运算符或sizeof运算符的操作数,否则它将衰减为指向其第一个元素的指针。

也就是说,在大多数情况下array,相当于&array[0]在这两个类型和值。

在您的示例中,my_array具有在将其传递给printf时char[100]衰减到的类型char*

&my_array有类型char (*)[100](指向数组100的指针char)。因为它是操作数&,所以这是my_array不会立即衰减到指向其第一个元素的指针的情况之一。

指向数组的指针具有与指向数组第一个元素的指针相同的地址值,因为数组对象只是其元素的连续序列,但指向数组的指针与指向元素的指针的指针具有不同的类型。那个数组。当您对两种类型的指针进行指针运算时,这很重要。

pointer_to_array具有类型char *- 初始化为指向数组的第一个元素,因为它是my_array初始化表达式中的衰减 - 并且&pointer_to_array 具有类型char **(指向a的指针char)。

其中:( my_array在衰减之后char*),&my_array并且pointer_to_array都直接指向数组或数组的第一个元素,因此具有相同的地址值。


查看完整回答
反对 回复 2019-05-27
  • 3 回答
  • 0 关注
  • 733 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信