C++ | 基础语法 | 数组

👻 一维数组

👾声明

  • 声明一维数组需指定元素类型元素数量
DataType arrayName[arraySize];
int balance[10]; // 声明一个类型为 int 的包含10个元素的数组balance

👾初始化

  • 使用初始化语句

    • 赋值的元素不能大于数组总体元素
    int a[5] = {1, 2, 3, 4, 5}; // 大括号{ }之间的数目不能大于声明时在方括号[]中指定的元素数目
    
    • 赋值的元素少于数组总体元素时,剩余的元素自动初始化为 0

      • 对于shortintlong,就是整数 0

      • 对于char,就是字符 '\0'

      • 对于floatdouble,就是小数 0.0

    int a[5] = {1, 2, 3};	// a[3],a[4]自动初始化为 0
    

    由于剩余的元素会自动初始化为 0,所以只给第 1 个元素赋值为 0 ,即可将数组的所有元素初始化为 0

    int nums[10] = {0};
    char str[10] = {0};
    float scores[10] = {0.0};
    
    • 省略数组的大小,数组大小为初始化时元素个数
    int a[] = {1, 2, 3, 4, 5}; // 省略数组的大小,数组大小则为初始化时元素的个数
    
  • 逐个初始化数组

    balance[4] = 9; // 数组中某个元素赋值
    

👾访问元素

int salary = balance[9]; // 通过数组名称加索引进行访问

👻 二维数组

👾声明

  • 声明多维数组需指定元素类型元素数量
DataType arrayName[x][y];
int a[3][4]

👾初始化

  • 使用内部嵌套括号
int a[3][4] = {
	{0, 1, 2, 3} ,   /*  初始化索引号为 0 的行 */
	{4, 5, 6, 7} ,   /*  初始化索引号为 1 的行 */
	{8, 9, 10, 11}   /*  初始化索引号为 2 的行 */
};
  • 不使用内部嵌套括号
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};

👾访问元素

int val = a[2][3];

👻 字符数组

👾声明

char strName[x];
char a[10];  		// 一维字符数组
char b[5][10];  	// 二维字符数组

👾初始化

  • 逐个字符赋值

    • 指定长度,部分元素赋值
    char str[200] = {'c',' ','p','r','o','g','r','a','m'};
    
    • 全体元素赋值时可以省去长度
    char str[] = {'c',' ','p','r','o','g','r','a','m'};
    
  • 整体赋值字符串

    • 指定长度
    char str[30] = {"c program"};
    char str[30] = "c program";  	// 形式更简洁
    
    • 不指定长度
    char str[] = {"c program"};
    char str[] = "c program";  	// 形式更简洁
    

    字符数组只有在定义时才能整体赋值字符串。定义完后只能逐个字符赋值。

    char str[4];
    // 错误,报错:[Error] invalid array assignment
    str = "abc";  
    // 正确
    str[0] = 'a'; str[1] = 'b'; str[2] = 'c';
    

👾字符串结束标志

👽概念

  • 字符串总是以'\0'作为结尾,被称为字符串结束标志,或字符串结束符
  • 处理字符串时,会从前往后逐个扫描字符,一旦遇到'\0'就认为到达字符串的末尾,结束处理。

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

👽使用

  • 示例1:整体赋值字符串

    • 自动添加'\0',过程在后台默默地进行的,因此要注意字符串表面长度应比数组长度小一,如 "abcdfg" 表面只包含 6 个字符,其实最后隐式添加一个'\0'
    // 正确
    char str[7] = "abcdef";	
    // 错误,报错:[Error] initializer-string for array of chars is too long [-fpermissive]
    char str[6] = "abcdef";	
    
  • 示例2:逐个字符赋值

    • 不会自动添加'\0',如果是指定长度且部分元素赋值,未手动添加'\0'会导致输出错误
    // 将26个大写英文字符存入字符数组,并以字符串的形式输出
    char str[30];
    char c;
    int i;
    for(c=65,i=0; c<=90; c++,i++)
    	str[i] = c;
    cout << str << endl;	// 输出 ABCDEFGHIJKLMNOPQRSTUVWXYZ口口口口i口口0 ? 后面为初始随机值
    
    // 解决方法1:手动添加 '\0'
    char str[30];
    char c;
    int i;
    for(c=65,i=0; c<=90; c++,i++)
    	str[i] = c;
    str[i] = 0;	// 手动赋值
    cout << str << endl;
    
    // 解决方法2:数组初始化时全部赋值0(即'\0')
    char str[30] = {0};	// 初始化为全0数组
    char c;
    int i;
    for(c=65,i=0; c<=90; c++,i++)
    	str[i] = c;
    cout << str << endl;
    

👾字符串处理函数

👽准备工作

引入头文件 <string.h>

#include <string.h>

注意引入的头文件是,与C++字符串的头文件区分

#include <string.h>		// C 中使用strlen()等字符串处理函数的头文件
#include <string>		// C++ 中使用string变量的头文件

👽函数

函数目的
strcpy(s1, s2)复制字符串 s2 到字符串 s1。
strcat(s1, s2)连接字符串 s2 到字符串 s1 的末尾。
strlen(s1)返回字符串 s1 的长度。
strcmp(s1, s2)如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回值小于 0;如果 s1>s2 则返回值大于 0。
strchr(s1, ch)返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。
strstr(s1, s2)返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。

👽使用

  • 示例1:字符串长度

    #include <string.h>
    
    char str[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    cout << strlen(str);
    

    strlen() 函数不会统计字符串结束标志 '\0'

  • 示例2:字符串拷贝、连接

    #include <string.h>
    
    char str1[13] = "runoob";
    char str2[13] = "google";
    char str3[13];
    
    // 复制 str1 到 str3
    strcpy(str3, str1);
    cout << "strcpy(str3, str1) : " << str3 << endl;
    
    // 连接 str2 到 str1 结尾
    strcat(str1, str2);
    cout << "strcat(str1, str2): " << str1 << endl;
    cout << "strlen(str1) : " << strlen(str1) << endl;
    
    strcpy(str3, str1) : runoob
    strcat(str1, str2): runoobgoogle
    strlen(str1) : 12
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值