这里的 (int *) p 的用途是什么?

问题描述 投票:0回答:2

这里是 C 新手,今天我正在阅读一本书中有关指针和 2D 数组的内容,并且遇到了这个程序

#include <stdio.h>

int main() {
    int s[4][2] = {
        { 1234, 56 },
        { 1212, 33 },
        { 1434, 80 },
        { 1312, 78 }
    };

    int(*p)[2];
    int i, j, *pint;
    for (i = 0; i <= 3; i++) {
        p = &s[i];
        pint = (int*)p;
        printf("\n");
        for (j = 0; j <= 1; j++)
            printf("%d ", *(pint + j));
    }

    return 0;
}

我很想知道

(int *) p;
在这里的目的是什么。据我所知, p 是存储 2D 数组整个 i 行地址的指针,但我无法理解
(int *) p;
的用途并将其存储在变量
pint
中。

arrays c pointers
2个回答
0
投票

p
是一个指向 2 个整数数组的指针。将其转换为
int*
使其成为指向单个整数的指针,因此它指向数组中的第一个整数。它存储在
pint
变量中,声明为
int*

这允许您通过向

pint
添加偏移量来索引数组。在
printf()
调用中,
*(pint+j)
相当于
pint[j]
,因此内部循环会打印
s
行的每个元素。


-1
投票

这只是一个糟糕的代码。我相信作者根本不知道如何使用指向数组的指针,并试图沉默警告。

由于它是指向数组的指针,因此当您取消引用它时,您将获得数组。由于该数组用作右值,因此它可以指向数组的第一个元素。

您需要的一切都是取消引用。

    /* .... */
    int(*p)[2];
    int i, j, *pint;
    for (i = 0; i <= 3; i++) {
        p = &s[i];
        pint = *p;
    /* .... */

© www.soinside.com 2019 - 2024. All rights reserved.