第一种情况下int **p
和int *p2[5]
之间的区别是什么p是指向我将在稍后定义的数组的指针的指针!
但是p2也指向指针数组!!!!
int *p2[5]
与int p2[5];
相同。
因为在这两种情况下p2都是指针!
有什么区别?
答案 0 :(得分:6)
int **p
这是指向int
指针的指针。所以p
可以指向单个指针或指针数组。反过来*p
可以指向单个int
或int
数组。 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个相等的值。因此,p2
和p
指向的内容没有区别。
但是,当您声明int* p2[5]
时,您为5个指针分配空间int
而p2
将指向此数组的开头,当您将其转换为指针时。
另一方面,int**p
的声明没有保留这样的空间。它只是指向int
指针的指针。它可能指向int
s的数组,或者它可能是指向int
的指针数组。它甚至可能是int
s的二维数组。
答案 2 :(得分:2)
int **p
和int *p2[5]
之间的区别是什么?
考虑这一点的方法是:int **p
表示表达式**p
是int
类型的变量。也就是说,你可以说**p = 123
。同样,int *p2[5];
表示表达式*p2[i]
是int
类型的变量;你可以说*p2[i] = 123;
。
现在您知道了,您可以推断出p
的含义。如果**p
是int
类型的变量,则*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],是的,这是五个指针的数组。