bis*_*CSE 8 c c++ arrays pointers
作为初学者程序员,我正在处理与指针有关的一些简单问题.在下面的代码中,我发现十六进制的值*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;
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
*a=0x7ffddb8919f0 a=0x7ffddb8919f0
Run Code Online (Sandbox Code Playgroud)
数组及其第一个元素具有相同的地址.:)
对于这个声明
int a[5][5];
Run Code Online (Sandbox Code Playgroud)
a printf调用中使用的表达式被隐式转换为指向其第一个元素的指针.表达式*a产生数组的第一个元素,而第一个元素又是一维数组,该数组也被转换为指向其第一个元素的指针.
因此表达式a和表达式*a具有相同的值&a[0][0]
在C和C++语言中,数组类型T [N]的值T *在大多数上下文中被隐式转换为指针类型的值(少数例外).结果指针指向原始数组的第一个元素(索引0).这种现象非正式地称为阵列型衰变.
printf当数组类型衰减发生时,参数是这些上下文之一.
类型的2D数组int [5][5]只不过是"1D数组的1D数组",即它是由5个元素组成的数组,每个元素本身是5 int秒的数组.
上述阵列类型衰减规则自然适用于这种情况.
a最初具有数组类型的表达式int [5][5]衰减为类型的指针int (*)[5].指针指向元素a[0],元素是a[0]内存中子数组的开头.这是您打印的第一个指针.
表达式*a是应用于子表达式的解除引用运算符a.子表达式a在此上下文中完全相同的方式表现为前:它衰减到类型的指针int (*)[5]指向a[0].因此结果*a是a[0]本身.但a[0]也是一个阵列.它是一个int[5]类型的数组.它也受阵列类型衰减的影响.它衰减到类型的指针int *,指向第一个元素a[0],即a[0][0].这是您打印的第二个指针.
两个指针值在数字上相同的原因是子数组的开头a[0]对应于与元素相同的存储器位置a[0][0].