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

时间:2012-11-14 17:01:15

标签: c arrays pointers syntax

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

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

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

3 个答案:

答案 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)

您应该知道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]

第一个是指针(注意*更接近var名称)到大小为3的int数组 第二个等于int (*(ptr [3])),它是int指针上的大小为3的数组。

如果您对如何解释表达有疑问,也可以使用此网站:http://cdecl.org/

答案 2 :(得分:-1)

a是行大小为2且列大小为3的二维数组。

ptr是指向大小为3的int数组的指针

但您的数组a初始化方式不正确

由于您已使用(),因此逗号运算符将生效,并将使用36初始化,而数组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指针将增加整个数组的大小。