本篇博客主要介绍一下C语言中数组的基本概念。
数组是一组相同类型元素的集合。数组的创建方式:type_t arr_name[const_n];
type_t:数组元素的类型。const_t:是一个常量表达式,用来指定数组的大小。数组创建的实例:
int arr1[10]; char arr2[10]; float arr3[10]; double arr4[10];由上图可以看出,int count = 10; int arr[count] = {0};是有问题的。 注意:数组创建,[]中要给一个常量才可以,不能使用变量。
数组的初始化是指,在创建数组的同时给数组的内容一些合理的初值(初始化)。
int arr1[10] = { 1, 2, 3 }; int arr2[] = { 1, 2, 3, 4 }; int arr3[5] = { 1, 2, 3, 4, 5 }; char arr4[3] = { 'a', 98, 'c' }; char arr5[] = { 'a', 'b', 'c' }; char arr6[] = "abcdef";数组在创建的时候如果不想指定数组的确定大小就得初始化。数组元素个数根据初始化的内容来确定。但是对于下面的代码要区分,内存中如何分配。
char arr1[] = "abc"; char arr2[] = {'a', 'b', 'c' };注意:arr1数组长度为4, arr2数组长度为3。
对于数组的使用我们之前介绍了一个操作符:[],下标引用操作符。它其实就是数组访问操作符。 代码演示:
#include <stdio.h> int main(){ int arr[10] = {0}; int sz = sizeof(arr) / sizeof(arr[0]); int i = 0; for(i = 0; i < 10; ++i){ arr[i] = i; } for(i = 0; i < 10; ++i){ printf("%d ", arr[i]); } printf("\n"); return 0; }总结:
数组是使用下标来访问的,下标是从0开始。数组的大小可以通过计算得到。 int arr[10]; int aSize = sizeof(arr) / sizeof(arr[0]);仔细观察结果,可以发现,随着数组下标的增长,元素的地址,也在有规律的递增。由此可以得出结论:数组在内存中是连续存放的。
往往我们在写代码的时候,会将数组作为参数传给函数,比如:实现一个冒泡排序函数将一个整型数组排序。 代码演示:
#include <stdio.h> void bubbleSort(int arr[]){ int bound, cur; int len = sizeof(arr) / sizeof(arr[0]); for(bound = 0; bound < len; ++bound){ for(cur = len - 1; cur > bound; --cur){ if(arr[cur] < arr[cur - 1]){ int temp = arr[cur]; arr[cur] = arr[cur - 1]; arr[cur - 1] = temp; } } } } int main(){ int i = 0; int arr[] = { 9, 5, 4, 7, 3, 0, 1, 6 }; bubbleSort(arr); for(i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i){ printf("%d ", arr[i]); } printf("\n"); return 0; }问题出在哪了呢?从结果我们可以看出来只有前两个数被排成了有序,所以我们将len的值打印一下。 可以看到,len的值为2,这又是为什么呢?那是因为数组作为参数的时候,不会把整个数组传递过去。其实警告中已经说的很明显了。 实际上只是将数组的首元素的地址传递过去了。所以即使在函数参数部分写成数组的形式:int arr[]表示的依然是一个指针int* arr。 结论:
数组传参,函数内部需要知道数组元素的个数。应该在函数外部计算出元素的个数,以参数的形式传进去。修改后的代码:
#include <stdio.h> void bubbleSort(int arr[], int len){ int bound, cur; for(bound = 0; bound < len; ++bound){ for(cur = len - 1; cur > bound; --cur){ if(arr[cur] < arr[cur - 1]){ int temp = arr[cur]; arr[cur] = arr[cur - 1]; arr[cur - 1] = temp; } } } } int main(){ int i = 0; int arr[] = { 9, 5, 4, 7, 3, 0, 1, 6 }; bubbleSort(arr, sizeof(arr) / sizeof(arr[0])); for(i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i){ printf("%d ", arr[i]); } printf("\n"); return 0; }二维数组的创建:
int arr[3][4]; char arr[3][4]; double arr[3][4];二维数组的初始化:
int arr[3][4] = {1, 2, 3, 4}; int arr[3][4] = {{1, 2}, {3, 4}}; int arr[][4] = {{2, 3}, {4, 5}};二维数组的使用也是通过下标的方式。 代码演示:
#include <stdio.h> #include <time.h> int randomNumber(){ return 1 + rand() % (9 - 1); } int main(){ srand((unsigned int)time(0)); int i, j; int arr[3][4] = {0}; for(i = 0; i < 3; ++i){ for(j = 0; j < 4; ++j){ arr[i][j] = randomNumber(); } } for(i = 0; i < 3; ++i){ for(j = 0; j < 4; ++j){ printf("%d ", arr[i][j]); } if(j % 4 == 0){ printf("\n"); } } return 0; }像一维数组一样,挨个打印二维数组中的每个元素。 代码演示:
#include <stdio.h> int main(){ int i, j; int arr[2][3] = {0}; for(i = 0; i < 2; ++i){ for(j = 0; j < 3; ++j){ printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]); } } return 0; }结论:二维数组在内存中也是连续存储的。
我们直接来看一个代码:
#include <stdio.h> void arrDisplay(int arr[3][4]) { for (int i = 0; i < 3; ++i) { for (int j = 0; j < 4; ++j) { printf("%-4d", arr[i][j]); } printf("\n"); } } int main() { int arr[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, }; arrDisplay(arr); return 0; }arrDisplay的参数列表,还有下面两种写法:
void arrDisplay(int arr[][4]); void arrDisplay(int (*arr)[4]);