#include <stdio.h>
int main(){
int a[3][4] = { 0 };
printf("%d\n",sizeof(a));//48 = 3*4*sizeof(int)
printf("%d\n",sizeof(a[0][0]));//4
printf("%d\n",sizeof(a[0]));//16
printf("%d\n",sizeof(a[0]+1));//4(表示的是第一行的第二个元素的地址)
printf("%d\n",sizeof(*(a[0]+1)));//4(表示第一行第二个元素)
printf("%d\n",sizeof(a+1)); //4(表示第二行的地址)地址就是4
printf("%d\n",sizeof(*(a+1)));//16
printf("%d\n",sizeof(&a[0]+1));//4(表示第二行的地址)
printf("%d\n",sizeof(*(&a[0]+1)));//16
printf("%d\n",sizeof(*a));//16(表示第一行)
printf("%d\n",sizeof(a[3]));//16
return 0;
}
输出结果:
48
4
16
8
4
8
16
8
16
16
16
二:
#include <stdio.h>
int main(){
int a[4] = {1,2,3,4};
int* ptr1 = (int*)(&a+1);
int* ptr2 = (int*)((int)a+1);//a的首元素地址加1,就是int+1,就差一个字节
printf("%x %x",ptr1[-1],*ptr2);//%x是以16进制形式进行打印
//ptr1[-1]=*(ptr1+(-1))=*(ptr1-1)
return 0;
}
输出:
4 2000000
三:
int main(){
int a[3][2] = {(0,1),(2,3),(4,5)};//逗号表达式,所以是{1,3,5}放入数组
int *p;
p = a[0];//把第一行的首元素地址放入p
printf("%d",p[0]);//p[0] = *(p+0)
return 0;
}
输出:
1
四:
#include <stdio.h>
int main(){
int a[5][5];
int (*p)[4];
p = a;//二维数组a表示第一行地址
printf("%p %d\n",&p[4][2] - &a[4][2],&p[4][2] - &a[4][2]);
//p[4][2] = *(*(p+4)+2)
//指针减指针得到的是两个指针之间的元素个数
//%p是指针的输出转换符
return 0;
}
输出:
fffffffffffffffc -4
五:
#include <stdio.h>
int main(){
int a[2][5] = {1,2,3,4,5,6,7,8,9,10};
int *ptr1 = (int*)(&a+1);//取出二维数组地址加一
int *ptr2 = (int*)(*(a+1));//*(a+1) = a[1]
printf("%d %d",*(ptr1-1),*(ptr2-1));
return 0;
}
输出:
10 5