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

时间:2017-07-29 10:13:00

标签: c pointers

在浏览指针的示例时,我遇到了一行*p[5]声明p一个包含5个指针的数组(*p)[5]声明p 1}}作为一个指向五个元素数组的指针。我不明白他们之间的区别。

有人能用一个例子来解释吗?

4 个答案:

答案 0 :(得分:5)

<强> 1。 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

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

我们知道指针算法是相对于基本大小执行的,所以如果我们写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

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

希望这有用:)

答案 1 :(得分:1)

评估顺序不同。 *p[3]解析为*(p[3]),但不是(*p)[3]。另请注意,*p相当于p[0]。因此,......

  • *p[3]*(p[3])(p[3])[0]p[3][0]
  • (*p)[3](p[0])[3]p[0][3]

假设你有一个数组数组,差异如下所示:

visualisation

答案 2 :(得分:0)

指针就像粘滞便笺;你在它上面写下实际物体的位置。

阵列是具有相同隔间的盒子。它可以存储相同类型的对象。

你有三个球。

三个指针的数组是一个包含三个贴纸的框。每个贴纸都会告诉每个球的位置(它们可能不在同一个地方)。

指向三个元素数组的指针是一个便笺,告诉在哪里找到该框。该框包含所有树球。

答案 3 :(得分:0)

让我们看看这有助于简而言之,假设int *p[3]

1) int *p1 = &i; int *p2 = &j; int *p3 = &k;

int *p[3]

而不是上面3个单独的指针,我可以有一个指针数组i,j, and k。数组中的每个元素都可以指向ints,所有元素都是int (*p)[3]

2)int array[3];

array

如果我想要一个指向此int (*p)[3]的指针,该指针有3个元素,则指针声明将为import java.awt.*; import java.awt.event.*; import javax.imageio.* import java.awt.image.*; BufferedImage im, bi, bi2; Graphics2D gfx; int imWidth, imHeight, dstWidth, dstHeight; int DESIRED_WIDTH = 500, DESIRED_HEIGHT = 500; im = ImageIO.read(new File(filePath)); imWidth = im.getWidth(null); imHeight = im.getHeight(null); dstWidth = DESIRED_WIDTH; dstHeight = (dstWidth * imHeight) / imWidth; bi = new BufferedImage(dstWidth, dstHeight, im.getType()); gfx = bi.createGraphics(); gfx.drawImage(im, 0, 0, dstWidth, dstHeight, 0, 0, imWidth, imHeight, null); bi2 = new BufferedImage(DESIRED_WIDTH, DESIRED_HEIGHT, im.getType()); gfx = bi2.createGraphics(); gfx.drawImage(bi, 0, 0, DESIRED_WIDTH, DESIRED_HEIGHT, null); ImageIO.write(bi2, "jpg", new File(filePath)); 。这是一个指向数组的指针