1.3 数组的使用
二维数组的使用也是通过下标的方式:
#include<stdio.h> int main() { int arr[4][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7},{5,6,7,8,9} }; printf("%d\n", arr[2][3]);//6 return 0; }
🍤实例:
#include<stdio.h> int main() { int arr[4][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7},{5,6,7,8,9} }; int i ;//用i控制行,下标是0-3 for (i = 0; i < 4; i++)//外循环控制行 { int j ;//j控制列,下标是0-4 for (j = 0; j < 5; j++)//内循环控制列 { printf("%d ", arr[i][j]);//输出整个数组 } printf("\n");//每行打印完后,换行 } return 0; }
1.4 数组在内存中的存储
像一维数组一样,这里我们尝试打印二维数组的每个元素:
#include<stdio.h> int main() { int arr[3][4] = { 0 }; int i = 0; for (i = 0; i < 3; i++) { int j = 0; for (j = 0; j < 4; j++) { printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]); } } return 0; }
运行结果:
可以发现:二维数组在内存中也是连续存储的
3. 数组越界
数组的下标是有范围限制的。
数组的下标规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。
数组的下标如果小于0,或者大于n-1,就是数组越界访问了。
比如这段代码:
#include <stdio.h> int main() { int arr[10] = {1,2,3,4,5,6,7,8,9,10}; int i = 0; for(i=0; i<=10; i++) { printf("%d\n", arr[i]);//当i等于10的时候,越界访问了 } return 0; }
🍩二维数组的行和列也可能存在越界。
4. 数组作为函数参数
在写代码的时候,需要将数组作为参数传给函数。
比如:实现一个冒泡排序函数将一个整形数组排序。
冒泡排序:依次比较两个相邻的元素的大小,按照升序或降序排列,重复的比较,直到所有元素排列完成。
代码实现:
//升序排列 void bubble_sort(int* arr, int sz)//这里的arr的本质是指针 { int i = 0; for (i = 0; i < sz - 1; i++)//数组下标范围:0-sz-1, { int j = 0; int flag = 1;//假设已经是有序数组 //进行比较 for (j = 0; j < sz - 1 - i; j++) { if (arr[j] > arr[j + 1]) { //交换 int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; flag = 0; } } if (flag == 1) break; } } int main() { int arr[10] = { 0 }; int i ; int sz = sizeof(arr) / sizeof(arr[0]);//计算数组大小 for (i = 0; i < sz; i++) { scanf("%d", &arr[i]);//输入 } //arr作为数组进行了传参 bubble_sort(arr, sz);//arr 是数组首元素的地址,传递的是首元素的地址 for (i = 0; i < sz; i++) { printf("%d ", arr[i]);//输出排好序的数组元素 } return 0; }
当数组传参的时候,实际上只是把数组的首元素的地址传递过去了。
所以即使在函数参数部分写成数组的形式: int arr[] ,其表示的依然是一个指针: int *arr 。
4.1 数组名你用对了吗?
先看一段代码:
//%p--打印地址 int main() { int arr[10] = { 1,2,3}; printf("%p\n", arr);//首元素地址--arr[0] printf("%p\n", arr+1);//arr[1] printf("%p\n", &arr[0]);//首元素取地址 printf("%p\n", &arr[0]+1);//arr[1] printf("%p\n", &arr);//数组的地址,是从首元素地址开始的 printf("%p\n", &arr+1);//数组+1,跳过整个数组 printf("%d\n", sizeof(arr));//整个数组所占内存空间大小 return 0; }
运行结果:
🍩数组名通常情况下就是数组首元素的地址。
但是有2个例外:
🍥 sizeof(数组名),数组名单独放在sizeof()内部,这里的数组名表示整个数组,计算的是整个数组的大小
🍥 &数组名,这里的数组名也表示整个数组,这里取出的是整个数组的地址
除此之外所有遇到的数组名都表示数组首元素的地址