7-c语言中的数组
一.数组的定义
数组: 相同数据类型变量的集合。数组是为⽤户处理多个数据⽽设计, 使⽤数组可以给多个变量分配多 个连续的内存,节省变量名的消耗。
格式:
数据类型 数组名 [元素的个数];
注意 :
(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. 每个成员的类型: int
3. 整个数组的⼤⼩: 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; // 每行第一个元素为1
for(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格式化输出保持数字对齐