一.数组的定义
数组: 相同数据类型变量的集合。数组是为⽤户处理多个数据⽽设计, 使⽤数组可以给多个变量分配多 个连续的内存,节省变量名的消耗。
格式:
数据类型 数组名 [元素的个数];
注意 :
(1) 数据类型 : char,short,int float,double,long ,long long
(2) 数组名 : 合法的标识符,以数字,字符,下划线组成,⾸个单词要是字⺟或下划线
(3) 元素个数: 要求是⼀个确定的常量值
内存分布图:
变量类型的查看方法:去掉变量名剩下的就是类型
以 int t[5]为例子 :
1. 数组的成员:t[0] t[1] t[2] t[3] t[4]2. 每个成员的类型: int3. 整个数组的⼤⼩: sizeof(int [5]) 或 sizeof(a)4. 数组⼀个元素的⼤⼩: sizeof(a[0])5. 元素的个数: sizeof(a)/sizeof(a[0])
思考:数组⾸地址 t 编译器是如何找到对应 t[0],t[1],t[2] 内存块的数据呢?
t[0]=====> 表示数组的⾸地址 a 偏移 0 个元素的⼤⼩ ,[] 取该地址中的内容
t[1]=====> 表示数组的⾸地址 a 偏移 1 个元素的⼤⼩ ,[] 取该地址中的内容
t[2]=====> 表示数组的⾸地址 a 偏移 2 个元素的⼤⼩ ,[] 取该地址中的内容
示例代码1:
int main(){int a[5];printf("sizeof(int [5]) = %ld\n",sizeof(int [5]));printf("sizeof(a) = %ld\n",sizeof(a));printf("sizeof(a[0]) = %ld\n",sizeof(a[0]));printf("len = %ld\n",sizeof(a)/sizeof(a[0]));return 0;}
示例代码2:
二.数组的初始化
在定义数组的同时,给数组中的每⼀个成员变量,赋予⼀个初始的值。
例如1 : int a[5] = {10,20,30,40,50};
例如2: int a[5] = {10,20,30}; 部分初始化 : 未初始化的值,系统默认为 0
示例代码1:
#include <stdio.h>int main(){int a[5] = {10,20,30,40,50};int b[5] = {1,3,5};int len = 5,i = 0;printf("a数组: ");for(i = 0;i < len;i++){printf("%d ",a[i]); }printf("\n");printf("===========================\n");printf("b数组: ");for(i = 0;i < len;i++){printf("%d ",b[i]); }printf("\n");printf("===========================\n");return 0;}
示例代码2:
#include <stdio.h>int main(){int c[] = {1,3,4,5,6,7,2,3,4,5,6};int i = 0,n = 0;int len = sizeof(c)/sizeof(c[0]);for(i = 0;i < len;i++){printf("%d ",c[i]); if(c[i] % 2 == 0)n++;}printf("\n");printf("偶数的个数= %d\n",n);return 0;}运⾏结果:
1 3 4 5 6 7 2 3 4 5 6 偶数的个数= 5
练习:
int a[8] = {10,15,27,33,78,65};
(1) 要求⽤户输出上述数组的内容
(2) 要求求上述数组中奇数的和。
(3) 求上述数据中所有元素 (8 个 ) 的平均值 , 省略⼩数 , 输出整数。
#include <stdio.h>int main()
{int arr[] = {10,15,27,33,78,65}; // 示例数组int size = sizeof(arr)/sizeof(arr[0]);int sum_odd = 0;int total_sum = 0;// (1) 输出数组内容printf("数组内容: ");for(int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");// (2) 计算奇数之和for(int i = 0; i < size; i++) {if(arr[i] % 2 != 0) {sum_odd += arr[i];}}printf("奇数和: %d\n", sum_odd);// (3) 计算平均值(整数)for(int i = 0; i < size; i++) {total_sum += arr[i];}int average = total_sum / size;printf("平均值: %d\n", average);return 0;
}
三.字符数组和字符串
1.定义:
字符数组: 它是⼀个 char/unsigned char 类型的数组,常⽤来存放字符或字符串。
char buf[5] = {'A','B','C','D','E'};
思考 : 字符数组中只能存放字符或字符串 , 这句话对不对?
不对,还可以存放整数 char buf[5] = {65,66,67,68,69};
三种写法:
三种写法:char buf[30] = "welcome";char buf[30] = {"welcome"};char buf[30] = {'w','e','l','c','o','m','e','\0'};
示例1:
#include<stdio.h>int main()
{char buf1[] = {"hello"};char buf2[] = "hello";char buf3[] = {'h', 'e', 'l', 'l', 'o', '\0'};int i = 0;printf("buf1 :");for(i = 0; buf1[i] != '\0'; i++){printf("%c", buf1[i]);}printf("\n");printf("=======================\n");printf("buf2 :");for(i = 0;buf2[i] != '\0';i++){printf("%c ",buf2[i]); }printf("\n");printf("===============================\n");printf("buf3 : ");for(i = 0;buf3[i] != '\0';i++){printf("%c ",buf3[i]); }printf("\n");return 0;
}
输入:
char buf[100] = {0};
scanf("%s",字符数组的⾸地址); 功能:⽤户从键盘输⼊任意⼀段字符串,存放到buf中。以回⻋,空格,tab键盘作为⽤户输⼊的结束符号。
输出:
char buf[] = {"hello world"};
printf("%s\n",字符数组的⾸地址); 功能: 输出数组中第⼀个'\0'之前所有的字符,并显示到屏幕上。若是⽤户对应字符数组中没有'\0',则⽤户输出乱码。
示例2:
#include <stdio.h>int main(){char name[100];printf("please input your name : ");scanf("%s",name);printf("NAME\n");printf("%s\n",name); return 0;}
练习:
char buf[100] = {0};
要求⽤户从键盘输⼊字符数串存放到 buf 中 ,
若是⽤户输⼊的字符数组中存在⼤写字符 , 则转换为⼩写字符 , 若是⼩写字符则不管 , 然后输出⽤户输⼊的数据
#include <stdio.h>
#include <ctype.h>int main(){char buf[100] = {0};printf("请输入字符串: ");fgets(buf, sizeof(buf), stdin);// 转换大写字母为小写for(int i = 0; buf[i] != '\0'; i++) {if(isupper(buf[i])) {buf[i] = tolower(buf[i]);}}printf("转换后的字符串: %s", buf);return 0;
}
1- 使用 fgets 安全读取用户输入(防止缓冲区溢出)
2- 遍历字符串,使用 isupper 检查是否大写字母
3- 使用 tolower 将大写字母转换为小写
4- 小写字母和其他字符保持不变
四.二维数组
1.定义
⼀维数组是相同数据类型元素的集合,但是只能表示⼀⾏数据。 若是存在⾏和列相关的信息 (例如矩 阵),我们就需要⽤⼆位数组来表示.
2. 定义方式
数据类型 数组名 [行数][列数];
示例:
int a[3][4]; 在内存中按照还是按照⼀维数组的顺序排序的。
只不过,为了⽅便⼈们识别,我们是按照⼆维的来理解。0xd10 1 a[0][0]
0xd14 2 a[0][1]
0xd18 3 a[0][2]
0xd1c 4 a[0][3]
0xd20 5 a[1][0]
0xd24 6 a[1][1]
0xd28 7 a[1][2]
0xd2c 8 a[1][3]
0xd30 9 a[2][0]
0xd34 10 a[2][1]
0xd38 11 a[2][2]
0xd3c 12 a[2][3]
理解:
3.二维数组求大小
数组大小:sizeof (arr)
一个元素大小:sizeof (arr[0][0])
一行大小:sizeof arr[0]
行数: sizeof arr / sizeof arr[0]
列数:sizeof arr[0] / sizeof (arr[0][0])
示例代码:二维数组遍历
#include <stdio.h>int main(){int a[3][2];int i = 0,j = 0;printf("please input %d data : ",3 * 2);for(i = 0;i < 3;i++) {for(j = 0;j < 2;j++){scanf("%d",&a[i][j]); }}for(i = 0;i < 3;i++) {for(j = 0;j < 2;j++){printf("%d ",a[i][j]);}printf("\n");}return 0;}
练习:
定义⼀个 int a[10][10] 的数组,利⽤⼆维数组输出下列杨辉三⻆的图案 . 1
#include <stdio.h>int main() {int a[10][10] = {0};// 生成杨辉三角数据for(int i = 0; i < 10; i++){a[i][0] = 1; // 每行第一个元素为1for(int j = 1; j <= i; j++) {a[i][j] = a[i-1][j-1] + a[i-1][j];}}// 输出杨辉三角for(int i = 0; i < 10; i++) {// 输出空格对齐for(int k = 0; k < 10 - i; k++) {printf(" ");}// 输出数字for(int j = 0; j <= i; j++) {printf("%4d", a[i][j]);}printf("\n");}return 0;
}
运行结果:
1- 定义一个10x10的二维数组
2- 使用双重循环生成杨辉三角数据:
3- 每行第一个元素设为1
4- 其他元素等于上一行前一个位置的值和上一行同列的和
5- 输出时添加空格对齐,使显示更美观
6- 使用%4d格式化输出保持数字对齐