指向指针数组和指针数组的指针之间的区别

时间:2014-01-22 13:44:43

标签: c++ c

第一种情况下int **pint *p2[5]之间的区别是什么p是指向我将在稍后定义的数组的指针的指针! 但是p2也指向指针数组!!!! int *p2[5]int p2[5];相同。 因为在这两种情况下p2都是指针! 有什么区别?

4 个答案:

答案 0 :(得分:6)

int **p

这是指向int指针的指针。所以p可以指向单个指针或指针数组。反过来*p可以指向单个intint数组。 p背后的确切内容并未在其类型中表达。

int *p2[5]

这是一个长度为5的数组,指向int的指针。这里,p2是一个长度为5的数组。毫无疑问。但是p2[i]呢?它们可以是指向单个int的指针,也可以是指向数组的指针。同样,该类型中不存在该信息。

在你提出的问题中:

  

p2是指针。

该陈述不正确。 p2是一个数组,而不是指针。在某些情况下,p2可能衰减指针,但它本身并不是指针。

请注意,如果您从变量p2开始,那么您可以将其分配给p,如下所示:

p = p2;

这是一个数组,p2,衰减为指针。此时您知道p指向指向int的指针数组。

但是,如果您拥有的p类型为int**,则您不知道p指向数组。它可能不会。换句话说,指针的类型并不能完全描述它所指向的内容。


你似乎对数组和指针之间的区别感到很困惑。他们不一样。数组不是指针。数组可以衰减为指针。指针可以指向数组。

也许关键的区别在于数组总是引用相同的变量。另一方面,可以使指针指向不同的变量。另一个明显的区别是数组变量定义了存储。另一方面,定义指针变量则不然。您必须始终将指针指定给其他对象的地址。

答案 1 :(得分:2)

好的 - 我明白你在问什么。

当你有int arr[5]时,你可以将它作为int*投射,它将指向数组中的第一个元素。例如;

int arr[5];
printf("%p == %p\n", &(arr[0]), (int*)arr);

将打印两个相等的值。

类似地,

int *p2[5];
int **p=(int**)p2;
printf("%p == %p\n", &(p2[0]), p);

还将打印2个相等的值。因此,p2p指向的内容没有区别。

但是,当您声明int* p2[5]时,您为5个指针分配空间intp2将指向此数组的开头,当您将其转换为指针时。

另一方面,int**p的声明没有保留这样的空间。它只是指向int指针的指针。它可能指向int s的数组,或者它可能是指向int的指针数组。它甚至可能是int s的二维数组。

答案 2 :(得分:2)

  

int **pint *p2[5]之间的区别是什么?

考虑这一点的方法是:int **p表示表达式**pint类型的变量。也就是说,你可以说**p = 123。同样,int *p2[5];表示表达式*p2[i]int类型的变量;你可以说*p2[i] = 123;

现在您知道了,您可以推断出p的含义。如果**pint类型的变量,则*p必须是pointer to int类型的变量,因此p必须是{{1}类型的变量}}

pointer to pointer to int怎么样?现在我们必须知道优先权。下标的优先级高于间接,因此它是*p2[i],它是*(p2[i])类型的变量。因此,int必须是p2[i]类型的变量,因此pointer to int必须是p2类型的变量。

有意义吗?

答案 3 :(得分:0)

  

在第一种情况下,p是指向数组的指针

No int ** p是指向指针的指针,它可以成为指向内存块的指针,包含指向包含整数的内存块的指针。

int * p2 [5],是的,这是五个指针的数组。