C++基础入门教程(三):数组、字符串、结构体、共用体

今天的标题取得..好严肃的感觉。(小若:咳噗)

这章的内容虽然还是很详(lao)细(dao),但已经开始有很多值得记录的内容了~
那么,今天就来初次介绍数组与字符串…以及结构体..还有共用体..吧。

1.数组

我记得大四实习的时候,请教同事:“什么是属主?”(其实是和数据库相关的东西)
然后同事惊讶地说道:“啊,你连数组都不知道..这,基础还是要好好补补…呐,数组的意思呢,是这样的…”
我听着听着就不对劲,“等等,这是数组…其实我是问这个属主…”
然后同事松了一口气,估计心里在想,“唉,吓死我,我以为来了个浑水摸鱼的实习生了”。
 
等等,我好像跑题了。
那么,数组这么简单,我是不可能给大家介绍的了。
随便说说它的声明和初始化吧,如下代码:

代码如下:

// 1.普通人的声明和初始化
int nums[3] = {25, 65, 4};
// 2.只声明
int num[3];  // 这样数组里的元素值是未知的
// 3.只声明,然后赋值
int num[3];
num[0] = 1;
num[1] = 34;
num[3] = 9;
// 4.文艺青年的初始化
int nums[3] = {89}; // 第0个元素赋值为89,其他默认为0
int nums[3] = {};   // 所有元素的值都为0
// 5.非主流青年的初始化
int nums[] = {1,2,3,4,5}; // 不指定大小,由后面的赋值内容决定数组大小,书上说不推荐,我本人不评价~
// 6.新人类的初始化(C++11)
int nums[3] {1, 2, 3}; // 省略了等号

代码里已经把大部分的情况都列出来了~
关于第3条的第二种,其实也是C++11的新特性。
 
最后,对于第6条这种的话,也是C++11的新东西,我个人不太喜欢~
这可能会让不熟悉C++的人觉得很生疏(比如别人只是迫不得已要看一段C++代码,结果出来了这句,可能会一下子蒙住)。
而其他的形式即使没有学过C++的人也能很轻易地知道这是在定义一个数组。(好吧,随便说说的)

2.字符串

字符串有两种,一种是C风格的字符串,另一种是string(可以说是一个类了)
C风格字符串和数组很像,如下代码:

代码如下:

// 1.聪明人的初始化
char name[] = "mutou";
// 2.笨蛋的初始化
char name[6] = "mutou";
// 3.蛇精病的初始化
char name[6] = {'m', 'u', 't', 'o', 'u', '\0'};

这种风格的字符串就相当于char类型的数组了,但是它需要在最后加一个'\0'作为结束符(学过C的都知道喇)

我想,正常人都会使用第一种方式的(除非特殊情况?我还真不知道),”mutou”称之为字符串常量,后面会自动给数组补上一个'\0'符号的。

接着就是string字符串了,使用方式如下:

代码如下:

// 1.先声明,再初始化
std::string name;
name = "mutou";
// 2.声明和初始化
std::string name = "mutou";
// 3.复制其他字符串内容
std::string name1 = "mutou;
std::string name2 = "hello";
name1 = name2;   // 此时name1为"mutou"
name2 = "nihao"; // 此时name2为"nihao",name1仍然为"mutou"
// 4.连接字符串
std::string name = "mutou";
name += "hehe";

string在头文件string里,所以使用的时候要加上 #include <string>。
并且它属于命名空间std,所以也要加上std::
 
string字符串用起来很舒服,就像是本就该这么用的那种感觉~
如果使用C风格字符串,那么,复制字符串和连接字符串都会变得很麻烦(需要使用strcpy和strcat函数来完成)

3.原始字符串

还有一个比较有意思的字符串,叫做原始字符串。
我们都知道,字符串是用双引号来包围的,如果要在字符串中出现其他双引号,就要用转义字符\。
而使用原始字符串就可以避免这种麻烦,如下代码:

代码如下:

std::string name1 = R"("mutou")";
std::string name2 = R"*(("mutou"))*";
std::cout << name1.c_str() << "\n";
std::cout << name2.c_str() << "\n";

输出结果如下:

代码如下:

“mutou”
(“mutou”)

