C/C++知识总结 五 复合数据类型 壹(数组、字符串与string、结构)

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++语言字符串处理函数

  1. puts()函数——输出字符串的函数
char str[]={"China\nBejing"};
puts(str);

输出//Chin  a
   //Bejing
  1. gets()函数——从键盘输入向字符中的输入函数
get(str);
从键盘输入: Computer 
则 Computer被存入str中
  1. strcat(str1,str2)——字符串拼接函数//作用是将字符串str2,拼接并放入到str1数组中(但是前提是str1要足够能够装下str1和str2)
  1. strcpy(str1,str2)与strncpy(str1,str2,n)
    注意strcpy() 是str2复制到str1(必须自己保证str1的空间可以装下str2).
    而strncpy() 则是已经确定最多只能复制str2中n个字符到str1中。
  2. strcmp(str1,str2)——字符串比较函数
    根据ASCLL码比较大小,在比较时通过对应字母从前往后一个一个比较 只要有一个字符ASCLL码大的为大
    如果str1=str2则函数返回值为0
    如果str1>str2则函数返回值为正数
    如果str1<str2则函数返回值为负值
  3. 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;
}

结构与指针
概述:

结构与指针的关系有三方面

  1. 可以在结构定义中把指针作为成员函数
 struct inflatable //定义结构inflatable
{
    int * ptr; //结构成员为指针
};
  1. 可以把指针 定义为结构变量
#include<iostream>
using namespace std;

struct inflatable //定义结构inflatable
{
    int * ptr;
};

int main()
{
    inflatable *p;
    p->ptr=NULL;

    return 0;
}
  1. 可以使用 指针去(注意该指针的类型) 指向结构变量,从而访问结构的成员
#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;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值