1、一维数组
①创建:int arr[5] = {0};,其中5的位置只能放 字面常量 或者 #define定义的常量标识符
②初始化:
不完全初始化int arr[5]={1,2};其余未初始化的默认为0(还剩三个)
char arr[5]={‘a','b’};其余未初始化的默认为0(还剩三个)
char arr[5]={‘a',98};其余未初始化的默认为0(还剩三个),与上者相同
char arr[5]="ab";其余未初始化的默认为0(还剩两个),此时有一个位置用来存放\0,最多只能存放4个字符,存放5个会出现越界访问
③打印
打印每一个的值,只能用循环挨个打印printf("%d",arr[i]);
打印每一个的地址,printf("%p",&arr[i]);,且数组在内存中是连续存放的,所以若是char类型的数组,地址之间差距为1,若为int型则差值为4
2、二维数组
①创建:int arr[3][4] = {0};
int arr[][4] = {0};,行可以省略,但是列不可以省略
②初始化:int arr[3][4] = {1,2,3,4,5};,其余未初始化的默认为0
int arr[3][4] = {{1,2,3},{4,5}};,其余未初始化的默认为0
③打印:
打印每一个的值,只能用两层循环挨个打印printf("%d",arr[i][j]);
打印每一个的地址,printf("%p",&arr[i][j]);,二维数组在内存中依然是连续存放的
3、strlen和sizeof的使用区别
①求字符串长度---strlen(arr);,所求的是\0之前的字符个数,且只能求字符串长度,头文件是string.h
②变量、数组、类型的内存容量度量---sizeof(arr);,包含\0在内
4、一维数组中的难疑点(数组名默认为arr)
①&arr == &arr[0],但是意义不同,
&arr代表的整个数组,&arr+1直接跳过整个数组
②arr == &arr[0],都是首元素地址;所以*arr == arr[0]
③arr+1 == &arr[0]+1,代表的都是arr[1]的地址
5、二维数组中的难疑点(数组名默认为arr)
①&arr == arr == &arr[0] == arr[0],但是意义不同
&arr代表着整个数组,&arr+1直接跳过整个二维数组
②arr == &arr[0] == arr[0],但是意义不同
&arr[0]代表着整行数组,&arr[0]+1会直接跳转到下一行(&arr[1]),而且想要输出本行首元素要**(&arr[0])
arr代表首行地址,arr+1会直接跳转到下一行,基本等同于&arr[0],输出时同样要**(arr)才能输出首元素
arr[0]代表的是本行首元素地址,arr[0]+1代表的是本行第二个元素地址(&arr[0][1]),输出时要*(arr[0])即可
③*(arr+1) == *(&arr[0]+1) == arr[1]
*(arr[0]+1) == *(arr[0][1]) == 具体数值
6、只有sizeof(arr)中的arr代表着整个数组的大小,其余之外的都是首元素地址或者首行地址
7、两个数组数值交换
只能采用arr[i]=arr[j],再加个temp中间变量挨个交换的办法
标签:初始化,arr,int,默认,地址,数组 From: https://blog.51cto.com/u_13606048/6149651