2D阵列中的指针

时间:2015-08-11 17:00:42

标签: 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;
}

这是输出:

*a=0x7ffddb8919f0  a=0x7ffddb8919f0

3 个答案:

答案 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]的地址相同。