指针阵列和指针数组的指针之间的区别

Difference between pointer to pointer array and pointer array

本文关键字:指针 区别 之间 数组 阵列      更新时间:2023-10-16

在第一种情况下, int **pint *p2[5]之间有什么不同但是P2也指向一系列指针! int *p2[5]int p2[5];相同。因为在这两种情况下,P2都是指针!有什么区别?

int **p

这是指向int指针的指针。因此,p可以指向一个指针或一系列指针。反过来,*p可以指向一个intint的数组。p的恰好在其类型中没有表达。

int *p2[5]

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

在您陈述的问题中:

p2是一个指针。

该语句不正确。p2是一个数组,而不是指针。在某些情况下, p2可能 em> decay 到指针,但它本身不是指针。

请注意,如果您从变量p2开始,则可以将其分配给p

p = p2;

这是一个数组,p2,腐烂到指针。此时,您知道p指向int的指针数组。

但是,如果您只有int**类型的p,那么您不知道p点到数组。可能不是。换句话说,指针的类型无法完全描述它指向的指向。


您似乎对阵列和指针之间的区别感到非常困惑。他们不一样。阵列不是指针。阵列可以腐烂到指针。指针可以指向数组。

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

好的 - 我知道你在问什么。

当您拥有int arr[5]时,您可以将其施放为int*,它将指向数组中的第一个元素。例如;

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

将打印两个相等的值。

同样,

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

还将打印2个相等值。因此,p2p指向。

没有什么不同

但是,当您声明int* p2[5]时,您将为int分配5个指针的空间,而p2将其施放到指针时,将指向此数组的开始。

另一方面,int**p的声明没有这样的房间。它只是指向int指针的指针。它可能指向int s的数组,或者可能是int的指针。它甚至可能是int s的2-D阵列。

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必须是类型pointer to pointer to int的变量。

*p2[i]呢?现在我们必须知道优先级。下标高于间接标记,因此这是*(p2[i]),并且是int类型的变量。因此,p2[i]必须是pointer to int类型的变量,因此p2必须是类型array of pointer to int的变量。

有意义?

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

no int ** p是指向指针的指针,它可以成为记忆块的指针,其中包含指针到包含整数的内存块。

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