2

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

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

请举出例子来澄清。第 2 行 R 侧的 [3] 有什么影响?

4

3 回答 3

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] 相同的内存表示,除了此内存位于堆中而不是堆栈中。您始终可以选择重新分配/释放内存并且此内存不会被删除一旦你的函数终止。

于 2012-11-14T17:14:25.067 回答
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]

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

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

于 2012-11-14T17:21:15.257 回答
-1

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++指针将增加整个数组的大小。

于 2012-11-14T17:02:27.467 回答