C/C+++结构体和多维数组的理解,希望大家批评指正。
结构体:其实就可可以看做是一个普通类型(int),做函数参数时,也是值得传递。
多维数组的数组名和&数组名理解:
一维数组: 数组名 数组的首元素首地址 ,&数组名 整个数组的首地址
多维数组: 数组名 一维数组的首地址 ,&数组名 整个数组的首地址
证明如下:
一维数组: 数组名 数组的首元素首地址 ,&数组名 整个数组的首地址
int main(int argc, char *argv[]) { int arr1[2]; printf("arr1:%d arr1+1:%d\n",arr1,arr1+1); printf("&arr1:%d &arr1+1:%d\n",&arr1,&arr1+1); }
输出:
arr1:2686784 arr1+1:2686788 相差:4字节
&arr1:2686784 &arr1+1:2686792 相差:8字节=2*4
二维数组: 数组名 一维数组的首地址 ,&数组名 整个数组的首地址
int main(int argc, char *argv[]) { int arr1[2][3]; printf("arr1:%d arr1+1:%d\n",arr1,arr1+1); printf("&arr1:%d &arr1+1:%d\n",&arr1,&arr1+1); }
输出:
arr1:2686752 arr1+1:2686764 相差:12字节=3*4
&arr1:2686752 &arr1+1:2686776 相差:24字节=2*3*4
三维数组: 数组名 一维数组的首地址(包含后面的二维和三维数组) ,&数组名 整个数组的首地址
int main(int argc, char *argv[]) { int arr1[2][3][4]; printf("arr1:%d arr1+1:%d\n",arr1,arr1+1); printf("&arr1:%d &arr1+1:%d\n",&arr1,&arr1+1); }
输出:
arr1:2686688 arr1+1:2686736 相差:48字节=3*4*4
&arr1:2686688 &arr1+1:2686784 相差:96字节=2*3*4*4
四维数组: 数组名 一维数组的首地址(包含后面的二维、三维和四维数组) ,&数组名 整个数组的首地址
int main(int argc, char *argv[]) { int arr1[2][3][4][5]; printf("arr1:%d arr1+1:%d\n",arr1,arr1+1); printf("&arr1:%d &arr1+1:%d\n",&arr1,&arr1+1); }
输出:
arr1:2686304 arr1+1:2686544 相差:240字节=3*4*5*4
&arr1:2686304 &arr1+1:2686784 相差:480字节=2*3*4*5*4
N维数组: 数组名 一维数组的首地址(包含后面的二维、三维......N-1维数组) ,&数组名 整个数组的首地址
数组参数等效的指针参数理解:
数组参数 等效的指针参数
一维数组 char a[30] 指针:char *a
指针数组 char *a[30] 指针的指针:char **a
二维数组char a[10][30] 数组的指针:char (*a)[30]
数据类型 * 指针名 其实就是告诉编译器,这个指针指向一个什么数据类型的内存,在对指针操作时,可以知道其指向的内存占用多少内存,但是指针本身是4个字节(sizeof)。