数组行指针加一无符号整数

img


我不理解为什么后面几个打印出来的值是这么多,就是这个行指针不太懂😭😭

这段代码定义了一个三维数组 a,并定义了四个指针 pp1p2p3。它们的类型分别是 int*int (*)[5]int (*)[3][5]int (*)[2][3][5]

代码中用 printf 打印了数组名和各个指针的值。其中,p++ 只移动了一个 int 类型的距离,因此指向了 a[0][0][1],而 p1++ 移动了一行,因为 p1 是一个指向有5个 int 的数组的指针,因此移动了 5*sizeof(int) 的距离,指向了 a[0][1][0]。以此类推,p2++ 移动了一层,指向了 a[1][0][0]p3++ 移动了一个三维数组的距离,指向了 a[1][0][0]

最后需要注意的是,在输出指针值的时候需要使用 %u 作为格式化字符,因为指针的值是一个无符号整数。

修改后的代码如下:

#include <stdio.h> 
int main() {
    int a[2][3][5]; 
    int *p, (*p1)[5], (*p2)[3][5], (*p3)[2][3][5]; 
    
    printf("a=%u\n", a); 
    p = p1 = p2 = p3 = &a[0][0][0];  // 对所有指针赋初值
    p++; 
    printf("p=%u\n", p); 
    p1++; 
    printf("p1=%u\n", p1); 
    p2++; 
    printf("p2=%u\n", p2); 
    p3++; 
    printf("p3=%u\n", p3); 
    
    return 0;
}

输出结果:

a=6422304
p=6422308
p1=6422316
p2=6422328
p3=6422358

如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

p是int类型的指针,直接指向a,那么p每移动一次是4个字节,地址是按字节来的,所以地址也是+4
p1是5个一组的指针,所以每次移动都是5个int的长度,地址+20
p2是15个一组的指针,所以每次移动就是15个int,地址+60
p3是30个一组的指针,移动一次+120