komodo 发表于 2020-8-29 15:45:27

三维数组地址及地址上值的解惑

#include<stdio.h>
int main(void){
    int a = 1;
    int b = 4;
    int c = 33;
    int *x = &a;
    int *y = &b;
    int *z = &c;
    int **k[] = {&x, &y, &z};

    printf("k    = %p\n", k); //等于数组k的首元素的地址
    printf("&k   = %p\n", &k);//和k的值相同,但是含义不同
    printf("k+1= %p\n", k+1);//数组k含有的3个元素都是指针类型,即char *,所以k+1相当于k向右移动sizeof(char *)个位置,即数组k中第二个元素所在的地址
    printf("&k+1 = %p\n", &k+1);//k和&k的值虽然相同,但是&k相当于数组k的首地址,所以&k+1相当于向右移动3*sizeof(char *)个位置
    printf("\n");
    // 以下打印数组k第二个元素所在的地址
    printf("k+1   = %p\n", k+1);
    printf("&k = %p\n", &k);
    printf("\n");
    // 以下打印数组k第二个元素的值,即指针y所在的地址
    printf("k   = %p\n", k);
    printf("*(k+1) = %p\n", *(k+1));
    printf("&y   = %p\n", &y);
    printf("\n");
    // 以下打印数组k第二个元素的值的值,即y的值,即b所在的地址
    printf("*k   = %p\n", *k);
    printf("k = %p\n", k);
    printf("**(k+1) = %p\n", **(k+1));
    printf("y       = %p\n", y);
    printf("&b      = %p\n", &b);
    printf("\n");
    // 以下打印数组k第二个元素的值的值的值,即y指向的值,即b
    printf("**k       = %d\n", **k);
    printf("k   = %d\n", k);
    printf("***(k+1)   = %d\n", ***(k+1));
    printf("*y         = %d\n", *y);
    printf("b            = %d\n", b);
    return 0;
}
运行结果
k    = 0x7ffee83ac690
&k   = 0x7ffee83ac690
k+1= 0x7ffee83ac698
&k+1 = 0x7ffee83ac6a8

k+1   = 0x7ffee83ac698
&k = 0x7ffee83ac698

k   = 0x7ffee83ac670
*(k+1) = 0x7ffee83ac670
&y   = 0x7ffee83ac670

*k   = 0x7ffee83ac684
k = 0x7ffee83ac684
**(k+1) = 0x7ffee83ac684
y       = 0x7ffee83ac684
&b      = 0x7ffee83ac684

**k       = 4
k   = 4
***(k+1)   = 4
*y         = 4
b            = 4
页: [1]
查看完整版本: 三维数组地址及地址上值的解惑