三维数组地址及地址上值的解惑
#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]