【发布时间】:2023-03-11 14:58:01
【问题描述】:
我在网上看到了这段代码。我只是不明白这里发生了什么。
#include <stdio.h>
#include <math.h>
main()
{
int arr [ ][3] = {{11,12,13}, {21,22,23},{31,32,33},{41,42,43},{51,52,53}};
int I , j ;
int *p , (*q) [3], *r ;
p = (int *) arr ;
q = arr;
r = (int *) q ;
printf (" %u %u %d %d %d %d \n ", p, q, *p, *(r), *(r+1), *(r+2));
p++ ;
q++ ;
r = (int *) q ;
printf (" %u %u %d %d %d %d \n ", p, q, *p, *(r), *(r+1), *(r+2));
}
我知道 p 和 r 是指针,q 是指向数组的指针,但是 p = (int *) arr 是什么意思;什么意思?这句话的目的是什么?
【问题讨论】:
-
p = (int *) arr;将数组地址转换为p。强制转换是必要的,因为它们具有不同的间接级别。 -
Arr 不是指针,它是一个值序列。实际上是一个二维数组。 P 设置为指向该数组的第一个元素(存储值的位置)。此代码允许您查看二维数组的值是如何存储在内存中的。
-
这就是我说“数组地址”的原因,但是当我删除强制转换时,我的 MSVC 编译器认为它是一个指针。
warning C4047: '=' : 'int *' differs in levels of indirection from 'int (*)[3]' -
@WeatherVane
arr在这种情况下衰减为一个指针,但它是指向int *的不兼容类型的指针