在数组上下文中,int * p和int(* p)[]有什么区别?

时间:2018-09-01 09:16:57

标签: c pointers

在Windows 8上将DevCpp与TDM GCC 4.9.2结合使用,但是我认为平台对这个问题并不重要。

我知道我们可以使用一个指针来指向单个数据或数据数组。 我了解了数组的指针,但从未使用过。一个相对于另一个有什么优势?

示例代码...

#include <stdio.h>
int main()
{
    int x[2]={10,20};
    int *p1= NULL; //simple pointer
    int (*p2)[] = NULL; //pointer to an array, specifically

    p1 = x;
    p2 = &x; //removing the & gives me a warning of "assignment from incompatible pointer types".

    printf("x[1] = %d\n", x[1]);

    *(p1+1) = 7;

    printf("x[1] = %d\n", x[1]);

    (*p2)[1] = 55;

    printf("x[1] = %d", x[1]);

    return 0;
}

p1或p2相对于另一个有优势吗?

2 个答案:

答案 0 :(得分:3)

它们是完全不同的。

int *p;-是指向int的指针

int (*p)[1];是指向数组的指针(在这种情况下,仅一个元素)

在您的简单示例中,指针算法将相同,并且生成的代码将相同。但是它们仍然具有不同的类型,编译时您可能会收到警告。

当示例变得不那么琐碎时,您将看到的“优点”:

int (*p)[100];

p++;指针将指向接下来的100个int数组。

答案 1 :(得分:2)

指向数组的指针表示接受数组地址的指针。 假设数组是int arr [5],其中int的大小为4个字节。 p是指向接受int数组地址的数组的指针。

int arr[5];
int (*p)[5];
p=&arr;//address of an array block
假设基地址是1000,那么在p递增后,由于数组块的大小为20个字节,它将导致我们到达1020地址。      p指向1000个地址

p++;
//Now p points to 1020 not 1004.

对于int * q,q照常指向1004。