目录
1.9 二维数组的实质(以字符型重点补充,数字型可以码农友们自行尝试):
1.1 总概念:
数组是用于处理大批量数据的一种构造数据类型,其属于线性结构中的顺序存储结构。
1.2 总特点:
- 数组是一组有序数据的集合。数组中各数据的排列是有一定规律的,下标代表数据在数组中的序号。
- 用一个数组名和下标来唯一地标识数组中的每个元素。
- 数组中的每一个元素都是属于同一数据类型。(规定不能把不同数据类型的数据放在同一个数组中。)
int age[10]; //定义了一个int整型数组,数组名为age,大小为10,用于存储10整型数据
1.3 注意事项:
- 数组名需要符合标识符的命名规则!!!
- 定义数组时给定的数组大小必须是一个整型常量表达式!!!
- 数组大小不允许为小数!!!
- 定义数组时必须给定数组大小,除非有初始化赋值!!!
1.4 一维数组(数字型):
1.4.1 初始化:
- 数组下标是从0开始
- 数组最大元素下标是数组大小 - 1
- int score1[100] = { 0 }; //将数组score1所有的元素初始化为0
- int score2[100] = { 1 }; //将数组score2中第1个元素初始化为1,其他元素都为0
- int score3[ ] = { 11, 22, 33, 44, 55 }; //给数组初始化赋值时也可以不给定数组大小数组 ,大小会根据你初始化赋值的数据的数量来给定数组大小
- int score4[n]; //错误!!!数组大小必须是常量值,不能是变量
#include<stdio.h> int main() { int arr[4]={ 1, 2, 3, 4 }; //数组大小为4 //访问(下标是从0开始,定义的数组大小-1 结束) printf("%d",arr[0])//访问数组中第1个数 printf("%d",arr[1])//访问数组中第2个数 printf("%d",arr[2])//访问数组中第3个数 printf("%d",arr[3])//访问数组中第4个数 /*printf("%d",arr[4])//错误,超出访问范围*/ return 0; }
- 注意事项:在不确定需要存储多少数据时,定义数组时尽可能在不浪费内存的情况下,给定大一点的数组大小,确保能够存下所有数据
1.4.2 字节:数组大小是多少个字节?
数组字节大小 = 数组元素个数 *数组单个元素的字节大小
1.5 一维字符数组(字符型) :
1.5.1 概念:
char类型的数组,是一种特殊的数组。
1.5.2 初始化:
- char str[10] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g' }
- char str1[8] = "abcdefg";//(最多只能有7个有效字符)用字符串给字符数组初始化赋值,但注意str1[8]的字符串赋值时能输入的有效字符为7个,多写一个就会报错,其实字符串赋值时其最后一个字符会默认有个"\0"!!!但也给字符数组初始化赋值时,只给部分数组元素赋初值,没有给完全,其他没有赋值的元素默认为'\0',字符'\0'的ASCII码为0
- str = str1; //错误(数组首地址之间不能相互赋值)!!!
- str[0] = str1[0]; //正确(相同类型的数组元素之间可以相互赋值
1.5.3 输入和输出:
- 输入:
- scanf("%s", str); //%s是字符串的格式占位符,不需要&取址符(注:以此输入字符串时,空格会被看做’\0’输入)
- gets(str); //gets为字符串的输入函数(注:以此输入字符串时,空格不会被看做’\0’输入)
- getchar(str[0]);//单个字符的输入
- 输出:
- puts(str); //puts为字符串的输出函数; (注:puts(str)以'\0'作为输出的结束标志,字符数组和字符串默认会以'\0'作为结束标志,'\0'会占用一个字节的存储空间,所以定义字符数组时需要多给它一个大小,用于存储'\0',要确保字符数组有足够的空间存储'\0')
- putchar(str[0]);//单个字符的输出
1.6 二维数组(数字型) :
1.6.1 理解:
相当于多个一维数组的组合
1.6.2 定义:
int arr[3][4]; 注意:二维数组的数组元素下标也是从0开始的
例:
arr[3](管行数) [4](管列数);
第一行第一列:arr[0][0],
第一行第三列:arr[0][2],
第二行第一列:arr[1][0];
第二行第三列:arr[1][2],
1.6.3 初始化:
int arr1[4][2] = { 11, 34, 23, 67, 55, 90, 123, 543 };
- 注:但若给二维数组前部分元素赋初值时,没有初始化赋值的元素默认为0
int arr2[ ][4] = { { 1, 2, 3 }, { 5, 6 }, { 9 } }; //默认为arr2[3][4]
- 注: 二维数组初始化赋值时可以省略行下标大小,但是必须给定列下标大小
1.6.4 输入和输出:
#include<stdio.h>
int main()
{
int arr[3][4]; //定义了一个int整型二维数组,行数为3,列数为4
// 输入
for (int i = 0; i < 3; i++) //双重循环给二维数组输入数据
{
for (int j = 0; j < 4; j++)
{
scanf("%d", &arr[i][j]);
}
}
// 输出:
for (int i = 0; i < 3; i++)//双重循环输出二维数组的数据
{
for (int j = 0; j < 4; j++)
{
printf("%d\t", arr[i][j]);
}
putchar('\n');
}
return 0;
}
1.7 二维字符数组(字符型):
1.7.1 定义:
char str[4][10] = { "helloworld", "world", "!\n", "C++" };
注:字符串总是以\0结束,一般的字符串处理函数都是以\0作为字符串结束标志
1.7.2 输出和输入:
#include<stdio.h>
int main()
{
char str[4][10]; //定义了一个cahr字符二维数组,行数为3,列数为10
// 输入:
for (int i = 0; i < 4; i++)
{
gets(str[i]); //二维数组带一个下标表示某一行的首地址,以回车为下一行的字符串输入
}
// 输出:
for (int i = 0; i < 4; i++)
{
puts(str[i]); //二维数组带一个下标表示某一行的首地址
}
return 0;
}
1.8 数组元素的插入和删除:
- 数组元素的插入( 向已部分初始化的数组的指定位置放入数据 ),例:
#include<stdio.h> int main() { int arr[9] = { 1, 2, 3, 4, 5, 6, 7, 8 }; //要求:把数据66放到数组的第6个元素的位置上 int i; for (i = 8; i>5; i--) { //数组元素依次往后移动,直到i到达放入位置的下标 arr[i] = arr1[i - 1]; } arr[5] = 66; //将新插入的数据放入数组对应位置 return 0; }
- 数组元素的删除(把数组中指定位置上的数据从数组中移除),例:
#include<stdio.h> int main() { int arr[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; //要求:将数组arr1中第4个数组元素删除 int i; for (i=3; i < 8; i++) { //数组元素依次往前移动,i从需删除的位置的下标开始,直到最后 arr[i] = arr1[i + 1]; } return 0; }
1.9 二维数组的实质(以字符型重点补充,数字型可以码农友们自行尝试):
二维数组看起来是以行列存储数据,其实本质上它只有一行,实质二维数组的存储空间是连续的 ,只因为系统定义其的二维访问方式使其成为二维数组,例:
#include<stdio.h> int main() { char arr[3][6] = { "hello", "World", "!!!!!" }; for (int i = 0; i < 18; i++) //输出arr[3][6]全部字符 { printf("%c",arr[0][i]); //从首地址arr[0]开始访问到底,不需二重循环 } return 0; }
输出结果(可知可确):