目录
一维数组
内存分析
数组内存图
针对代码 int a[5] = {1,2,3,4,5};
注:数组名记录数组首地址(即a[0]的地址),元素连续分布。
假设a[0]地址是0x1122 ,则 a[1]地址= a[0]的地址+int字节数(4)= 0x1122 + 4 = 0x1126,
a[2]地址= a[1]地址 + int字节数(4)= 0x1126 + 4 = 0x112A,
依次类推。
注意事项
C语言规定,数组变量一旦声明,数组名指向的地址不可更改。声明数组时,编译器自动分配内存地址并与数组名绑定。用大括号重新赋值不允许,如:
错误举例1:
int nums[5];
nums = {22, 37, 3490, 18, 95}; //(使用大括号赋值,必须在数组声明时赋值,否则编译报错)
错误举例2:
int nums[5] = {1, 2, 3, 4, 5};
nums = {6, 7, 8, 9, 10}; //(报错,更改数组地址)
变长数组
数组声明时,除用常量指定长度,也可用变量或表达式指定,即变长数组
int n = 10;
int arr[n]; 。//其特征是数组长度运行时确定,好处是无需开发时预估长度,可在运行时精准分配。
int i = 10;
int a1[i];
注:变长数组在C99标准引入,C11标准标记为可选特性,部分编译器可能不支持或有限制。
char型数组与字符串
char型数组
字符型数组,即数组元素数据类型为字符型的数组。一方面,可看作普通数组,初始化及常用操作同前。
例如:
char arr[] = {'a','b','c','d'}; 。
另一方面,字符型数组可用于存储字符串。
字符串的使用
- "helloworld"
"abc"
"a"
"123"
由双引号引起来的一串字符称为字符串字面值,简称字符串(String)。
- 通常把""称为空串,即不包含任意字符的字符串;
- 而" "则称为空格串,是包含一个空格字符的字符串,二者不能等同。
C语言没有专门用于存储字符串的变量类型,字符串都被存储在char类型的数组中。
在字符串结尾,C语言自动添加一个'\0'的转义字符作为字符串结束的标志,所以字符数组也必须以'\0'字符结束。
字符串声明方式1:标准写法
//显式以'\0'为最后一个字符元素结束
char str[12] = {'h','e','l','l','o',' ','w','o','r','l','d','\0'};
注:字符串写成数组的形式,是非常麻烦的,C语言提供了一种简化写法。双引号之中的字符,会被自动视为字符数组。
字符串声明方式2:简化写法
//自动在末尾添加'\0'字符
char str1[12] = {"hello world"}; //注意使用双引号,非单引号
//或者
char str2[12] = "hello world"; //可以省略一对{}来初始化数组元素
由于字符数组的长度可以让编译器自动计算,所以声明时可以省略字符数组的长度:
char str1[] = {"hello world"};
//或者
char str2[] = "hello world";
注: 双引号里面的字符串,不用自己添加结尾字符\0,C语言会自动添加。所以,代码中数组str1或注str2的元素依次为 'h','e','l','l','o',' ','w','o','r','l','d','\0'。
对应的存储为每个存储单元大小为1个字节,示例图(包含字符和空格、空字符的存储示意)
其中,数组由连续的存储单元组成,字符串中的字符被存储在相邻的存储单元中,每个单元存储一个字符。所以,上述两个数组的长度不是11,而是12
实例
#include "stdio.h"
int main() {
//字符数组
char arr[] = {[0]: 'a', [1]: 'b', [2]: 'c', [3]: 'd'};
//字符串
//C语言中 创建字符串方式1 标准写法
//显式以'\0'为最后一个字符元素结束
char str[12] = {[0]: 'h', [1]: 'e', [2]: 'l', [3]: 'l', [4]: 'o', [5]: ' ', [6]: 'w', [7]: 'o', [8]: 'r', [9]: 'l', [10]: 'd', [11]: '\0'};
char name[5] = {[0]: 'j', [1]: 'i', [2]: 'm', [3]: '\0'};
//声明字符串方式2
char str1[12] = {"hello world"};
char str2[12] = "hello world";
char str3[] = {"hello world"};
char str4[] = "hello world";
char name
字符串的长度
eg.
char nation[10]={"China"};
注:数组nation的前5个元素为:'C','h','i','n','a',第6个元素为'\0',后4个元素也自动设定为'\0'。
char[3]={"jim"};
//字符串数组长度
printf("%d\n", sizeof(name)/ sizeof(char));
注意:在计算字符串长度的时候,'\0' 是结束标志,不算作字符串内容。
另一种计算长度方式(调用strlen()函数)
#include <stdio.h>
#include <string.h> //需要加载此头文件
int main() {
char nation[10] = "china";
printf("%d\n", strlen(nation)); //5
}
gets()与puts()的使用
gets():
读取标准输入设备输入的字符串,直到遇到【Enter】键才结束。
char str[20]; //定义一个数组
gets(str); //获取输入的字符串,存放到字符数组中
举例:字符串的读写
c
int main() {
char name[15];
printf("enter your name:");
gets(name); //输入字符串至数组变量name
puts(name); //输出字符串
return 0;
}
puts():
在C语言中,puts() 是一个用于输出字符串的标准库函数,其原型定义在 <stdio.h> 头文件中。puts() 函数的作用是将一个字符串打印到标准输出控制台上。
int main() {
char str1[] = "helloworld";//定义字符串
puts(str1);//输出字符串
return 0;
}
注:puts()函数只能用于输出字符串,而不能输出其他类型的数据。如果需要输出其他类型的数据,应使用printf() 函数。