*p [5]和(*p)[5]之间有什么区别?

Nee*_*ani 3 c pointers

在通过一个指针示例时,我遇到了一条线,它被*p[5]声明p一个由5个指针组成的数组,同时(*p)[5]声明p指向五个元素数组的指针.我不明白他们之间的区别.

有人可以用一个例子解释一下吗?

Ahm*_*mad 6

int (*p)[5]

被称为指向数组的指针(数组指针).我们可以声明一个指针,它可以指向整个数组,而不是只指向数组的一个元素.在讨论多维数组时,这个指针很有用.

在这个例子中,p是指向可以指向5个整数的数组的指针.

/*Pointer to an array*/
#include<stdio.h>
int main(void)
{
    int *ptr; /*can point to an integer*/
    int (*p)[5];/*can point to an array of 5 integers*/
    int arr[5];
    ptr=arr;/*points to 0th element of arr*/
    p=&arr;/*points to the whole array arr*/
    printf("ptr=%p,p=%p\n",ptr,p);
    ptr++;
    p++;
    printf("ptr=%p,p=%p\n",ptr,p);
    return 0;
}
Output: 
ptr=0012FEAC,p=0012FEAC
ptr=0012FEB0,P=0012FEC0
Run Code Online (Sandbox Code Playgroud)

这里ptr是指向数组arr的第0个元素的指针,而p是指向整个数组arr的指针.ptr的基本类型是int,而p的基类型是'5个整数的数组'.

我们知道指针算法是相对于基本大小执行的,所以如果我们写p ++那么指针将向前移动20个字节.

2.现在来*p[5]:

这称为指针数组(指针数组)

正确的语法是数据类型*arrayname [size];

我们可以声明一个包含指针作为其元素的数组.该数组的每个元素都是一个指针变量,它可以保存任何适当类型变量的地址.

/*Array of pointers*/
#include<stdio.h>
int main(void)
{
    int *p[5];
    int i,a=5,b=10,c=15;
    p[0]=&a;
    p[1]=&b;
    p[2]=&c;
    for(i=0;i<3;i++)
    {
        printf("p[%d]=%p\t",i,p[i]);
        printf("*p[%d]=%d\n",i,*p[i]);
    }
    return 0;
}
Output:
p[0]=0012FEB4   *p[0]=5
p[1]=0012FEA8   *p[1]=10
p[2]=0012FE9C   *p[2]=15
Run Code Online (Sandbox Code Playgroud)

我希望这个解释和例子能够清楚你的概念.

希望这有用:)