2D阵列中的指针

bis*_*CSE 8 c c++ arrays pointers

作为初学者程序员,我正在处理与指针有关的一些简单问题.在下面的代码中,我发现十六进制的值*aa相同.但我无法理解原因.

#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)

Vla*_*cow 9

数组及其第一个元素具有相同的地址.:)

对于这个声明

int a[5][5];
Run Code Online (Sandbox Code Playgroud)

a printf调用中使用的表达式被隐式转换为指向其第一个元素的指针.表达式*a产生数组的第一个元素,而第一个元素又是一维数组,该数组也被转换为指向其第一个元素的指针.

因此表达式a和表达式*a具有相同的值&a[0][0]


AnT*_*AnT 5

在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].因此结果*aa[0]本身.但a[0]也是一个阵列.它是一个int[5]类型的数组.它也受阵列类型衰减的影响.它衰减到类型的指针int *,指向第一个元素a[0],即a[0][0].这是您打印的第二个指针.

两个指针值在数字上相同的原因是子数组的开头a[0]对应于与元素相同的存储器位置a[0][0].