使用(* ptr)[5]代替* ptr的目的是什么?

时间:2019-01-20 13:32:12

标签: c pointers

我读到有关(* ptr)[5]的内容,它可以指向5个元素的整数数组。这是什么意思?

2 个答案:

答案 0 :(得分:0)

当您要遍历二维或更高维数组时可以使用它。

例如,您具有以下二维数组:

int a[3][4] = {
        1,2,3,4,
        5,6,7,8,
        9,0,1,6
    };

常规*ptr将遍历数组中的每个元素。 如果此数组的基址为:1000。那么它将递增的下一个地址将为1002、1004、1006。取sizeof(int) => 2。

(*ptr)[5]要做的是跳到下一个第5个元素,然后指向它。

在上面的示例中,如果我要跳转到其中每个1-d数组的开头,则只需使用(*q)[4]并跳转到下一个第4个元素,而不是下一个

因此,如果要显示此数组的元素,可以通过两种方式执行此操作:

  1. 使用常规* ptr

    void display(int * q,int row,int col){

    int i, j;
    for(i=0; i<row; i++){
        for(j=0; j<col; j++){
            printf("%d ", *(q + i*col + j));
        }
        printf("\n");
    }
    

    }

  2. 使用(* ptr)[4]

void show(int (*q)[4], int r, int col){

int i, j, *p;

for(i=0; i<r; i++){
    p = q+i;
    for(j=0; j<col; j++){
        printf("%d ", *(p+j));
    }
    printf("\n");
}

}

答案 1 :(得分:-1)

int(* q)[5]表示q是指向5个整数的数组的指针。为了更好地理解,让我们使用此指针指向5个整数的数组。

void main()
{
 int a[][5] = {
               1,2,3,4,5,
               6,7,8,9,10,
               11,12,13,14,15
              };
 int *p;
 int (*q)[5];
 p = *a;

 printf("%d %d\n",p,q);
 p++;
 q++;
 printf("%d %d\n",p,q);
}

输出:

65500 65500

65502 65510

首先,p和q包含相同的地址65500。但是,在递增p时,它指向5个整数的数组。因此,递增p时,它指向下一个整数, 而q开始指向5个整数的下一个一维数组。将2D数组传递给函数时,指向数组的指针非常有用。