C语言-数组
本文最后更新于:1 年前
数组名
求数组长度,只能使用数组名,不能使用数组指针
C语言标准规定,当数组名作为数组定义的标识符(也就是定义或声明数组时)、sizeof 或 & 的操作数时,它才表示整个数组本身,在其他的表达式中,数组名会被转换为指向第 0 个元素的指针(地址)。
对数组名进行&操作,并不是取其地址,而是得到了指向整个数组的指针。也就是说,arr与&arr指向的是同一个地址,但是他们的类型不一样。arr相当于&arr[0],类型是int *,而&arr是指向整个数组的指针,类型是
int (*)[5]
数组名不可以自增(可以加减)
1
2int a[10]={0};
a++; //错误,数组名是指针型常量
初始化
数组只给部分元素赋值时,剩余元素会自动初始化为0
int nums[10] = {0};
相当于只给第一个元素赋0,剩余元素自动初始化为0了对于short、int、long,就是整数 0;
对于char,就是字符 ‘\0’;
对于float、double,就是小数 0.0
如给全部元素赋值,那么在定义数组时可以不给出数组长度
int nums[] = {1,2,3};
C99标准后可以指定下标进行初始化
1
2int a[10]={ [2]=12 };
int a[]={ [9]=11 }; //C99中长度可以自动推算
二维数组
- 二维数组的初始化可以按行分段赋值,也可按行连续赋值。
int a[5][3]={80, 75, 92, 61, 65, 71, 59, 63, 70, 85, 87, 90, 76, 77, 85};
- 如果对全部元素赋值,那么第一维的长度可以不给出
int a[][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
- 一个二维数组也可以分解为多个一维数组
二维数组a[3][4]
可分解为三个一维数组,它们的数组名分别为 a[0]、a[1]、a[2]
变长数组
- 普通数组(固定长度的数组)是在编译期间分配内存的,而变长数组是在运行期间分配内存的。(C99后才能使用变长数组)
- 变长数组仍是静态数组(一旦定义长度不能变化)
数组下标
- 对数组的引用
a[i]
在编译时总是被编译器改写成*(a+i)
的形式,因此两者是一样的 - 取下标操作符[ ]是建立在指针的基础上,它的作用是使一个指针和一个整数相加,产生出一个新的指针,然后从这个新指针(新地址)上取得数据
a[3] 等价于 *(a + 3),3[a] 等价于 *(3 + a)
- 使用下标时,编译器会自动把下标的步长调整到数组元素的大小