当我试图在c ++中访问这个数组(2d)时出了什么问题

Kan*_*ngh 1 c++ pointers multidimensional-array

下面是我试图运行的代码

#include <iostream>
using namespace std;

int foo(int **a){
    cout<<*(a+3)<<endl;
    return 1;
}

int main(){
    int a[2][2] = {{1,2},{3,4}};
    std::cout << sizeof(a);
    foo((int **)a);
}
Run Code Online (Sandbox Code Playgroud)

当我在这个数组中有四个元素时,值*(a + 3)不应返回值4,而不是返回一个地址,当我尝试取消引用该地址时(即**(a + 3))我得到了段错11

rod*_*igo 6

实际上,您正在定义一个整数数组.它可以衰减到指向整数数组的指针,但它不会衰减为整数指针的pointe.

如果你绘制内存布局会有所帮助:

+---------+---------+---------+---------+
| a[0][0] | a[0][1] | a[1][0] | a[1][1] |
+---------+---------+---------+---------+
|    1    |    2    |    3    |    4    |
+---------+---------+---------+---------+
Run Code Online (Sandbox Code Playgroud)

如果你让它衰变成一个指向整数数组的指针:

int (*pa)[2] = a;

+---------+---------+---------+---------+
|  pa[0]            |  pa[1]            |
+---------+---------+---------+---------+
|    1    |    2    |    3    |    4    |
+---------+---------+---------+---------+
Run Code Online (Sandbox Code Playgroud)

请注意如何sizeof(*pa) = 2 * sizeof(int).这些值中的每一个都可以衰减为指向整数的指针,但绝不会指向指向指针的指针:

int *p = pa[0];
Run Code Online (Sandbox Code Playgroud)

无论如何,您可以将衰减的指针指向整数数组转换为指向整数的指针并直接访问这四个值:

int *p = (int*)a;
std::cout << p[3] << std::endl;
std::cout << *(p + 3) << std::endl;
Run Code Online (Sandbox Code Playgroud)

记忆将是这样的:

+---------+---------+---------+---------+
|   p[0]  |   p[1]  |   p[2]  |   p[3]  |
+---------+---------+---------+---------+
|    1    |    2    |    3    |    4    |
+---------+---------+---------+---------+
Run Code Online (Sandbox Code Playgroud)

但是如果你把它变成一个int**你会得到毫无意义的值,因为在内存中没有指针,只有整数.