C/C++复合数据类型 壹(数组、结构)
数组
- 数组的意义、定义与创建
- 一、二维数组应用
- 字符数组与字符串处理函数
- 数组与指针———关系密切
- 数组的意义与定义创建
意义:反映数据间的特点(通过把同一类数据归纳,就形成了数组)和提高处数据的效率(通过数组与循环二者相配合,可以快速处理大量数据)
定义:一个数组元素是同一种数据类型的有序集合,数组通过下标运算符 [] 来访问数组中的元素,数组元素的序号数比数组元素下表数大1⃣️,数组中的元素是连续排列的,二维数组一是连续排列的
一维数组的创建:先声明后使用。格式为 数据类型 数组名[n](例如:int ar[10],创建一个10个元素的数组),可以通过 数组名[x] 来访问数组的第x+1个元素注意使用数组不要越界否则可能会使程序崩溃。
数组的初始化:1. 通过循环遍历数组,从而初始化。2. 通过初始化列表去初始化(int ar[3]={1,2,3},)这时可省去 数组名后[]中的参数(因为系统可以根据数组初始化列表的参数去推断个数),还有如果只给初始化列表中的前几个元素赋值,其他值会被自动初始化为零二维数组亦是同理。
二维数组的创建:与一维数组创建相似,格式为:数组名[m][x],其中m表示行数,n表示列数,可以通过for循环去遍历数组。
初始化详解:
- 直接初始化方式
int array1[2][3] = {1,2,3,4,5,6}; //定义时直接初始化
int array2[][3] = {1,2,3,4,5,6}; //根据给出的初始化列表元素个数,编译器自动填补“行”
int array3[2][] = {1,2,3,4,5,6}; //根据给出的初始化列表元素个数,编译器自动填补“列”
- 赋值方式
int array4[2][3]; //默认未被初始化(除非为全局数组),元素值未知
for(int i=0; i<2; i++) //行
for(int j=0; j<3; j++) //列
array4[i][j] = i*j+j;
- 部分初始化
int array5[2][3] = {{1,2,3}}; //理论上应该使用这种形式,一目了然,但是注意内部每个花括号的元素个数一定要等于列数;其它未给出值的数组元素默认初始化为0
int array5[2][3] = {1,2,3}; //此方式也可行;其它未给出值的数组元素默认初始化为0
三维数组与二维数组相似格式如下:数组名[a][b][c]
深入理解二三位数组
:C/C++中,其实根本不存在二维数组这样一种数据类型,它其实是数组元素同样为数组的等效,因此我们可以把二维数组看成是数组的数组。
二维数组有多种创建方式,可根据不同的应用场景进行切换,还可以吧二三维数组当成一维数组用。
数组的优缺点
- 优点:顺序存储,快速访问
缺点:
需要时刻检查是否越界,一旦越界,整体程序有可能崩溃;
数组规模事先要确定,后续不可变化;
可能会浪费掉内存空间;
事先要清楚系统 平台所支持的最大栈数组,一般情况下不建议超过4MByte
字符数组与字符串处理函数
字符数组概述:字符型数据以ASCII码代码存储在存储单元中,一般占一个字节。由于ASCII代码也是雨整数行,因此可以把字符型归纳为整形类型中的一种。(在C语言中没有字符串类型,而C++中却有string类型可以定义字符串类型)
- 注意:在数组中 '\0’为字符串结束标志符系统自动添加
//字符串数组初始化举例
char c[10]={'I','a','m',' ','a','b','o','y'} //只初始化了前8个后两个没有初始化的全部设置为 '\0'
char diamond[5][5]={
{' ',' ','*'}, {' ','*',' ','*'},{ },{ },{ }
} //只初始化数组第一排第二排,只要有一个元素初始化,其他都会被默认初始化为 '\0'
// scanf 输入,printf 输出
//scanf 对字符类型有 %c 和 %s 两种格式(printf 同理,下同),其中 %c 用来
//输入单个字符,%s 用来输入一个字符串并存在字符数组里。%c 格式能识别 空格 跟 换行
//并将其输入,而 %s 通过 空格 或 换行 来识别一个字符串的结束。
//示例:
#include<stdio.h>
int main()
{
char s[10];
scanf("%s",str);
printf("%s",str);
return 0;
}
输入:TAT TAT TAT
输出:TAT
C/C++语言字符串处理函数
- puts()函数——输出字符串的函数
char str[]={"China\nBejing"};
puts(str);
输出//Chin a
//Bejing
- gets()函数——从键盘输入向字符中的输入函数
get(str);
从键盘输入: Computer
则 Computer被存入str中
- strcat(str1,str2)——字符串拼接函数//作用是将字符串str2,拼接并放入到str1数组中(但是前提是str1要足够能够装下str1和str2)
- strcpy(str1,str2)与strncpy(str1,str2,n)
注意strcpy() 是str2复制到str1(必须自己保证str1的空间可以装下str2).
而strncpy() 则是已经确定最多只能复制str2中n个字符到str1中。- strcmp(str1,str2)——字符串比较函数
根据ASCLL码比较大小,在比较时通过对应字母从前往后一个一个比较 只要有一个字符ASCLL码大的为大
如果str1=str2则函数返回值为0
如果str1>str2则函数返回值为正数
如果str1<str2则函数返回值为负值- strlwr(字符串)、strupr(字符串)分别把字符串转换为小写、大写
数组与指针
概述:数组与指针关系密切.数组名为地址可以用于给指针赋值,又可以通过 取地址运算符& 作用于数组元素,这样可以获取该元素的地址,用与指针赋值,而指针又可以通过 指针运算 去访问甚至是改变数组元素值。数组的元素又可以是指针
结构
- 结构存在的意义
- 定义结构并应用
- 定义结构数组并应用
结构存在的意义
在之前的学过的数据类型中,如 基本类型(int、double、char string)数组 共用体等均只能存储一种数据类型,结构体的存在可以同时存储多种数据类型。结构是用户定义的类型,所以要想使用它就必须第一步先定义这个 结构类型,第二步再通过这个结构类型去声明 一个结构变量(结构对象)。
定义结构并应用
#include<iostream>
using namespace std;
//使用结构第一步
//注意结构必须定义在main函数外边,在main函数内声明使用
struct jie_gou_ming
{
//里边可以包含各种数据类型
int a;
double b;
char c[10];
};
int main()
{
//声明结构变量 并进行列表{}初始化
jie_gou_ming bian_liang={
10,
3.9,
{"Hollow"}
};
//访问结构变量(通过'.'运算符来访问)成员并赋值
cout<<bian_liang.a<<endl;
bian_liang.a=100;
cout<<bian_liang.a<<endl;
cout<<bian_liang.c<<endl;
return 0;
}
//第二步声明结构变量并初始化
- 创建无名结构
#include <iostream>
using namespace std;
//创建无名结构并且直接声明(无名结构的)结构变量,并对她它进行初始化
struct
{
double a;
char ar[8]={"Good"};
} bian_liang={
10.9,
"boy"
};
int main()
{
cout<<bian_liang.ar; //结构成员的调用
return 0;
}
定义结构数组并应用
- 概述
结构数组指的是 可以用自己定义的结构类型去声明一个数组(这样做一次可以声明多个 结构变量),该数组的元素为 结构变量,所以该数组就叫 结构数组,数组中的每一个元素都可以访问它自己的成员。
- 声明结构数组
#include<iostream>
using namespace std;
struct inflatable //定义结构inflatable
{
char name[20];
float volume;
double price;
};
int main()
{
//声明结构数组并初始化结构数组(通过初始化列表)
inflatable guests[2]={
{"Bob",0.5,99},
{"xiao ming",1.5,100}
};
cout<<guests[0].name<<endl;//调用成员函数
cout<<guests[1].name<<endl;
//赋值
guests[1].price=666;//赋值修改
cout<<guests[1].price;
return 0;
}
结构与指针
概述:
结构与指针的关系有三方面
- 可以在结构定义中把指针作为成员函数
struct inflatable //定义结构inflatable
{
int * ptr; //结构成员为指针
};
- 可以把指针 定义为结构变量
#include<iostream>
using namespace std;
struct inflatable //定义结构inflatable
{
int * ptr;
};
int main()
{
inflatable *p;
p->ptr=NULL;
return 0;
}
- 可以使用 指针去(注意该指针的类型) 指向结构变量,从而访问结构的成员
#include<iostream>
using namespace std;
struct inflatable //定义结构inflatable
{
int * ptr;
};
int main()
{
inflatable *p;
inflatable Guest={
NULL
};
p=&Guest; //将指针指向Guest的地址
p->ptr;//用指针访问Guest的成员ptr;
return 0;
}