我对 C 中指针和数组声明的基础知识感到困惑。我想知道以下两个语句之间的区别,除了数组的基地址在第二个语句中分配给 ptr 。
int a[2][3]= { (1,2,3),(4,5,6)};
int (*ptr)[3] = &a[0];
请举出例子来澄清。第 2 行 R 侧的 [3] 有什么影响?
1、二维数组:
int a[2][3]= { {1,2,3},{4,5,6}};
使用内存中的此语句,您有 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
2. 指向数组的指针:
int (*ptr)[3] = &a[0];
ptr 指向一个 int[3] 内存块。所以你只能将它分配给一个 int[3] 类型:
ptr= &a[0];
ptr= &a[1];
不同之处在于该指针没有自己的内存,您必须将其分配给 int[3] 变量或分配它:
ptr= malloc (2*sizeof(int[3]);
这样你就可以使用ptr指向的内存,如果你用这种方式初始化ptr:
for(int j=0; j<2; j++)
for(int i=0; i<3;i++)
ptr[j][i]=i+j*3+1;
在这种情况下,您将拥有与 int a[2][3] 相同的内存表示,除了此内存位于堆中而不是堆栈中。您始终可以选择重新分配/释放内存并且此内存不会被删除一旦你的函数终止。
您应该知道 C 中的运算符优先规则:http ://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedencehttp://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence
int (*ptr)[3]
与int * ptr [3]
第一个是指向大小为 3 的 int 数组的指针(注意 * 更接近 var 名称)。第二个等于int (*(ptr [3]))
int 指针上的大小为 3 的数组。
如果您对如何解释表达式有疑问,也可以使用此站点:http ://cdecl.org/。
a 是行大小为 2 列大小为 3 的二维数组。
而是指向大小为 3ptr
的数组的指针int
但是您的数组a
初始化方式不正确
由于您使用()
了所以逗号运算符将生效并将使用 and 进行初始化,3
并且6
数组的其他元素a
将进行0
实际初始化使用{}
&a[0] 是数组第一个元素的地址(意味着它也会为 a 打印相同的值)。
但这&a[0]
在您执行指针算术运算时生效ptr
如果是数组,请记住 3 件事:
--->int *ptr=&a[0][0];
第一个元素的地址ptr++
将为您提供下一个元素a[0][1]
---> &a[0] = 第一个元素的地址,但如果你这样做,int (*ptr)[3]=&a[0]
那么ptr++
指针将增加整行的大小,并且 ptr 将直接指向下一行意味着现在 ptr 将指向&a[1]
---> &a = 整个数组的地址,如果你保留它int (*ptr)[2][3] =&a
并且 doptr++
指针将增加整个数组的大小。