这里是 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
中。
p
是一个指向 2 个整数数组的指针。将其转换为 int*
使其成为指向单个整数的指针,因此它指向数组中的第一个整数。它存储在 pint
变量中,声明为 int*
。
这允许您通过向
pint
添加偏移量来索引数组。在 printf()
调用中,*(pint+j)
相当于 pint[j]
,因此内部循环会打印 s
行的每个元素。
这只是一个糟糕的代码。我相信作者根本不知道如何使用指向数组的指针,并试图沉默警告。
由于它是指向数组的指针,因此当您取消引用它时,您将获得数组。由于该数组用作右值,因此它可以指向数组的第一个元素。
您需要的一切都是取消引用。
/* .... */
int(*p)[2];
int i, j, *pint;
for (i = 0; i <= 3; i++) {
p = &s[i];
pint = *p;
/* .... */