在C中试验指针和数组

时间:2011-11-16 00:13:41

标签: c arrays pointers

有人可以向我解释一下之间的区别:

int *arr[5]int (*arr)[5]对比int *(*arr)[5]

我试图围绕指针/数组在C中实际表示的方式...

5 个答案:

答案 0 :(得分:7)

答案 1 :(得分:3)

第一个创建名为arr的变量,其类型为int*的数组长度为5,因此它是int指针的数组长度5。

第二个声明了一个名为arr的变量,它是一个指向int类型的数组长度为5的指针。所以它是一个指向整数长度为5的数组的指针。

第三个是名为arr的变量,它是指向int指针类型的长度为5的数组的指针。所以它是一个指向int指针的数组长度为5的指针。或者,指向第一种情况的指针!

想想如何在将来分析这样的事情,要认识到括号在这里具有最高优先级,所以让(*arr)首先是一个指针。然后数组表示法具有第二高的优先级,因此(*arr)[5]是指向长度为5的数组的指针...但是什么类型的数组?那么类型是最低优先级,所以最后。如果我们有int (*arr)[5],那么它是int(3)类型的数组长度为5(2)的指针(1st)。

我们可以看一下像这样的东西:int** (*arr)[7]它是一个名为arr(1)的指针,类型为int**的数组长度为7(2),或指针指针整数(3)。

至于想知道指针/数组如何在C ...中表示

指针和数组都是32位变量(如大多数系统上的整数),它们包含一个32位地址到内存位置(它们指向的位置)。数组显然指向数组的开头,所以*arr == arr[0]。虽然指针可以指向任何东西。当您声明一个数组(arr[5]arr[1000]等)时,它会生成一个名为arr的指针,并保留括号(5或1000)之间的任何空间。但是当您声明指针(*arr)时,它不会保留任何空格。否则,两种情况下的变量arr都只是一个指针。此外,如果您想要混淆,您甚至可以取消引用您的指针:pointer[0],而不是*pointer

作为最后一个注释示例,我们可以查看类似于:int * (*arr)[5][7]的内容,并分析它是什么以及编译器正在做什么:

首先,它是一个名为arr(1)的指针,数组长度为5(2),每个数组长度为7(3),但因为数组长度n只是指向保留位置的指针在内存中,所以实际上(2)是指针的数组长度5(指向大小为7的内存块)。最后,大小为7(3)的每个存储块都是int *(4)类型。

因此,它是一个指向长度为int *的数组的指针的数组长度为5的指针!

我希望这有帮助!我知道我玩C玩得很开心,看看有什么可能,不同的东西做了什么=)

答案 2 :(得分:0)

指针是另一个对象的地址。数组是一个连续的对象块。所以:

int *a[5];

a是一个包含int的5个指针的数组。这意味着a代表一个包含5个连续地址值的块,其中每个值都可以保存int的地址。

int (*b)[5];

b是指向5 int个数组的指针。这意味着b是单个地址值,其中该值可以包含5 int s的数组地址。

int *(*c)[5];

c是一个指向int的5个指针数组的指针。这意味着c是单个地址值,其中该值可以保存指向int的5个指针数组的地址。这可以保存第一个对象a的地址,因此c = &a;有效。

答案 3 :(得分:-1)

int *arr[5]是一个包含五个int*的数组 int (*arr)[5]是指向五个int的数组的指针 int *(*arr)[5]是指向int*

数组的指针

通常,一个人会创建一个typedef:

typedef int fiveintarray[5];

typedef int* intptr;
typedef intptr fiveintptrarray[5];

然后使用它:

fiveintarray array;  //array of five integers
fiveintarray* pointer_to_array; // pointer to array of five integers

fiveintptrarray array; //array of five pointers to integers
fiveintptrarray* pointer_to_array;  //pointer to array of five pointers to integers

答案 4 :(得分:-2)

  • int *arr[5] - >数组,长度为5,指向int
  • 的指针
  • int (*arr)[5] - >指向长度为5的int数组的指针
  • int *(*arr)[5] - >指向长度为5的int数组的指针