C语言需要掌握的基础知识点之数组
C语言需要掌握的基础知识点
C语言中的数组
数组是C语言中一种非常重要的数据结构,用于存储相同类型元素的集合。
以下是一些关于C语言数组的重要点:
声明数组:
类型 数组名[数组大小];
例如:int numbers[10];
- 初始化数组:
可以在声明时初始化数组,例如:
int numbers[5] = {1, 2, 3, 4, 5};
如果初始化列表中的元素个数小于数组大小,则剩余元素被初始化为0。
例如:int numbers[5] = {1, 2}; // 前两个元素为1和2,后面三个为0。
也可以不指定大小,编译器会根据初始化列表自动计算大小:
int numbers[] = {1, 2, 3, 4, 5}; // 数组大小为5。
- 访问数组元素:
通过索引访问,例如:numbers[0]表示第一个元素。
- 多维数组:
C语言支持多维数组,最常见的是二维数组,例如:
int matrix[3][3] = {{1,2,3}, {4,5,6}, {7,8,9}};
- 数组在内存中的存储:
数组在内存中是连续存储的。对于一维数组,元素按顺序存放。对于多维数组,按行优先顺序存放(第一行、第二行)。
- 数组名:
数组名代表数组首元素的地址。例如,对于数组int a[10];,a等同于&a[0]。
- 数组的长度:
可以使用sizeof运算符来计算数组的长度(以元素个数计):
int length = sizeof(numbers) / sizeof(numbers[0]);
- 数组作为函数参数:
当数组作为函数参数传递时,实际上传递的是数组首元素的地址(指针),因此函数内部无法通过sizeof来获取数组长度,通常需要将长度作为另一个参数传递。
- 注意事项:
数组索引从0开始,到数组大小减1结束。访问数组时不能越界,否则会导致未定义行为。
数组的大小必须是编译时常量(C99之前)或者可以使用变量长度数组(C99标准,但部分编译器可能不支持)。
数组的基本概念
定义:数组是一组相同类型数据的集合,这些数据在内存中连续存储,通过索引(下标)来访问各个元素。
数组的声明和初始化
一维数组
// 声明一个包含5个整数的数组
int numbers[5];// 声明并初始化
int numbers[5] = {1, 2, 3, 4, 5};// 自动确定数组大小
int numbers[] = {1, 2, 3, 4, 5}; // 编译器会自动计算大小为5// 部分初始化
int numbers[5] = {1, 2}; // 前两个元素为1和2,其余为0
多维数组
// 二维数组(矩阵)
int matrix[3][3] = {{1, 2, 3},{4, 5, 6},{7, 8, 9}
};// 三维数组
int cube[2][2][2] = {{{1, 2}, {3, 4}},{{5, 6}, {7, 8}}
};
数组的操作
访问数组元素
int arr[5] = {10, 20, 30, 40, 50};// 访问单个元素
printf("第一个元素: %d\n", arr[0]); // 输出: 10
printf("第三个元素: %d\n", arr[2]); // 输出: 30// 修改数组元素
arr[1] = 25; // 将第二个元素改为25
遍历数组
#include <stdio.h>int main()
{int arr[5] = {1,2,3,4,5};for(int i = 0;i < sizeof(arr)/sizeof(arr[0]);i++){printf("arr[%d] = %d\n",i,arr[i]);}printf("Hello World!\n");return 0;
}
数组作为函数参数
传递数组给函数
#include <stdio.h>//函数接受数组作为参数
void printArray(int arr[],int size)
{for(int i = 0;i < size;i++){printf("arr[%d] = %d ",i,arr[i]);}printf("\n");
}int main()
{int arr[5] = {1,2,3,4,5};printArray(arr,5);printf("Hello World!\n");return 0;
}
字符数组(字符串)
在C语言中,字符串通常用字符数组表示:
#include <stdio.h>
#include <string.h>int main()
{//字符数组表述字符串char str1[10] = "hello";char str2[] = "world";printf("字符串1:%s\n",str1);printf("字符串2:%s\n",str2);printf("Hello World!\n");return 0;
}
动态内存分配与数组
#include <stdio.h>
#include <string.h>int main()
{int size;printf("请输入数组大小:");scanf("%d",&size);//动态分配数组int *dynamicArray = (int *)malloc(size *sizeof(int));if(dynamicArray == NULL){printf("内存分配失败");return 1;}//使用动态数组for(int i = 0;i < size;i++){dynamicArray[i] = i*10;}//打印数组for(int i = 0;i < size;i++){printf("dynamicArray[%d] = %d\n",i,dynamicArray[i]);}//释放内存free(dynamicArray);printf("Hello World!\n");return 0;
}
示例:数组排序
#include <stdio.h>//冒泡排序
void bubbleSort(int arr[],int size)
{for(int i = 0;i < size - 1;i++){for(int j = 0;j < size - i - 1;j++){if(arr[j] > arr[j + 1]){int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}
}int main()
{int numbers[] = {63,43,25,12,22,11,90};int size = sizeof(numbers)/sizeof(numbers[0]);printf("排序前:");for(int i = 0;i < size;i++){printf("%d ",numbers[i]);}printf("\n");bubbleSort(numbers,size);printf("排序后:");for(int i = 0;i < size;i++){printf("%d ",numbers[i]);}printf("\n");printf("Hello World!\n");return 0;
}