知识点
主要包含的知识点为一维数组/二维数组的基本知识,字符串数组的常用函数。通过程序来说明这些知识点的用法。
- 数组的定义、初始化、数组元素的引用
- 数组在内存中的存储
- 字符数组以及字符串常用函数
一维/二维数组基本知识
一维数组
通过对一个实例程序来说明数组的有关基本知识。
这里拿“冒泡法”算法作为示例:
pop算法程序代码:
#include<stdio.h>
int main(){
//定义n 作为数组的大小
int n;
//while语句内表示scanf可以一直输入
//知道遇到读取的结束符EOF (console控制台可以输入ctl+z跳出循环)
//也可以协作为 while(scanf("%d",&n) != EOF){}
printf("Please input a number as the size of the length of array:\n");
while(scanf("%d",&n) == 1){
//一维数组的定义:标准格式
//类型名 数组名 [常量表达式]
//这里需要注意的一点是 [n] 中的n一定是一个常量!!!
//另外定义一个t用作交换数值的temp
printf("\nPlease input the data of the array:\n");
int a[n],t;
//一维数组的初始化
//1.指定n 对其中l(l<=n)个元素赋值 从0-(l-1)赋值 未被赋值的元素默设置为 0
//示例:int a[5] = {0,1,2} 其中a[3] a[4]的值均为0 其他为赋值的数值
//2.n未指定 赋值n个元素 则该数组的长度被设置为 n
//(计算机为其开辟 n个int类型或者其他类型的内存空间 来存储这些数据)
//int a[] = {0,1,13}
for(int i=0;i<n;i++)
//这里通过scanf读入需要初始化的数组内的数组元素数据
scanf("%d",&a[i]);
//使用for循环 输出排序之前的数组元素顺序
printf("\nThe sequence before sort:\n");
for(int i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
//冒泡算法 pop算法
for(int i=0;i<n-1;i++){
for(int j=0;j<n-i-1;j++){
if(a[j]>a[j+1]){
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
//使用for循环 输出排序后的数组元素顺序
printf("\nThe sequence after sort:\n");
for(int i=0;i<n;i++)
printf("%d ",a[i]);
//提示用户输入数组的大小 n
printf("\n\nPlease input a number as the size of the length of array:\n");
}
//函数正常返回 0
return 0;
}
程序运行结果:
示例程序中便是一维数组的基本知识点,有关排序以及其他的算法,后续有时间的话会专门在算法的博客栏目部分做进行相关的总结。
这里有一个关于pop(冒泡)算法的讲解,不懂的同学可以参考学习一下。
二维数组
通过对一个实例程序来说明数组的有关基本知识。
这里拿“矩阵的转置”作为示例:
矩阵转置代码:
#include<stdio.h>
int main(){
//定义be af数组分别存放转置前后的数组元素
//定义同一维数组定义一样 行列长度 m,n 均为常量表达式
//初始化二维数组
//1.可以初始化二维数组 数组内部的元素 如:前面的1,2,3
//2.可以按行初始化 如:{4,5,6}
//3.初始化的时候可以部分初始化 如:{7,8} 缺省的部分默认设置为 0
int be[3][3] = {1,2,3,{4,5,6},{7,8}},af[3][3];
//也可以采用读入数据的方式初始化be 数组
/*
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
scanf("%d",&be[i][j]);
*/
//打印转置之前的二维数组
for(int i=0;i<3;i++){
for(int j=0;j<3;j++)
printf("%d ",be[i][j]);
printf("\n");
}
//将数组进行转置 (矩阵)
//行列互换 即:af[j][i] = be[i][j];
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
af[j][i] = be[i][j];
printf("\n");
//打印转置之后的二维数组
for(int i=0;i<3;i++){
for(int j=0;j<3;j++)
printf("%d ",af[i][j]);
printf("\n");
}
//函数正常返回 0
return 0;
}
程序运行结果:
数组在内存中存储
无论事一维数组还是二维数组,在计算机为其开辟的存储空间均是连续的,根据内存的存储方式划分,这种方式称为线性表的顺序存储。
图示为线性表的顺序存储结构示意图:
若为二维数组,数组的存储会按行进行顺序存储,即:a[2][2]存储顺序为:a[0][0],a[0][1],a[1][0],a[1][1]
重要的是内存地址的理解,也是C的核心,会在后面指针的部分进行总结。
字符数组&字符串常用函数
C语言中没有字符串类型,字符串是作为字符数组进行处理的,标准的scanf和printf中以“%s”进行输入和输出的,规定‘\0’作为字符串的结尾标志符。
字符数组和一般的其他数据类型的数组操作类似这里拿一个程序示例字符数组和字符串的用法:
程序代码:
#include<stdio.h>
#include<string.h>
int main(){
//定义三个字符数组 a b c
//对前两个数组进行初始化
//初始化长度不够的字符 会自动赋值给空操作符
char a[10] = {'H','e','l','l','o'};
char b[10] = {'w','o','r','l','d','!'};
char c[10];
//定义str字符串 定义l为其实际长度
char str[30],l=0;
//定义str0 str1 str2字符串
char str0[100],str1[20],str2[20];
printf("Please input an array C[10]:\n");
for(int i=0;i<10;i++)
scanf("%c",&c[i]);
//字符串在C中实际上也是字符数组
//可以按照字符数组引用的方式给其中的元素进行赋值
for(int i=0;a[i];i++)
str[l++] = a[i];
for(int i=0;b[i];i++)
str[l++] = b[i];
for(int i=0;c[i];i++)
str[l++] = c[i];
//输出合并 a b c 字符数组后的str字符串
printf("str combine a b c:\n%s\n",str);
//字符串长度函数 测试l 与strl长度是否一致
int strl = strlen(str);
printf("l:%d\tstrl:%d\n",l,strl);
printf("\n\nPlease input str1:\n");
scanf("%s",str1);
//gets函数可以读入带有空格的字符串 以回车作为结束符
//在gets()前输入的回车都能够被gets()函数捕获到 gets输入的内容便为空
//这里提供两种思路解决gets()不捕获前面回车符的问题
//1.scanf中格式控制"%s "的空格可以吸收所有连续的空白(空格,回车,tab)
//2.rewind(stdin)清空输入缓冲区
//scanf("%s ",str1);
//rewind(stdin);
printf("Please input str2:\n");
rewind(stdin);
//gets()输入字符串函数 遇到回车符结束输入
gets(str2);
//puts()输出字符串函数 默认带有换行
printf("Onput str2:\n");
puts(str2);
printf("\n") ;
//字符串copy函数 str2内容copy到str0中 str0内容被覆盖
strcpy(str0,str2);
printf("str0-copy str2:%s\n\n",str0);
//字符串连接函数 str0拼接str1 结果存放到str0中
//实际上合并后的字符数组的地址是str0的地址
strcat(str0,str1);
printf("str0-combine str1:%s\n\n",str0);
//字符串的比较函数 字符串中的字符逐个字符进行按照ASCII码值进行比较
//比较的结束条件是 遇到不相同的字符或者字符串的结束标志符 '\0'
// str0等于str2 返回0
// str0大于str2 返回一个正整数
// str0小于str2 返回一个负整数
printf("compare the content between str0 and str1:%d\n\n",strcmp(str0,str2));
//字符串长度函数 函数返回的值为一个整数值
printf("The length of str0:%d\n\n",strlen(str0));
//字符串大写函数 strupr()
printf("The upper of the string:\n");
puts(strupr(str0));
//字符串小写函数 strlwr()
printf("The lower of the string:\n");
puts(strlwr(str0));
return 0;
}
程序运行截图:
结语
数组的内容总结到这里差不多结束了。夜深人静,外面好冷,该回家睡觉了~~
文章内容,博主手写,可能会有错误或瑕疵的部分,如有问题请积极留言,方便讨论交流学习。