C语言学习随笔-12 数组
数组:- 在程序设计中,为了方便处理数据吧具有相同类型的若干变量按有序形式组织起来称为数组。
- 数组就是在内存中连续的相同类型的变量空间。
- 同一个数组所有的成员都是相同的数据类型,同时所有的成员在内存中的地址是连续的。
1、一维数组的定义和使用
● 数组名符合标识符的书写规定(数字、英文字母、下划线)。
● 数组名不能与其它变量名相同,同一作用域内时唯一的。
● 方括号[ ]中常量表达式表示数组元素的个数。
如:int a[3]表示数组a有三个元素。
其下标从0开始计算,因此三个分别为a[0]、a[1]、a[2]
● 定义数组时[ ]内最好是常量,使用数组时[ ]内即可是常量,也可是变量。
1.1 数组定义:数据类型 数组名[元素个数] = {值1,值2,值3...};
int arr[10] = {6,1,4,7,3,2,9,0,5,8};//定义一个数组,同时初始化所有成员变量
int arr[10] = {1,2,3};//初始化前三个成员变量,后面所有元素都设置为0
int arr[10] = {0};//所有的元素都设置为0
// []中不定义元素个数,定义时必须初始化
int arr[5] = {1,2,3,4,5};//定义了一个数组,有5个元素
1.2 使用数组下标访问数组元素 数组名[下标],数组下标是从0开始到数组元素个数-1
printf("%d\n", arr[0]); printf("%d\n", arr[1]); printf("%d\n", arr[2]); printf("%d\n", arr[3]); printf("%d\n", arr[4]); printf("%d\n", arr[5]); printf("%d\n", arr[6]); printf("%d\n", arr[7]); printf("%d\n", arr[8]); printf("%d\n", arr[9]);
1.3 数组名是一个地址常量,指向数组首地址的常量
printf("%p\n", arr);
1.4 数组在内存中占的大小 = 数字类型 * 元素个数
printf("数组在内存中所占的大小为:%d\n",sizeof(arr)); printf("数组元素大小为:%d\n",sizeof(arr[0])); printf("数组元素个数为:%d\n",sizeof(arr) / sizeof(arr[0]));
1.5 一维数组的最值
#include <stdio.h> #define SIZE 10 /* 十只小猪称体重 */ int main() { //定义数组 int arr[SIZE]; //接收输入的小猪体重 for (int i = 0; i < 10; i++) { scanf_s("%d",&arr[i]); } //定义最大值 int max = arr[0]; for (int i = 1; i < SIZE; i++) { if (arr[i] > max) { max = arr[i]; } } printf("最重的小猪体重为:%d\n", max); return 0; }
1.6 一维数组的逆置
#include <stdio.h> int main() { int arr[] = {1,2,3,4,5,6,7,8,9,10}; int i = 0;//数组的起始下标 int j = sizeof(arr) / sizeof(arr[0]) -1;//数组的末尾下标 while (i < j) { //通过临时变量交换数据 int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; i++; j--; } //数组中的元素倒序排列 for (int i = 0; i < 10; i++) { printf("%d\n",arr[i]); } return 0; }
1.7 冒泡排序
#include <stdio.h> /* 冒泡排序:把一个无序数组变成有序数组 */ int main() { int arr[] = {9,5,7,1,6,3,10,8,4,2}; //外层控制行 执行元素个数-1次 for (int i = 0; i < 10 - 1;i++)//10-1为执行次数 { //内层控制列 执行元素个数-1-执行次数 for (int j = 0; j < 10 - 1 - i;j++)//10-1-i为元素个数-执行次数 { //比较两个元素,满足条件交换 if (arr[j] > arr[j+1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } //打印排序后的数组元素 for (int i = 0; i < 10;i++) { printf("%d\n",arr[i]); } return 0; }
2、二维数组
二维数组定义方式:数据类型 数组名[行][列] = {{值1,值2},{值3,值4} };
int arr[3][4];
● 二维数组命名规则同一维数组。
● 定义了一个三行四列的数组,数组名为arr其元素类型为整型,该数组的元素个数为3*4个
二维数组arr是按行进行存放的,先存放arr[0]行,再存放arr[1]行、arr[2]行,并且每行有四个元素,也是依次存放的
● 二维数组在概念上是二维的:其下标在两个方向上变化,对其访问一般需要两个下标。
● 在内存中并不存在二维数组,二维数组实际的硬件存储器是连续的,也就是说内存中只有一维数组,即放完一行后顺次放入第二行
和一维数组的存放方式是一样的。
int main() { //二维数组定义方式:数据类型 数组名[行][列] = //{ // {值1,值2}, // {值3,值4} //; int arr[2][3] = { {1,2,3}, {4,5,6} }; //二维数组首地址 printf("%p\n",arr); printf("%p\n",arr[0]); printf("%p\n",&arr[0][0]); printf("%p\n",arr[1]); //二维数组赋值 //arr[1][2] = 20; //遍历二维数组中的元素 for (int i = 0; i < 2;i++)//两行 { for (int j = 0; j < 3;j++)//三列 { //printf("%d ",arr[i][j]); printf("%p\n",&arr[i][j]); } printf("\n"); } printf("二维数组大小为:%d\n",sizeof(arr));//行*列*sizeof(数据类型) printf("二维数组一行大小为:%d\n",sizeof(arr[0])); printf("二维数组元素大小为:%d\n",sizeof(arr[0][0])); printf("二维数组的行数为:%d\n",sizeof(arr) / sizeof(arr[0]));//数组大小 / 一行大小 printf("二维数组的列数为:%d\n",sizeof(arr[0]) / sizeof(arr[0][0]));//一行大小 / 单个元素大小 return 0; }
2.1 二维数组的初始化
int main() { //二维数组定义方式:数据类型 数组名[行][列] = //{ // {值1,值2}, // {值3,值4} //}; //int arr[2][3] = { {1,2,3} ,{4,5,6} }; //int arr[2][3] = { 1,2,3 ,4,5,6 }; int arr[][3] = { 1,2,3 ,4,5,6,7 };//二维数组定义的时候,行数可以不写,列数必须写 for (int i = 0; i < 3;i++) { for (int j = 0; j < 3;j++) { printf("%d ",arr[i][j]); } printf("\n"); } return 0; }
3、多维数组(三维数组)
三维数组定义:数据类型 数组名[层][行][列];
int main() { //一维数组定义:数据类型 数组名[元素个数] //二维数组定义:数据类型 数组名[行][列]
//三维数组定义:数据类型 数组名[层][行][列] int arr[2][3][4] = { { {1,2,3,4}, {2,3,4,5}, {3,4,5,6} }, { {4,5,6,7}, {5,6,7,8}, {6,7,8,9} } }; //遍历三维数组中的元素 for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { for (int k = 0; k < 4; k++) { printf("%d ",arr[i][j][k]); } printf("\n"); } } //三维数组的大小 printf("三维数组的大小为:%d\n",sizeof(arr));//2*3*4*4 层*行*列*sizeof(数据类型)=96 printf("三维数组一层的大小为:%d\n",sizeof(arr[0])); printf("三维数组一行的大小为:%d\n",sizeof(arr[0][0])); printf("三维数组元素的大小为:%d\n",sizeof(arr[0][0][0])); printf("层:%d\n",sizeof(arr) / sizeof(arr[0])); printf("行:%d\n", sizeof(arr[0]) / sizeof(arr[0][0])); printf("列:%d\n", sizeof(arr[0][0]) / sizeof(arr[0][0][0])); return 0; }
4、字符数组与字符串
4.1 字符数组与字符串的区别
● C语言中没有字符串这种数据类型,可以通过char的数组来代替。
● 字符串一定是一个char的数组,但char的数组未必是一个字符串。
● 数字0(和字符‘\0’等价)结尾的char数组就是一个字符串,但如果char数组没有以数字0结尾,那么就不是一个字符串。
● 只是普通字符数组,所以字符串是一种特殊的char的数组。
int main() { char c1[] = {'h','e','l','l','o'};//普通字数数组
printf("%s\n",c1);//乱码,因为没有'\0'结束符
char c1[] = {'h','e','l','l','o','\0'};//以'\0'('\0'就是数字0)结尾的字符数组是字符串
printf("%s\n",c2);
//字符
char ch = 'a'; //字符串 字符串结束标志为\0 数字0等同于\0 但是不等同于'0' char* arr = "hello"; char arr[] = "hello"; char arr[] = {'h','e','l','l','o','\0'}; printf("%s",arr); printf("%d\n",sizeof(arr));//char占一个字节 for (int i = 0; i < sizeof(arr); i++) { printf("%c",arr[i]); } return 0; }
4.2 字符串数组的初始化
int main() { //定义字符数组存储字符串 char ch[10]; scanf_s("%s",ch,1); printf("%s",ch); /*char ch1[] = "hello"; char ch2[] = "world"; char ch3[20]; int i = 0; while (ch1[i] != '\0') { ch3[i] = ch1[i]; i++; } printf("%s",ch3);*/ return 0; }
4.3 gets()字符串获取
int main() { char ch[100]; //通过键盘获取一个字符串 //gets接收字符串可以带空格 gets(ch); //scanf_s("%[^\n]",ch);通过正则表达式 获取带空格的字符串 printf("%s\n",ch); return 0; }
4.4 fgets()字符串获取
int main(void) { char ch[10]; //fgets可以接收空格 //fgets获取字符串少于元素个数会有\n 大于等于没有\n fgets(ch,sizeof(ch),stdin);//"hello\n\0" printf("%s",ch); return 0; }
4.5 puts()字符串输出
int main0705() { char ch[] = "hello world"; //puts自带换行,遇到\0停止 puts(ch); //puts("hello\0 world"); //puts("");换行 return 0; }
4.6 fputs()字符串输出
int main() { char ch[] = "hello worlds"; fputs(ch,stdout); return 0; }
4.7 strlen()获取字符串长度
int main() { //计算字符串有效个数 char ch[] = "hello world"; printf("数组大小:%d\n",sizeof(ch)); printf("字符串长度:%d",strlen(ch)); return 0; }
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)