在 C 语言中,数组和字符串有以下一些区别:
一、定义和存储方式
- 数组:
- 是一组相同数据类型元素的集合,可以存储任何数据类型,如整数、字符、结构体等。
- 例如
int arr[5] = {1, 2, 3, 4, 5}
定义了一个包含 5 个整数的数组。 - 数组在定义时必须指定大小,且这个大小在编译时就确定了,不能动态改变。
- 字符串:
- 在 C 语言中,字符串实际上是以空字符
'\0'
结尾的字符数组。 - 例如
char str[] = "Hello"
,这里存储了字符'H'
、'e'
、'l'
、'l'
、'o'
和一个空字符'\0'
。
- 在 C 语言中,字符串实际上是以空字符
二、操作方式
- 数组:
- 可以通过下标访问和修改其中的任意元素。例如
arr[2] = 10
可以将数组arr
的第三个元素修改为 10。 - 可以进行一些常见的数组操作,如遍历、排序、查找等,但这些操作通常需要手动实现。
- 可以通过下标访问和修改其中的任意元素。例如
- 字符串:
- 有一些专门用于字符串处理的库函数,如
strcpy
(复制字符串)、strcat
(连接字符串)、strcmp
(比较字符串)等。 - 字符串的操作通常更侧重于文本处理,比如拼接、比较、查找子串等。
- 有一些专门用于字符串处理的库函数,如
三、长度确定
- 数组:
- 数组的长度在定义时确定,并且可以通过
sizeof(arr) / sizeof(arr[0])
来计算其长度。 - 如果数组的元素个数发生变化,通常需要重新定义一个新的数组。
- 数组的长度在定义时确定,并且可以通过
- 字符串:
- 字符串的长度可以通过
strlen
函数来计算,该函数从字符串的首地址开始遍历,直到遇到空字符'\0'
为止,返回的长度不包括空字符。 - 字符串的长度可以动态变化,例如通过连接操作可以使字符串变长。
- 字符串的长度可以通过
四、初始化方式
- 数组:
- 可以在定义时初始化所有元素,也可以在定义后逐个元素进行初始化。
- 例如
int arr[3] = {1, 2, 3}
或者arr[0] = 4; arr[1] = 5; arr[2] = 6;
。
- 字符串:
- 可以使用字符串字面量进行初始化,如
char str[] = "Hello"
。 - 也可以逐个字符进行初始化,但必须确保最后一个字符是
'\0'
,以表示字符串的结束。
- 可以使用字符串字面量进行初始化,如
以下是试例
我们可以发现a11的值也就是arr1数组用strlen计算出的值与我们其他计算的值有很大的差异
出现这个问题是因为 strlen
函数在计算字符串长度时,是从给定的地址开始一直向后计数,直到遇到第一个 '\0'
(空字符)为止。
在代码中,虽然初始化了 char arr1[] = {'A', 'B', 'C'};
,但是这个数组并不是以空字符结尾的字符串,所以 strlen
函数会继续向后查找空字符,直到它在内存中的某个位置遇到了一个值为 0
的字节(这可能是在你的程序的其他部分的内存中),在此过程中它可能会遍历很多内存位置,导致输出一个不确定的值。
如果想要正确使用 strlen
,应该确保数组以空字符结尾,例如 char arr[4] = {'A', 'B', 'C','\0'};
。这样 strlen(arr)
就会正确地输出 3。