作为一名初学程序员,我正在处理与指针有关的一些简单问题。在下面的代码中,我发现*a
和a
的值在十六进制中是相同的。但我无法理解原因。
#include <stdio.h>
#include <stdlib.h>
main(){
int a[5][5];
a[0][0] = 1;
printf("*a=%p a=%p \n", *a, a);
return 0;
}
这是输出:
*a=0x7ffddb8919f0 a=0x7ffddb8919f0
答案 0 :(得分:9)
数组及其第一个元素具有相同的地址。:)
对于此声明
int a[5][5];
printf调用中使用的表达式a
被隐式转换为指向其第一个元素的指针。表达式*a
产生数组的第一个元素,该元素又是一维数组,也被转换为指向其第一个元素的指针。
因此,表达式a
和*a
与表达式&a[0][0]
具有相同的值
答案 1 :(得分:5)
在C和C ++语言中,数组类型T [N]
的值在大多数上下文中被隐式转换为指针类型T *
的值(少数例外)。结果指针指向原始数组的第一个元素(索引0)。这种现象被非正式地称为阵列类型衰减。
printf
参数是其中一个上下文。
类型int [5][5]
的二维数组只不过是“一维数组的一维数组”,即它是一个包含5个元素的数组,每个元素本身就是一个5 int
的数组
上述阵列类型衰减规则自然适用于这种情况。
最初具有数组类型a
的表达式int [5][5]
衰减为类型为int (*)[5]
的指针。指针指向元素a[0]
,它是内存中子数组a[0]
的开头。这是您打印的第一个指针。
表达式*a
是应用于子表达式a
的解除引用运算符。此上下文中的子表达式a
的行为方式与之前完全相同:它衰减到指向int (*)[5]
的{{1}}类型的指针。因此a[0]
的结果是*a
本身。但a[0]
也是一个数组。它是a[0]
类型的数组。它也受阵列类型衰减的影响。它衰减到int[5]
类型的指针,它指向int *
的第一个元素,即指向a[0]
。这是您打印的第二个指针。
两个指针值在数字上相同的原因是子数组a[0][0]
的开头对应于与元素a[0]
相同的内存位置。
答案 2 :(得分:1)
a
可以被视为pointer to a pointer to an int
(实际上,它只是array of array of int
,但足够接近)。
因此a
和*a
都指向同一地址(恰好是a[0][0]
)。
*a
仍然是指针,a[0]
与a[0][0]
的地址相同。