我对C中指针和数组声明的基础知识感到困惑。我想知道以下两个语句之间的区别,除了在seconed语句中将数组的基址分配给ptr。
int a[2][3]= { (1,2,3),(4,5,6)};
int (*ptr)[3] = &a[0];
请举例说明。 [3]对第2行的R侧有什么影响?
答案 0 :(得分:5)
<强> 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]的内存表示形式,除了这个内存在堆中而不在堆栈中。你总是可以选择重新分配/释放内存和这个内存函数终止后不会被删除。
答案 1 :(得分:1)
int (*ptr)[3]
而不是int * ptr [3]
第一个是指针(注意*更接近var名称)到大小为3的int数组
第二个等于int (*(ptr [3]))
,它是int指针上的大小为3的数组。
如果您对如何解释表达有疑问,也可以使用此网站:http://cdecl.org/。
答案 2 :(得分:-1)
a是行大小为2且列大小为3的二维数组。
而ptr
是指向大小为3的int
数组的指针
但您的数组a
初始化方式不正确
由于您已使用()
,因此逗号运算符将生效,并将使用3
和6
初始化,而数组a
的其他元素将为{{1}使用0
&amp; a [0]是数组第一个元素的地址(意味着它也会为a打印相同的值)。
但是当{}
&a[0]
生效
如果是数组,请记住以下三点:
---&GT; ptr
第一个元素int *ptr=&a[0][0];
的地址将为您提供下一个元素ptr++
---&GT; &amp; a [0] =第一个元素的地址但是如果你a[0][1]
然后通过执行int (*ptr)[3]=&a[0]
指针将增加整行的大小,而ptr将指向下一行直接意味着现在ptr将指向ptr++
---&GT; &amp; a =整个数组的地址,如果你将它保存在&a[1]
中,那么int (*ptr)[2][3] =&a
指针将增加整个数组的大小。