使用R开头,再用“(和)”符号把字符串包围起来,那么,中间的字符串就可以使用双引号等原本需要转义的字符了。
那么,name2字符串又是怎么回事呢?这是为了解决恶性循环的问题——如何在原始字符串里使用额外的 ( 字符呢?
于是,我们可以在“(中间添加一个*号,在)”中间也添加一个*,也就是变成这样:R”*(…..中间很多字符串….)*”
于是就可以在字符串中间使用 ( 等字符了。
其实不一定得加*号,可以加其他东西,而且可以加好几个,随你喜欢,但也有限制,不能加空格、左右括号、斜杠和控制字符。

4.结构体

结构体应该算是类的前身吧~
比较简单,不多说了,随便看看:

代码如下:

// 定义
struct BadMan
{
    char name[]; // 也可以使用 std::string name; 但可能有些编译器不支持
    int age;
    long money;
};
// 使用
BadMan man1 =
{
    "mutou",
    18,
    99999999
};
man1.money = 88888888;

好吧,不多说了~

5.共用体

人格分裂听过吗?
没听过吧~人格分裂就是好几个人的灵魂存在于同一个身体里,同时只能有一个灵魂在控制身体。(小若:瞎说~!)
 
C++也有这样的东西,那就是共用体,看代码:

代码如下:

union ManyOne
    {
        int age;
        long money;
        float girl;
    };
    ManyOne mOne;
    mOne.age = 25;
    std::cout << mOne.age << "\n\n";
    mOne.money = 999990;
    std::cout << mOne.age << "\n";
    std::cout << mOne.money << "\n";

输出结果是:

代码如下:

25
999990
999990

共用体和struct很像,唯一有一点区别,那就是,共用体里的属性只能同时存在一个。

比如刚刚的代码,虽然age在之前赋值为25,但是一旦给其他属性赋值,那么age的值将不被保留。
因为他们使用的是同一个空间,这点要记住。

因为共用体的所有属性都是使用一个存储空间的,所以共用体占内存的大小是以需要最大存储空间的成员为准的。
 
也许第一次听说共用体的人会迷糊,其实共用体可以想象成是一个变量有多个名字,我们可以用不同的名字去使用它们。

只不过,这不同的名字有着不相同的类型摆了。

6.结束

嗯,这本书实在是太详(lao)细(dao)了,第四章还在继续进行中。(小若:你觉得和你比起来,谁更唠叨?)

(0)

相关推荐

  • C/C++语言中结构体的内存分配小例子

    当未用 #pragma 指令指定编译器的对齐位数时,结构体按最长宽度的数据成员的宽度对齐:当使用了 #pragma 指令指定编译器的对齐位数时,结构体按最长宽度的数据成员的宽度和 #pragma 指令指定的位数中的较小值对齐. #pragma 指令格式如下所示:#pragma pack(4)     // 或者 #pragma pack(push, 4) 举例如下:(机器字长为 32 位)    struct    {        char a;    }test;    printf("%d

  • 浅析C++中结构体的定义、初始化和引用

    定义:结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构. 声明一个结构体类型的形式是: 复制代码 代码如下: struct Student{      //声明一个结构体类型Student  int num;         //声明一个整形变量num  char name[20];   //声明一个字符型数组name  char sex;        //声明一个字符型变量sex  int age;         //声明一个整形变量age  float

  • 详解C++中的指针结构体数组以及指向结构体变量的指针

    C++结构体数组 一个结构体变量中可以存放一组数据(如一个学生的学号.姓名.成绩等数据).如果有10个学生的数据需要参加运算,显然应该用数组,这就是结构体数组.结构体数组与以前介绍过的数值型数组的不同之处在于:每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员项. 定义结构体数组和定义结构体变量的方法相仿,定义结构体数组时只需声明其为数组即可.如: struct Student //声明结构体类型Student { int num; char name[20]; char sex; i

  • 详解C++程序中定义struct结构体的方法

    什么是结构体? 简单的来说,结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型,它的特点和数组主要有两点不同,首先结构体可以在一个结构中声明不同的数据类型,第二相同结构的结构体变量是可以相互赋值的,而数组是做不到的,因为数组是单一数据类型的数据集合,它本身不是数据类型(而结构体是),数组名称是常量指针,所以不可以做为左值进行运算,所以数组之间就不能通过数组名称相互复制了,即使数据类型和数组大小完全相同. 结构体的定义 定义结构体使用struct修饰符,例如: struc

  • 一道超经典的C++结构体的题目

    题目描述:有10个学生,每个学生的数据包括学号.姓名.英语.数学.物理三门课的成绩,从键盘输入10个学生数据,要求打印出3门课程的总平均成绩,以及最高分的学生的数据(包括学号,姓名,3门课的平均成绩,平均分数). c++代码: 复制代码 代码如下: #include<iostream>#include<string>using namespace std;struct Student{//声明结构体Student string num; string name; float eng

  • C与C++中结构体的区别

    C中的结构体和C++中结构体的不同之处:在C中的结构体只能自定义数据类型,结构体中不允许有函数,而C++中的结构体可以加入成员函数. C++中的结构体和类的异同: 一.相同之处:结构体中可以包含函数:也可以定义public.private.protected数据成员:定义了结构体之后,可以用结构体名来创建对象.但C中的结构体不允许有函数:也就是说在C++当中,结构体中可以有成员变量,可以有成员函数,可以从别的类继承,也可以被别的类继承,可以有虚函数. 二.不同之处:结构体定义中默认情况下的成员是

  • 深入剖析C++中的struct结构体字节对齐

    什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同.一些平台对某些特定类型的数据只能从某些特定地址开始存取.比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证

  • C++结构体用法实例分析

    本文实例讲述了C++结构体用法.分享给大家供大家参考.具体分析如下: C++结构体提供了比C结构体更多的功能,如默认构造函数,复制构造函数,运算符重载,这些功能使得结构体对象能够方便的传值. 比如,我定义一个简单的结构体,然后将其作为vector元素类型,要使用的话,就需要实现上述三个函数,否则就只能用指针了. 复制代码 代码如下: #include <iostream>  #include <vector>   using namespace std;  struct ST  {

  • C++结构体数组详细解析

    1.定义结构体数组 和定义结构体变量类似,定义结构体数组时只需声明其为数组即可.如: 复制代码 代码如下: struct Student{     int num;     char name[20];     char sex[5];     int age;     float score;     char addr[30];};Student stu[3]; //定义Student类型的数组stu 2.结构体数组的应用举例 题目:对候选人的票的统计程序. 设有3个候选人,最终只能有一个当

  • C++中指向结构体变量的指针

    定义: 结构体变量的指针就是该变来那个所占据的内存段的起始地址.可以设一个指针变量,来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址. 设p是指向结构体变量的数组,则可以通过以下的方式,调用指向的那个结构体中的成员: (1)结构体变量.成员名.如,stu.num. (2)(*p).成员名.如,(*p).num. (3)p->成员名.如,p->num. 复制代码 代码如下: #include<iostream>#include<string>using na

随机推荐