数组:
相同数据类型的连续存储集合
int arr[10] = {1,2,3,4,5}
#include<stdio.h> #define PI 3.14 //预处理定义常量 PI int main(void) { int arr[10] = {0,1,2,3,4,5,6,7,8,9}; printf("arr[0] = %x \n", &arr[0]); // 内存地址用16进制表示所以用%x printf("arr[1] = %p \n", &arr[1]);// %p 专门打印内存地址(内存地址的格式化输出), 只不过这种方式高位会补0 printf("arr[2] = %p \n", &arr[2]); printf("arr[3] = %x \n", &arr[3]); return 0; }
arr[0] = 61fdf0
arr[1] = 000000000061FDF4
arr[2] = 000000000061FDF8
arr[3] = 61fdfc
说明数组里面各个元素的内存地址是连续的
#include<stdio.h> #define PI 3.14 //预处理定义常量 PI int main(void) { int arr[10] = {0,1,2,3,4,5,6,7,8,9}; printf("arr[0] = %x \n", &arr[0]); // 内存地址用16进制表示所以用%x, 取数组第一个元素的地址 printf("arr is %x",arr); //取数组的地址 return 0; } arr[0] = 61fdf0 arr is 61fdf0
数组名的地址, 就是数组第一个元素的地址
#include<stdio.h> #define PI 3.14 //预处理定义常量 PI int main(void) { int arr[10] = {0,1,2,3,4,5,6,7,8,9}; printf("the size of arr is %u\n",sizeof(arr));// sizeof 返回的是unsigned int 类型数据, 所以格式化输出用%u printf("the size of arr[0] is %u", sizeof(arr[0])); return 0; } the size of arr is 40 the size of arr[0] is 4
#include<stdio.h> #define PI 3.14 //预处理定义常量 PI int main(void) { int arr[10] = {0,1,2,3,4,5,6,7,8,9}; printf("the size of arr is %u\n",sizeof(arr));// sizeof 返回的是unsigned int 类型数据, 所以格式化输出用%u printf("the size of arr[0] is %u\n", sizeof(arr[0])); printf("数组个数是%d ", sizeof(arr)/sizeof(arr[0])); // 用数据大小除以每个元素的大小 return 0; } the size of arr is 40 the size of arr[0] is 4 数组个数是10
数组的初始化
剩余未初始化的值赋0值
练习; 逆序一个数组
#include<stdio.h> #define PI 3.14 //预处理定义常量 PI //练习 : 将数组{2,7,1,9,4,3,90,25} 逆序输出, 即{25,90,3,4,9,1,7,2} int main(void) { int arr[] = {2,7,1,9,4,3,90,25}; //打印逆序之前的数组 printf("逆序之前的数组是\n"); for (int i = 0; i < sizeof(arr)/sizeof(arr[0]) ; i++){ printf("%d , ",arr[i]); } printf("\n"); //进行逆序,基本思路就是第一个和最后一个交换位置, 第二个和倒数第二个交换位置, 定义前面index 变量为s, 定义后面的index 变量名字是 e int s = 0; int e = sizeof(arr) / sizeof(arr[0]) - 1; int temp; while (s < e){ //三杯水法, 用一个中间临时变量来存储另外一个待交换的值 temp = arr[s]; arr[s] = arr[e]; arr[e] = temp; s++; e--; } //打印逆序之前的数组 printf("逆序之后的数组是\n"); for (int k = 0; k < sizeof(arr)/sizeof(arr[0]) ; k++){ printf("%d,",arr[k]); } return 0; }
逆序之前的数组是
2 , 7 , 1 , 9 , 4 , 3 , 90 , 25 ,
逆序之后的数组是
25,90,3,4,9,1,7,2,
#include<stdio.h> #define PI 3.14 //预处理定义常量 PI //练习 : 将数组{2,7,1,9,4,3,90,25} 逆序输出, 即{25,90,3,4,9,1,7,2} int main(void) { // 多维数组 int arr[4][4] = {{1,2,3,4},{11,22,33,44},{111,222,333,444},{123,456,789,101}}; printf("整个数组的内存大小是,sizeof(arr) %u \n", sizeof(arr)); printf("行的个数是, %d \n", sizeof(arr)/ sizeof(arr[0])); printf("一个元素的占用内存大小是 sizeof(arr[0][0], %u \n", sizeof(arr[0][0])); printf("一行所占用的内存大小是sizeof(arr[0]) %u\n", sizeof(arr[0])); printf("列的个数是 %d \n", sizeof(arr[0])/sizeof(arr[0][0])); printf("数组的元素个数是 %d\n",sizeof(arr)/ sizeof(arr[0][0])); printf("输出多维数组的每个元素\n"); for ( int i = 0; i < sizeof(arr)/ sizeof(arr[0]) ; i++) { printf("这是第%d 行\n", i); for (int j = 0; j < sizeof(arr[0])/ sizeof(arr[0][0]) ; j++) { printf("%d\n", arr[i][j]); } } return 0; }
行的个数是, 4
一个元素的占用内存大小是 sizeof(arr[0][0], 4
一行所占用的内存大小是sizeof(arr[0]) 16
列的个数是 4
数组的元素个数是 16
输出多维数组的每个元素
这是第0 行
1
2
3
4
这是第1 行
11
22
33
44
这是第2 行
111
222
333
444
这是第3 行
123
456
789
101
数组的首地址 == 数组的首元素地址 == 数组的首行地址
二维数组的初始化
int arr[4][4] = {{1,2,3,4},{11,22,33,44},{111,222,333,444},{123,456,789,101}};
int arr[][] = {{1,2,3,4},{11,22,33,44},{111,222,333,444},{123,456,789,101}};#这种方式是不行的
int arr[4][4] = {{1,2,3,},{11,22,33,},{111,222,333,444}}; 未被初始化的数组为0
int arr[3][5] = {1,2,3,4,5} 系统自动分配行列
int arr[][4] = {1,3,4,5,6,7} 二维数组必须指定列数