8、数组

数组

C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。

数组是一个整体,它的内存是连续的;也就是说,数组元素之间是相互挨着的,彼此之间没有一点点缝隙。

连续的内存为指针操作(通过指针来访问数组元素)和内存处理(整块内存的复制、写入等)提供了便利,这使得数组可以作为缓存(临时存储数据的一块内存)使用。

定义

这一步是为了分配内存空间,例如分配10个int的内存空间,40个字节

type arrayName [ arraySize ];
int intArr[10];

初始化

int intArr[5] = {1,2,3,4,5};
int intArr[] = {1,2,3,4,5};

访问

int i = intArr[1];

长度

sizeof(),可以获取一个变量所指向内存空间的大小,所以数组的长度=数组的总内存大小/数组第一个元素内存大小

int len = sizeof(arr)/sizeof(arr[0]);

遍历

#include<stdio.h>

int main(){
   int arr[] = {1,2,3,4,5};
   //获取数组长度
   int len = sizeof(arr) / sizeof(arr[0]);
   for(int i = 0;i < len;i++){
      printf("%d\n",arr[i]);
   }
   return 0;
}

字符数组

字符数组实际上是一系列字符的集合,也就是字符串(String)。在C语言中,没有专门的字符串变量,没有string类型,通常就用一个字符数组来存放一个字符串。

C语言规定,可以将字符串直接赋值给字符数组

char str[] = {"hello world"};
char str[] = "hello world";

注意:字符数组只有在定义时才能将整个字符串一次性地赋值给它,一旦定义完了,就只能一个字符一个字符地赋值了

char str[7];
str = "abc123";  //错误

字符串结束标识

在C语言中,字符串总是以\0作为结尾,所以\0也被称为字符串结束标志,或者字符串结束符。

\0是 ASCII 码表中的第 0 个字符,英文称为 NUL,中文称为“空字符”。该字符既不能显示,也没有控制功能,输出该字符不会有任何效果,它在C语言中唯一的作用就是作为字符串结束标志。

C语言在处理字符串时,会从前往后逐个扫描字符,一旦遇到'\0'就认为到达了字符串的末尾,就结束处理。'\0'至关重要,没有\0就意味着永远也到达不了字符串的结尾。

" "包围的字符串会自动在末尾添加\0。例如,"abc123"从表面看起来只包含了 6 个字符,其实不然,C语言会在最后隐式地添加一个\0,这个过程是在后台默默地进行的,所以我们感受不到。

字符串长度

在C语言中,我们使用string.h头文件中的 strlen() 函数来求字符串的长度

#include<stdio.h>
#include<string.h>

int main(){
   char str[] = "hello world";
   int len = strlen(str);   
   printf("length of str = %d",len);
   return 0;
}

字符串处理函数

C语言提供了丰富的字符串处理函数,可以对字符串进行输入、输出、合并、修改、比较、转换、复制、搜索等操作

string.h是一个专门用来处理字符串的头文件,它包含了很多字符串处理函数

strcat(str1,str2); //将str2拼接到str1后面
strcpy(str1,str2); //将str2复制到str1
strcmp(str1,str2); //比较两个字符串,如果相同返回0
strlen(s1); //返回字符串 s1 的长度。
strchr(s1, ch); //返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。
strstr(s1, s2); //返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。