c语言的数组

#在这一篇中介绍三个数组

1.一维数组  2.字符数组  3.二维数组

1.一维数组

数组的定义:

类型 数组名[元素个数] ----这个为数组的定义

#include 
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 
#include 
int main(){

    char a[] = "iloveu\n";
    
    printf("这个字符串的个数是:%d", sizeof(a));

    printf("这个字符串的字符数是:%u", strlen(a));

//可以发现,它们的输出个数不一样。第一个是7,而第二个是6

    return 0;
}

因为strlen不会将"\n"算入字符串的个数中去。

拷贝字符串:strcpy和strncpy

/*strcpy(目标数组,原数组);

将原数组的值赋予给了目标数组,其中目标数组的容量一定要大于等于原数组,否则赋值时会报错;
它把原数组背后的结束符; 也拷贝进去了,看到这个结束符时,便自动结束
  

其次,原数组也可以改为字符串。*/

#include 
#include 
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 
#include 
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 
#include 
int main() {
    
    char a[] = "iloveu";
    char b[] = "iloveu";
    
    if (!strcmp(a,b)) {
        printf("这两个字符数组相等");
    }
    else {
         printf("这两个字符数组不相等");
    }
    
    return 0;
}

以上便是字符数组的操作和初始化定义

二维数组

c语言的数组_第1张图片

这个是我们逻辑化的二维数组

而下面那个二维数组的实际存储是线性存储。物理化c语言的数组_第2张图片

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不能实现该操作,所有以我就没有写出来

若各位感兴趣的话,可以直接写写看。感谢各位的观看,谢谢。

你可能感兴趣的:(c语言,算法,数据结构)