阿里云备案网站是空的,重庆短视频seo搜索多少钱,专业制作app的公司,青岛互联网公司排名文章目录数组1、什么是数组2、数组的声明3、数组的初始化4、数组的访问5、二维数组6、memset —— 给数组中每一个元素赋同样的值字符串#xff08;字符数组#xff09;1、string.h 头文件1.1 strlen()1.2 strcmp()1.3 strcpy()1.4 strcat()string 类简介1、C11 字符串初始化…
文章目录数组1、什么是数组2、数组的声明3、数组的初始化4、数组的访问5、二维数组6、memset —— 给数组中每一个元素赋同样的值字符串字符数组1、string.h 头文件1.1 strlen()1.2 strcmp()1.3 strcpy()1.4 strcat()string 类简介1、C11 字符串初始化2、赋值、拼接和附加3、string 头文件3.1 string 中内容的访问3.2 string 的比较3.3 length()/size()3.4 insert()3.5 erase()3.6 clear()3.7 substr()3.8 string::npos3.9 find()3.10 replace()结构体1、结构体的定义和使用2、结构体变量的初始化3、结构体数组共用体1、什么是共用体2、共用体的用途枚举1、枚举的定义2、枚举的使用3、设置枚举量的值4、枚举的取值范围数组
1、什么是数组
数组是一种数据格式能够存储多个同类型的值。
数组的特点
数组中的元素按线性方式排列可以通过编号来访问数组中的每个元素每个值都存储在一个独立的数组元素中计算机在内存中依次存储数组的各个元素 2、数组的声明
要创建数组可使用声明语句。数组声明应指出以下三点
存储在每个元素中的值的类型数组名数组中的元素个数
格式为数据类型 数组名[数组大小];
注意数组大小必须是整数常量不可以是变量。 3、数组的初始化 C 允许在声明语句中初始化数组元素只需提供一个用逗号分隔的值列表初始化列表并将它们用花括号括起来可省略等号 int arr[4] {3, 6, 8, 10};
int arr[4] {3, 6, 8, 10}; // C11 新增只有在定义数组时才能使用初始化此后就不能使用了也不能将一个数组赋给另一个数组 int arr[4] {3, 6, 8, 10}; // 正确int hand[4];
hand[4] {3, 6, 8, 10}; // 错误
hand arr; // 错误初始化数组时提供的值可以少于数组的元素数目。如果对数组的一部分进行初始化则编译器将把其他元素设置成0。若想初始化数组为0则只需要显式将第一个元素初始化为0即可 int arr[4] {3, 6}; // 第1个元素3第2个元素6其他元素为0
int arr[4] {0}; // 所有元素初始化为0
int arr[4] {}; // C11新增所有元素初始化为0如果初始化数组时方括号内[]为空C 编译器将计算元素个数 int arr[] {3, 6, 8, 10}; // 编译器会自动识别元素个数为4列表初始化禁止缩窄转换 long plifs[] {25, 92, 3.0}; // 错误浮点数转换为整型是缩窄操作
char slifs[4] {h, i, 1122011, \0}; // 错误1122011超过了char变量的取值范围
char tlifs[4] {h, i, 112, \0}; // 正确虽然112是一个int值但在char类型的取值范围4、数组的访问
int arr[indx];
其中 indx 为数组的索引下标范围为 0 ~ length-1数组长度 length sizeof(arr) / sizeof(int)。这里的 sizeof 之前的文章介绍过它返回变量或数据类型的字节个数。因为 arr 为 int 型数组里面每一个元素都是 int 类型所以 sizeof(arr) 表示所有元素的字节数sizeof(int) 表示一个元素的字节数两者之商就是元素的个数。
注意如果数组大小较大大概 10610^6106 级别则需要将其定义在主函数外面否则会使程序异常退出。因为函数内部申请的局部变量来自系统栈允许申请的空间较小而函数外部申请的全局变量来自静态存储区允许申请的空间较大。 5、二维数组
声明二维数组
数据类型 数组名[m][n];
m 表示二维数组有多少个一维数组n 表示每个一维数组的元素个数。 二维数组初始化 创建二维数组时可以初始化其所有元素二维数组初始化是建立在一维数组初始化技术的基础之上提供由逗号分隔的用花括号括起的值列表。 int scores[3][4] {{},{},{}
};注意二维数组的行数个数必须全部用大括号指定不能省略否则编译出错【例如上面的 scores 数组我省略三个大括号中的一个是不行的】
6、memset —— 给数组中每一个元素赋同样的值
给数组中每一个元素赋相同的值有两种方法memset 和 fill
memset 函数的格式为memset(数组名, 值, sizeof(数组名));。需要引入 string.h 头文件。
只建议初学者为数组赋 0 或 -1。因为 memset 使用的是按字节赋值并不是按元素赋值很容易出错。如果想按元素赋值可以使用 fill 函数此时需要引入 algorithm 头文件。 字符串字符数组 字符串是存储在内存连续字节中的一系列字符又可以称为字符数组 C 处理字符串有两种方式一种是 C 语言风格另一种是基于 string 类 可以将字符串存储在 char 数组中每个字符都位于自己的数组元素中 C 语言风格的字符串是以空字符结尾空字符被写作 \0ASCII 码为 0用来标记字符串的结尾。处理字符串的函数都是根据空字符的位置而不是数组长度来进行处理 存储字符串 “Kitty” 的情况为char name[6] {K, i, t, t, y, \0}; 字符数组初始化为字符串可以使用双引号将字符串内容括起来【仅限于初始化程序其他位置不允许这样直接赋值整个字符串】 char name[16] Hello Kitty;
char name[] Kitty;注意字符常量和字符串常量的区别 S 是字符常量S 是字符串常量存储的是 [S, \0]。 1、string.h 头文件
1.1 strlen()
strlen(字符数组)获得字符数组中第一个 \0 之前的字符个数。
1.2 strcmp()
strcmp(字符数组1, 字符数组2)返回两个字符串大小的比较结果比较规则是字典序。
字符数组1 字符数组2返回一个负整数字符数组1 字符数组2返回一个正整数字符数组1 字符数组2返回0
1.3 strcpy()
strcpy(字符数组1, 字符数组2)把字符数组2复制到字符数组1覆盖复制这里的复制还包括结束符 \0。
1.4 strcat()
strcat(字符数组1, 字符数组2)把字符数组2拼接到字符数组1后面两者之间的结束符会被覆盖。 string 类简介
除了使用字符数组之外还可以使用 string 来存储字符串而且 string 使用起来会比字符数组要简单。
要使用 string必须包含头文件 string。 1、C11 字符串初始化
C11 允许将列表初始化用于 C 风格字符串和 string 对象
char first_data[] {Hello World};
char second_data[] {The Elegant Plate};
string third_data {Hello World};
string third_data {Hello World};string str {h, e, l, l, o};
string str hello world;2、赋值、拼接和附加 不能将一个数组直接赋给另一个数组但是可以将一个 string 对象直接赋给另一个 string 对象 char ch[20] hello;
string str world;char ch1[20];
ch1 ch; // 错误
string str1;
str1 str; // 正确string 简化了合并操作可以使用运算符 来将两个 string 对象合并起来还可以使用 运算符。 string str2 str str2;
string str str2;3、string 头文件
虽然 string 类也可以使用 C 中的头文件 string.h但是 C 为了更好地使用 string也提供了自己的 string 操作函数。
3.1 string 中内容的访问 直接像数组那样通过下标访问 string string str abc;
cout str[0] endl; // 要读入或输出整个字符串只能使用 cin 和 cout// 还可以用 c_str() 将 string 类型转换为字符数组然后用 printf 输出
printf(%s\n, str.c_str());通过迭代器访问 string str abc;
string::iterator it str.begin();
// 上一句为了简便还可以写成
auto it str.begin();3.2 string 的比较
两个 string 类型可以直接使用 关系运算符 进行比较比较规则是字典序
3.3 length()/size()
str.length()/str.size()返回字符串 str 的长度即存放的字符数
3.4 insert()
str.insert(pos, string)在字符串 str 的 pos 号位置插入字符串 stringstr.insert(it, it1, it2)it 为原字符串欲插入的位置it1 和 it2 为待插字符串的首尾迭代器用来表示子串 [it1, it2) 将被插入到 it 的位置上
3.5 erase()
str.erase(it)删除迭代器 it 所在位置的元素str.erase(begin, end)删除一个区间 [begin, end) 内的所有元素str.erase(pos, length)pos 为开始删除的其实位置length 为删除的字符个数
3.6 clear()
str.clear()清空 string 中的数据
3.7 substr()
str.substr(pos, length)返回从 pos 号位开始、长度为 length 的子串
3.8 string::npos
一个常数其本身的值为 -1但由于是 unsigned_int 类型因此实际上也可以被认为是 unsigned_int 类型的最大值。string::npos 用来作为 find 函数失配时的返回值。
3.9 find()
str.find(str1)当 str1 是 str 的子串时返回其在 str 中第一次出现的位置如果不是则返回 string::nposstr.find(str1, pos)从 str 的 pos 号位开始匹配 str1返回值与上相同
3.10 replace()
str.replace(pos, length, str1)把 str 从 pos 号位开始、长度为 length 的子串转换为 str1str.replace(it1, it2, str1)把 str 的迭代器 [it1, it2) 范围的子串替换为 str1 结构体
结构体是由一批不同类型数据组合而成的一种新的数据类型组成结构体数据的每个数据称为结构体的“成员”域、元素通常用来表示类型不同但是又相关的若干数据。 1、结构体的定义和使用
struct 结构体名字 {char name[20]; // 一些基本的数据结构或者自定的数据类型int age;...
}[结构体变量1, 结构体变量2, ...]; // [] 中的是可选项结构体里面可以定义除了自己之外的任何数据类型因为定义自己本身会引起循环定义的问题但是可以定义自身类型的指针变量。 假设结构体名字为 student依次创建结构体类型的变量 struct student stu, *stup; // stu 为结构体变量stup 为结构体指针变量两者访问变量方式不同
student stu;访问结构体类型变量成员 cout stu.name; // 普通变量的访问方式
cout stup-name; // 指针变量的访问方式2、结构体变量的初始化
使用逗号分隔值列表并将这些值用花括号括起来值之间用逗号分开
student stu {cat, 19};
student stu {dog, 18};
student stu {};3、结构体数组 可以创建元素为结构体的数组方法和创建基本类型数组完全相同 student stus[20];
cin stus[0].name;
cout stus[19].age endl;结构体数组初始化 student stus[2] {{cat, 19},{dog, 18}
};共用体
1、什么是共用体
共用体联合体是一种数据格式它能够存储不同的数据类型但只能同时存储其中的一种类型。例如一个共用体中定义了 int 和 double 类型的变量存储了 int 型数据之后再存储 double 型数据此时 int 型数据会丢失。
union one4two{int id_int;long id_long;};one4two pail;pail.id_int 3;cout pail.id_int endl; // 3pail.id_long 3000;cout pail.id_long endl; // 3000cout pail.id_int endl; // 3000共用体的句法与结构体相似但是含义不同共用体的长度为其最大成员的长度
union one4all
{char char_val;short short_val;int int_val; // one4all 的长度就是 int 类型的长度
};2、共用体的用途
共用体的用途之一是当数据项使用两种或更多种格式但不会同时使用时可节省空间。
假设管理一个小商品目录其中有一些商品的ID为整数而另外一些的ID为字符串
struct widget
{char brand[20];int type;union id{long id_num;char id_char[20];} id_val;
};
...
widget prize;
...
if (prize.type 1) {cin prize.id_val.id_num;
} else {cin prize.id_val.id_char;
}匿名共用体anonymous union没有名称其成员将成为位于相同地址处的变量。显然每次只有一个成员是当前的成员
struct widget
{char brand[20];int type;union{long id_num;char id_char[20];};
};
...
widget prize;
...
if (prize.type 1) {cin prize.id_num;
} else {cin prize.id_char;
}由于共用体是匿名的因此 id_num 和 id_char 被视为 prize 的两个成员它们的地址相同所以不需要用中间标识符 id_val 。程序员负责确定当前哪个成员是活动的。
共用体常用于但并非只能用于节省内存。 枚举
前文提到过符号常量使用 const 和 #define 进行定义。C 的枚举类型 enum 提供了另一种创建符号常量的方式可以代替 const它还允许定义新类型。 1、枚举的定义
enum 枚举名 {枚举量1, 枚举量2, ...};// 例子如下red为0依此类推数值加1。即 orange 为1yellow 为2...
enum colors {red, orange, yellow, green, blue, purple};2、枚举的使用
// 使用枚举名声明该类型的变量
colors band;// 只能将定义枚举时使用的枚举量赋值给这种枚举的变量
band red;
// band 5; // 错误// 可以通过强制类型转换将有效的 int 值转换成枚举量
band colors(4);// 枚举量是整型可被提升为 int 类型但 int 类型不能自动转换为枚举类型
int col blue;
col 3 red;3、设置枚举量的值 可以使用赋值运算符来显式地设置枚举量地值指定地值必须是整数 enum bits{one 1, two 2, four 4, eight 8};也可以只显式地定义其中一些枚举量的值 enum bigstep{first, second 100, third}; // first 为0third 为101first 默认情况下为0后面没有初始化的枚举量的值比其前面的枚举量大1third 的值为 101。 可以创建多个值相同的枚举量 enum{zero, null 0, one, numero_uno 1}; // 这里 zero 也为0one 也为14、枚举的取值范围 每个枚举都有取值范围通过强制类型转换可以将取值范围中的任何整数赋值给枚举变量即使这个值不是枚举值 enum bits{one 1, two 2, four 4, eight 8};
bits myflag bits(6);枚举取值范围 上限寻找第一个大于枚举量最大值的2的幂次方上限就是这个值减1 例如最大枚举量为 101第一个大于它的是 271282^7 12827128所以上限就是 128−1127128 - 1 127128−1127。 下限枚举量最小值为0则下限为0否则寻找第一个小于它的2的幂次方加上1 例如最小枚举量为 -6第一小于它的是 −23−8-2^3 -8−23−8因此下限为 −81−7-8 1 -7−81−7。