c - *p[5] 和 (*p)[5] 有什么区别?

标签 c pointers

在查看指针示例时,我遇到了一行 *p[5]p 声明为 5 个指针的数组(*p)[5]p 声明为 指向五个元素数组的指针。我不明白它们之间的区别。

谁能举个例子解释一下?

最佳答案

<强>1。 int (*p)[5]

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

在这个例子中,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

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

我们知道指针运算是相对于基址大小进行的,所以如果我们写p++那么指针就会向前移动20个字节。

<强>2。现在进入 *p[5]:

这叫做指针数组(Pointer Array)

正确的语法是数据类型 *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

我希望这个解释连同示例可以让您理清概念。

希望这对您有所帮助:)

关于c - *p[5] 和 (*p)[5] 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45388011/

相关文章:

c - fgets 将字符串添加到另一个变量

c - 不按唯一键搜索哈希表

C++ 创建双向链接类

c++ - 使用指向映射的指针从其键访问映射的值

c - 在 C 中使用 do while 循环时遇到问题

c - MPI_Barrier 似乎不起作用,重新排序 printf (stdout) 消息

c - C中ListNode中的指针

c++ - 需要建议

pointers - Golang 指针作为方法参数

c - C 中的各种函数进行隐式转换?