#在这一篇中介绍三个数组
1.一维数组? 2.字符数组? 3.二维数组
数组的定义:
类型 数组名[元素个数] ----这个为数组的定义
#include <stdio.h>
int main() {
int a[4];//在这里,我定义了一个只能装载4个整数类型元素的数组
char b[5];//在这里,定义一个只能装载5个字符类型元素的数组
return 0;
}
Tips:数组是不可以动态定义的,也就是说元素个数那里必须使用的是常量来定义大小,如果使用定义为整型的变量,例如;int a[n]; //这里会报错,定义要求就是为常量,不可使用变量
接下来就是如何访问数组中的元素:
>>方式: 数组名[下标]
a[0]; // 访问a数组中的第一个元素
b[1]; // 访问b数组中的第二个元素
c[5]; // 访问c数组中的第六个元素
/*注意,第一个数的下标为0,从0开始的*/
//注意
int a[5]; // 创建一个具有五个元素的数组
a[0]; // 访问第一个元素的下标是0,不是1
a[5]; // 报错,因为第五个元素的下标是a[4]
这里便是数值的基本定义。
在c中,循环总是与数组一同出现,因为我们总是需要使用循环来访问数组。举一个例子。
int a[10]; // 定义一个容量为10的整数型数值
for (i = 0; i < 10; i++) {
a[i] = i;
}
一般将计算器的初始值为0,为了避免越界访问从而程序报错。
数值的初始化---在数值定义的时候并且赋值。
//数组的初始化
//将数组中的所有元素初始化为0
int a[10] = {0}; // 事实上这里只是将第一个元素赋值为0
//如果是赋予不同的值,那么用逗号分隔开即可;
int a[10] = {1,2,3,4,5,6,7,8,9,10};
//可以只给一部分元素赋值,未赋值的元素自动初始化为0
int a[10] = {1,2,3,4,5,6};
//还可以指定定义,但是在微软的vs code里面好像不可以
int a[10] = {[2] = 2,[5] = 5, [9] = 9};
以及sizeof()---这个函数用于计算大小;若变量为字符串则计算字符个数;若变量为整数,计算所占空间大小。
以上,就是数组的基本操作
在c语言中,是没有字符串这个量的(在python中有,叫做string)
所以,我们通过字符数组来实现字符串,直接定义是初始化数组
例如:
int main() {
//初始化字符数组的每个元素
char str1[10] = {'i', 'l','o','v','e'};
//可以不写元素的个数,因为编译器会自动计算
char str3[] = {'F','i','s','h','c','\0'};
// 使用字符串常量初始化字符数组
char str4[] = {"ilove"};
// 使用字符串常量初始化,可以省略大括号
char str5[] = "ilove";
return 0;
}
然后,我们获得了字符数组,我们还有一些方法去使用这个字符数组。
例如:
获取字符串的长度:strlen
注意:size_t被定义与stddef.h头文件中,它事实上就是无符号整型(unsigned int)---%u
使用格式化符号,不包括"n"不算入数中
#include <stdio.h>
#include <string.h>
int main(){
char a[] = "iloveu\n";
printf("这个字符串的个数是:%d", sizeof(a));
printf("这个字符串的字符数是:%u", strlen(a));
//可以发现,它们的输出个数不一样。第一个是7,而第二个是6
return 0;
}
因为strlen不会将"\n"算入字符串的个数中去。
拷贝字符串:strcpy和strncpy
/*strcpy(目标数组,原数组);
将原数组的值赋予给了目标数组,其中目标数组的容量一定要大于等于原数组,否则赋值时会报错;
它把原数组背后的结束符; 也拷贝进去了,看到这个结束符时,便自动结束
??
其次,原数组也可以改为字符串。*/
如
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "original string";
char str2[] = "New string";
char str3[100];
strcpy(str1, str2);
strcpy(str3, "copy Successful");
printf("str1: %s\n", str1);// 结果为New strimg
printf("str2: %s\n", str2);
printf("str3: %s\n", str3);
return 0;
}
对于 ---strncpy()来讲
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "to be or not to be";
char str2[] = "New string";
char str3[100];
strncpy(str2, str1, 5);
str2[5] = '\0';// \0是结束符号的格式化
printf("str2: %s\n", str2);
return 0;
}
/*strncpy可以限制复制的字符个数
strncpy(目标数组,原数组,限制的个数(int))*/
//记住一定要在添加上一个结束符
//str2[5] = '\0';// \0是结束符号的格式化
//限制多少,就在相应的地方加上
对于后续的方法,其实使用方法都与这些类似,只是输出结果不一样
链接字符串:strcat和strncat
strcat(目标数组,原数组/字符串)
比较字符串:strcmp和strncmp
strcmp(目标数组,原数组/字符串)
0为false , 1为True
比较的数组若相等时---则返回0即False
#include <stdio.h>
#include <string.h>
int main() {
char a[] = "iloveu";
char b[] = "iloveu";
if (!strcmp(a,b)) {
printf("这两个字符数组相等");
}
else {
printf("这两个字符数组不相等");
}
return 0;
}
以上便是字符数组的操作和初始化定义
这个是我们逻辑化的二维数组
而下面那个二维数组的实际存储是线性存储。物理化
Tips:同样需要注意下标的取值范围,以防止数组的越界访问。
int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
//或者是另一种表达方式
int a[3][4] = {{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
//第一个[]表示行 第二个[]表示列。
最后二维数组也可以进行仅对部分元素赋初值
这里是指定每一行的第一个元素,因为剩下的,编译器会自动补足。
int a[3][4] = {{1},{5},{9}}
//如果希望整个二维数组初始化为0,那么直接在大括号里面写一个0即可
int a[3][4] = {0}
还有一个操作是指定部分元素特定赋值。但是,在vs code不能实现该操作,所有以我就没有写出来
若各位感兴趣的话,可以直接写写看。感谢各位的观看,谢谢。