C中的数组声明和指针赋值

Moh*_*gal 2 c arrays syntax pointers

我在C中的指针和数组声明的基础知识中感到困惑.我想知道以下两个语句之间的区别,除了在seconed语句中将数组的基地址分配给ptr.

int a[2][3]= { (1,2,3),(4,5,6)};
int (*ptr)[3] = &a[0];
Run Code Online (Sandbox Code Playgroud)

请举例说明.[3]对第2行的R侧有什么影响?

Ram*_*uri 5

1.二维数组:

int a[2][3]= { {1,2,3},{4,5,6}};
Run Code Online (Sandbox Code Playgroud)

在内存中使用此语句,你有2x3整数,所有都在内存中相邻.我想你知道如何访问它们,但是如果你没有,我会澄清它:

a[0][0] : 1
a[0][1] : 2
a[0][2] : 3
a[1][0] : 4
a[1][1] : 5
a[1][2] : 6
Run Code Online (Sandbox Code Playgroud)

2.指向数组的指针:

int (*ptr)[3] = &a[0];
Run Code Online (Sandbox Code Playgroud)

ptr指向int [3]内存块.所以你只能将它分配给int [3]类型:

ptr= &a[0];
ptr= &a[1];
Run Code Online (Sandbox Code Playgroud)

不同之处在于此指针没有自己的内存,您必须将其分配给int [3]变量或分配它:

ptr= malloc (2*sizeof(int[3]);
Run Code Online (Sandbox Code Playgroud)

这样你可以使用ptr指向的内存,如果你用这种方式初始化ptr:

for(int j=0; j<2; j++)
    for(int i=0; i<3;i++)
        ptr[j][i]=i+j*3+1;
Run Code Online (Sandbox Code Playgroud)

这种情况你将拥有相同的int a [2] [3]的内存表示形式,除了这个内存在堆中而不在堆栈中.你总是可以选择重新分配/释放内存并且不删除这个内存一旦你的功能终止.