C++基础入门(超详细)

话不多说,序言搞起来: 自从开始学老师布置的任务后,目前还是OpenCV,哈~哈。我就莫名问老师:“以后编程是用C++还是python?”,果然还是太年轻,老师说:“两们都要精通”。唉!于是乎为期两周的C++编程入门学了一遍,虽然不难,但很详细。


文章目录

    • C++基础入门
      • 1 C++初识
        • 1.1 第一个C++程序
        • 1.2 注释
        • 1.3 变量
        • 1.4 常量
        • 1.5 关键字
        • 1.6 标识符命名规则
      • 2、数据类型
        • 2.1 整型
        • 2.2 sizeof关键字
        • 2.3 实型(浮点型)
        • 2.4 字符型
        • 2.5 转义字符
        • 2.6 字符串型
        • 2.7 布尔类型bool
        • 2.8 数据的输入
      • 3、运算符
        • 3.1 算术运算符
        • 3.2 赋值运算符
        • 3.3 比较运算符
      • 4 程序流程结构
        • 4.1 选择结构
          • 4.1.1 if语句
          • 4.1.2 三目运算符
          • 4.1.3 switch语句
        • 4.2 循环结构
          • 4.2.1 while循环语句
          • 4.2.2 do...while循环语句
          • 4.2.3 for循环语句
          • 4.2.4 嵌套循环
        • 4.3 跳转语句
          • 4.3.1 break语句
          • 4.3.2 continue语句
          • 4.3.3 goto语句
      • 5.数组
        • 5.1 概述
        • 5.2 一维数组
          • 5.2.2一维数组数组名
        • 5.3 二维数组
      • 6 函数
        • 6.1 概述
        • 6.2 函数的定义
        • 6.3 值传递
        • 6.5 函数的常见形式
        • 6.6 函数的声明
        • 6.7 函数的分文件编写
      • 7 指针
        • 7.1 指针的基本概念
        • 7.2 指针变量的定义和使用
        • 7.3 指针所占用内存空间
        • 7.4 空指针和野指针
        • 7.5 const修饰指针
        • 7.6 指针和数组
        • 7.7 指针和函数
        • 7.8 案例:利用冒泡升序排序
      • 8 结构体
        • 8.1 结构体基本概念
      • 8.2 结构体的定义和使用
        • 8.3 结构体数组
        • 8.4 结构体指针
        • 8.5 结构体嵌套结构体
        • 8.6 结构体做函数参数
        • 8.7 结构体中const使用场景


C++基础入门

1 C++初识

1.1 第一个C++程序
#include<iostream>
using namespace std;
int main()
{cout << "hello world" << endl;system("pause");return 0;
}
1.2 注释
  • 单行注释://

  • 多行注释:/**/

1.3 变量

数据类型 变量名 = 变量初始值;

1.4 常量

(1)作用:记录程序中不可更改的数据

(2)定义常量的两种方式:

  • #define 宏常量:#define 常量名 常量值(通常定义在文件上方,一旦修改就会报错)
  • const修饰的变量:const 数据类型 常量名=常量值(通常在变量定义前加关键字const)
1.5 关键字

说明:在定义变量或者常量的时候,不能使用关键字

double\int\long\......
1.6 标识符命名规则

说明:给变量起名的时候要做到见名知意

(1)标识符不能是关键字

(2)标识符只能由字母、数字、下划线

(3)第一个字符必须是字符或者下划线

(4)标识符中区分大小写

2、数据类型

说明:数据类型存在的意义是给变量分配合适的内存空间

2.1 整型

区别:在于所占内存空间不同

//短整型(-32768~32767)short num1 = 32769;//输出就是一个负数-32768//整型int num2 = 10;//长整型long num3 = 10;//长长整型long long num4 = 10;cout << "num1= " << num1 << endl;cout << "num2= " << num2 << endl;cout << "num3= " << num3 << endl;cout << "num4= " << num4 << endl;
2.2 sizeof关键字

作用:利用sizeof关键字统计数据类型所占内存大小

b = sizeof(a);
2.3 实型(浮点型)

作用:表示小数

两种表示形式:

  • 1、单精度: float;占用空间:4字节;有效数字范围:7位有效数字
  • 2、双精度:double;占用空间:8字节;有效数字范围:15~16位有效数字
float f1 = 3.14f;//不加f会默认double类型的,会多一步转化cout << f1 << endl;double d1 = 3.14;cout << d1 << endl;//统计float和double所占内存空间cout <<"float占用的内存空间:"<< sizeof(float) << endl;cout << "double占用的内存空间:" << sizeof(double) << endl;//科学计数法float f2 = 3e2;//3*10^2;cout << "f2=" << f2 << endl;float f3 = 3e-2;//3*0.1^2;cout << "f3=" << f3 << endl;
2.4 字符型

作用:显示单个字符,只占用1个字节

语法:char ch=‘a’;

//1、字符型变量创建方式char ch = 'a';cout << ch << endl;//2、字符型变量所占内存空间大小cout << "char字符型所占内存:" << sizeof(ch) << endl;//3、字符型变量对应的ASCII编码cout << (int)ch << endl;
2.5 转义字符

作用:表示一些不能显示出来的ASCII字符

  • \n:换行
  • \t:水平制表:\t占用8个字符,如aaa+5个空格;aaaa+4个空格
  • \ \:代表反斜线字符“\”
2.6 字符串型

两种形式:

  • C:char 变量名[ ]=“字符串值”
  • C++:string 变量名= “字符串值”
//C风格char str[] = "hello world";cout << str << endl;//C++风格string ss = "hello C++";  //需要一个#include<string>头文件cout << ss << endl;
2.7 布尔类型bool

作用:代表真和假的值

bool类型只有两个值,占1个字节大小

  • true:真(本质是1)//非0的值都代表着真
  • false:假(本质是0)
//1、创建bool类型bool flag = true;bool flag1 = false;cout << flag << endl;cout << flag1 << endl;//2、查看内存空间cout << "bool类型所占的内存空间:" << sizeof(flag) << endl;
2.8 数据的输入

关键字:cin>>变量,从键盘上获取数据

cout << "请输入a的值:" << endl;
cin >> a;

3、运算符

3.1 算术运算符

注意:

  • 两数相除,除数不可以为0
  • 两个小数不可以进行取模运算
3.2 赋值运算符

在这里插入图片描述

3.3 比较运算符

在这里插入图片描述

4 程序流程结构

  • 顺序结构:程序按照顺序执行,不发生跳转
  • 选择结构:依据条件是否满足,有选择的执行相应的功能
  • 循环结构:依据条件是否满足,循环多次执行某段代码
4.1 选择结构
4.1.1 if语句
#include<iostream>
using namespace std;
int main()
{system("color 5F");cout << "请输入一个分数:" << endl;int score;cin >> score;//注意:if条件后面不要加分号if (score > 600)printf("你考上一本大学\n");else if(score>500)printf("你考上了二本\n");elseprintf("你什么都没有考上,二战吧\n");return 0;
}

嵌套的if语句:

案例需求:如果上述大于600考上了一本大学,如果分数大于650就可以考上双一流

	if (score > 600){printf("你考上一本大学\n");if (score > 650){printf("可以上双一流了\n");}}else if (score > 500)printf("你考上了二本\n");elseprintf("你什么都没有考上,二战吧\n");
4.1.2 三目运算符
int a = 10;int b = 20;int c = 0;c = (a > b ? a : b);cout << "c= " << c << endl;//C++中三目运算符返回的是变量,可以继续赋值(a > b ? a : b) = 66;cout << "a= " << a << endl;cout << "b= " << b << endl;

在这里插入图片描述

4.1.3 switch语句

语法:

switch(表达式)
{case 结果1:执行语句;breakcase 结果2:执行语句;break;....default:执行语句;break;
}

示例:给电影打分

cout << "请给电影打分:" << endl;int score = 0;cin >> score;switch (score){case 3: cout << "你打的电影评分是:" << score << endl; break;case 6: cout << "你打的电影评分是:" << score << endl; break;case 9: cout << "你打的电影评分是:" << score << endl; break;case 4: cout << "你打的电影评分是:" << score << endl; break;default:cout << "你打的是其他分数:" << score << endl; break;}
4.2 循环结构
4.2.1 while循环语句

语法:while(循环条件){循环语句}

注意:了解循环条件,避免死循环

//在屏幕打印0-9int num = 0;while (num < 10){cout << num << endl;num++;}

在这里插入图片描述

4.2.2 do…while循环语句

语法:do{循环语句}while{循环条件}与while的区别是先执行一次循环语句,再判断循环条件

int num = 0;
do
{cout << num << endl;num++;
} while (num < 10);
4.2.3 for循环语句

语法:for(起始表达式;条件表达式;末尾循环体){ 循环语句;}

//在屏幕打印0-9
for (int i = 0; i < 10; i++)
{cout << i << endl;
}
4.2.4 嵌套循环

作用:循环中再加一层循环

	//在屏幕打印10x10的*阵for (int i = 0; i < 10; i++){for (int j = 0; j < 10; j++){cout <<"* ";}cout << endl;}

在这里插入图片描述

示例:打印乘法口诀表

#include<iostream>
using namespace std;
int main()
{system("color 5F");for (int i = 1; i < 10; i++){for (int j = 1; j <=i; j++){cout << j << " x " << i << " = " << (i*j)<<"  ";}cout << endl;}return 0;
}

在这里插入图片描述

4.3 跳转语句
4.3.1 break语句

作用:结束循环

	//在屏幕打印10x5的*阵for (int i = 0; i < 10; i++){for (int j = 0; j < 10; j++){if(j==5)break;cout <<"* ";}cout << endl;}
4.3.2 continue语句

作用:在循环语句中,跳过本次循环中余下尚未执行的语句,继续执行下一次循环

//在屏幕输出10以内偶数for (int i = 0; i < 10; i++){if (i % 2 != 0)continue;cout << i << endl;}

在这里插入图片描述

4.3.3 goto语句

作用:goto标记之后,跳转到标记的语句

#include<iostream>
using namespace std;
int main()
{system("color 5F");//执行goto语句cout << "1.xxxxx" << endl;goto Flag;cout << "2.xxxxx" << endl;cout << "3.xxxxx" << endl;cout << "4.xxxxx" << endl;Flag:cout << "5.xxxxx" << endl;return 0;
}

在这里插入图片描述

5.数组

5.1 概述

所谓数组,就是一个集合,里面存放了相同类型的数据元素

5.2 一维数组

1、定义方式

  • 数据类型 数组名[数组长度];
  • 数据类型 数据名[数组长度]={值1,值2…};
  • 数据类型 数组名[ ]={值1,值2…};

2、数组特点

放在一块连续的内存空间,数组中每个元素都是相同的数据类型。

int main()
{system("color 5F");//1、数据类型 数组名[数组长度];int arr[5];arr[0] = 10;arr[1] = 20;arr[2] = 30;arr[3] = 40;arr[4] = 50;for (int i = 0; i < 5; i++){cout << arr[i] << " ";}cout << endl;//2、数据类型 数据名[数组长度]={值1,值2.....};//若初始化没有五个数据,剩下的将会由0填补int arr1[5] = { 10,20,30,40};for (int i = 0; i < 5; i++){cout << arr1[i] << " ";}cout << endl;//3、数据类型 数组名[ ]={值1,值2.....};int arr3[] = { 1,2,3,4,5 ,6,5,8,9};for (int i = 0; i < 9; i++){cout << arr3[i] << " ";}cout << endl;return 0;
}

在这里插入图片描述

5.2.2一维数组数组名

用途:

  • 统计整个数组在内存中的长度
  • 可以获取数组在内存中的首地址
#include<iostream>
using namespace std;
int main()
{system("color 5F");int arr[5] = { 1,2,3,4,5 };//1、通过数组名统计整个数组占用内存大小cout << "每个数组占用内存空间大小:"<<sizeof(arr) << endl;cout << "每个元素所占用的内存空间大小:" << sizeof(arr[0]) << endl;cout << "数组中元素的个数为:" << sizeof(arr)/ sizeof(arr[0]) << endl;//2、通过数组名查看首地址cout << "数组首地址为:" << (int)arr << endl;cout << "数组中第一个元素地址:" << (int)&arr[1] << endl;return 0;
}

在这里插入图片描述

练习案例:数组元素逆置

请声明一个5个元素的数组,并且将元素逆置

#include<iostream>
using namespace std;
int main()
{system("color 5F");int arr[5] = { 1,2,3,4,5 };//1、数组逆置前序列cout << "数组逆置前序列:" << endl;for (int i = 0; i < 5; i++){cout << arr[i] << " ";}cout << endl;//2、实现逆置int start = 0;int end = sizeof(arr) / sizeof(arr[0])-1;while (start < end){int temp = arr[start];arr[start] = arr[end];arr[end] = temp;start++;end--;}cout << "数组逆置之后输出:" << endl;for (int i = 0; i < 5; i++){cout << arr[i] << " ";}cout << endl;return 0;
}

在这里插入图片描述

5.3 二维数组

1、二维数组的四种定义类型:

  • 数据类型 数组名[行数] [列数];
  • 数据类型 数组名[行数] [列数]={{数据1,数据2},{数据3,数据4}};
  • 数据类型 数组名[行数] [列数]={数据1,数据2,数据3,数据4};
  • 数据类型 数组名[ ] [列数]={数据1,数据2,数据3,数据4};
#include<iostream>
using namespace std;
int main()
{system("color 5F");/*- 数据类型 数组名[行数] [列数];- 数据类型 数组名[行数] [列数]={{数据1,数据2},{数据3,数据4}};- 数据类型 数组名[行数] [列数]={数据1,数据2,数据3,数据4};- 数据类型 数组名[ ] [列数]={数据1,数据2,数据3,数据4};*///1、数据类型 数组名[行数] [列数];int arr[2][3];arr[0][0] = 1;arr[0][1] = 2;arr[0][2] = 3;arr[1][0] = 4;arr[1][1] = 5;arr[1][2] = 6;for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){cout << arr[i][j] << " ";}cout << endl;}cout << endl;//2、数据类型 数组名[行数] [列数]={{数据1,数据2},{数据3,数据4}};int arr2[2][3]={{1,2,3},{4,5,6}};for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){cout << arr[i][j] << " ";}cout << endl;}cout << endl;//3、数据类型 数组名[行数] [列数]={数据1,数据2,数据3,数据4};int arr3[2][3] = { 1,2,3,4,5,6 };for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){cout << arr[i][j] << " ";}cout << endl;}//4、数据类型 数组名[ ] [列数]={数据1,数据2,数据3,数据4};int arr4[][3] = { 1,2,3,4,5,6 };return 0;
}

2、二维数组数组名

int arr[2][3]={{1,2,3},{4,5,6}};//1、查看占用内存空间大小cout << "二维数组占用内存空间为:" << sizeof(arr) << endl;cout << "二维数组第一行占用的内存:" << sizeof(arr[0]) << endl;cout << "二维数组第一元素占用的内存:" << sizeof(arr[0][0]) << endl;cout << "二维数组的行数为:" << sizeof(arr) / sizeof(arr[0]) << endl;cout << "二维数组的列数为:" << sizeof(arr[0]) / sizeof(arr[0][0]) << endl;//2、查看二维数组的首地址cout << " 二维数组首地址: " << (int)arr << endl;cout << " 二维数组第一行元素首地址: " << (int)arr[0] << endl;cout << " 二维数组第二行元素首地址: " << (int)arr[1] << endl;

在这里插入图片描述

6 函数

6.1 概述

说明:将一段经常使用的代码封装起来,减少代码重复

6.2 函数的定义

步骤:

  • 1、返回值类型
  • 2、函数名
  • 3、参数列表
  • 4、函数体语句
  • 5、return表达式
返回值类型 函数名 (参数列表)
{函数体语句;return 表达式;
}
#include<iostream>
using namespace std;
int add(int num1, int num2)
{//num1、num2没有真正的数据。是一个形式参数,也叫形参int sum = num1 + num2;return sum;
}
int main()
{system("color 5F");//a、b有实际的值,叫实参//当函数调用时,实参的值会传递给形参int a, b;cin >> a >> b;cout <<a<<" + "<<b<< " = " << add(a, b) << endl;return 0;
}
6.3 值传递
  • 值传递就是函数调用时实参将数值传给形参
  • 值传递:如果形参发生,并不影响实参
#include<iostream>
using namespace std;
//值传递
//实现两个数字进行交换的函数//若函数不需要返回值,声明的时候可以写void
void swap(int num1, int num2)
{cout << "交换前:" << endl;cout << "num1=" << num1 << endl;cout << "num2=" << num2 << endl;int temp;temp = num1;num1 = num2;num2 = temp;cout << "交换后:" << endl;cout << "num1=" << num1 << endl;cout << "num2=" << num2 << endl;}
int main()
{system("color 5F");int a = 10, b = 20;//当做值传递的时候,函数的形参发生改变,不会影响实参swap(a, b);return 0;
}
6.5 函数的常见形式
  • 1、无参无返
  • 2、有参无返
  • 3、无参有返
  • 4、有参有返
#include<iostream>
using namespace std;
//1、无参无返
void test01()
{cout << "this is 01" << endl;
}
//2、有参无返
void test02(int a)
{cout << "this is 02 a=" << a << endl;
}
//3、无参有返
int test03()
{cout << "this is 03" << endl;return 666;
}
//4、有参有返
int test04(int a)
{cout << "this is 04 a=" << a << endl;return 888;
}
int main()
{system("color 5F");//无参无返函数调用test01();//有参无返函数调用test02(3);//无参有返函数调用int num = test03();cout << "无参有返的num=" << num << endl;//有参有返函数调用cout << "有参有返的num=" << test04(20) << endl;return 0;
}

在这里插入图片描述

6.6 函数的声明

作用:提前告诉编译器函数的存在,声明可以写多次,定义只能写一次。声明是说明存在这个函数,定义是说明这个函数如何写。

6.7 函数的分文件编写

作用:让代码结构更加清晰

步骤:

  • 1、创建后缀名为.h的头文件
  • 2、创建后缀名为.cpp的源文件
  • 3、在头文件中写函数的声明
  • 4、在源文件中写函数的定义
//在头文件中写函数的声明
#pragma once
#include<iostream>
using namespace std;
//函数声明
void swap(int a, int b);
//在源文件中写函数的定义
#include"swap.h"  //双引号是自定义头文件
void swap(int a, int b)
{int temp = a;a = b;b = temp;cout << "a= " << a << endl;cout << "b= " << b << endl;
}
//调用之后直接运行
#include<iostream>
#include"swap.h"
using namespace std;
int main()
{system("color 5F");int a = 10;int b = 20;swap(a, b);return 0;
}

7 指针

7.1 指针的基本概念

作用:可以通过指针间接访问内存

  • 内存编号从0开始记录,一般用十六进制数字表示
  • 可以利用指针变量保存地址
7.2 指针变量的定义和使用

指针定义语法: 数据类型 * 变量名;

#include<iostream>
using namespace std;
int main()
{system("color 5E");//1、定义指针int a = 10;//指针定义的语法:数据类型 * 指针变量名int * p;//让指针记录变量a的地址p = &a;cout << "a的地址为:" << p << endl;//2、使用指针//可以通过解引用的方式来找到指针指向的内存//指针前加*代表解引用,找到指针指向的内存中的数据cout << "a的值是:" << *p << endl;if (a == *p)cout << "一样" << endl;elsecout << "不一样" << endl;return 0;
}

在这里插入图片描述

7.3 指针所占用内存空间

问: 指针也是种数据类型,那么占用多少内存呢?

答: 在32位操作系统下:占4个字节空间;在64为操作系统:占8个字节

#include<iostream>
using namespace std;
int main()
{system("color 5E");int a = 10;int *p;p = &a;cout << "sizeof(int *)=" << sizeof(int *) << endl;cout << "sizeof(double *)=" << sizeof(double *) << endl;cout << "sizeof(char *)=" << sizeof(char *) << endl;cout << "sizeof(float *)=" << sizeof(float *) << endl;return 0;
}

在这里插入图片描述

7.4 空指针和野指针

(1)空指针:指针变量指向内存中编号为0的空间

用途:初始化指针变量

注意:空指针指向的内存是不可以访问的

(2)野指针:指针变量指向非法的内存空间

7.5 const修饰指针

const修饰指针有三种情况:

  • (1)const修饰指针:常量指针

    const int *p=&a;
    

    特点:指针的指向可以修改,但是指针指向的值不可以修改

    *p=20(×)

    p=&b(√)

  • (2)const修饰常量:指针常量

    int * const p=&a;
    

    特点:指针指向不可以改,指针指向的值可以改

    *p=20(√)

    p=&b(×)

  • (3)const即修饰指针又修饰常量

    const int * const p=&a;
    

    特点:指针指向不可以改,指针指向的值也不可以改

    *p=20(x)

    p=&b(×)

7.6 指针和数组

作用:利用指针访问数组元素

	int arr[10] = { 1,2,3,4,5,6,7,8,9 };int *p = arr;//arr就是数组的首地址cout << "利用指针指向第一个元素:" << *p << endl;p++;//指针偏移4个字节cout << "利用指针指向第二个元素:" << *p << endl;for(int i=2;i<10;i++){cout << *p << " ";p++;}
7.7 指针和函数

作用:利用指针作为函数参数,可以修改实参的值

#include<iostream>
using namespace std;
void swap(int *p1, int *p2)
{int temp = *p1;*p1 = *p2;*p2 = temp;cout << "swap *p1=" << *p1 << endl;cout << "swap *p2=" << *p2 << endl;
}
int main()
{system("color 5E");//地址传递int a = 10;int b = 20;cout << "a= " << a << endl;cout << "b= " << b << endl;swap(&a, &b);cout << endl << "交换后的a,b的值:" << endl;cout << "a= " << a << endl;cout << "b= " << b << endl;return 0;
}

在这里插入图片描述

7.8 案例:利用冒泡升序排序

序列:int arr[10] = { 4,2,3,6,1,8,7,9,5,1 };

#include<iostream>
using namespace std;
void bubbleSort(int *arr, int len)
{for (int i = 0; i < len; i++){for (int j = 0; j < len-i-1; j++){if (arr[j] > arr[j + 1]){int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}
int main()
{//system("color 1E");//创建一个数组int arr[ ] = { 4,2,3,6,1,5,8,7,9,1 };//求数组的长度int len = sizeof(arr) / sizeof(arr[0]);//排序前的序列cout << "排序前的序列:" << endl;for (int i = 0; i < len; i++)cout << arr[i] << " ";cout << endl;//利用冒泡排序bubbleSort(arr, len);cout << "排序后的序列:" << endl;for (int i = 0; i < len ; i++)cout << arr[i] << " ";cout << endl;return 0;
}

在这里插入图片描述

8 结构体

8.1 结构体基本概念

结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。

8.2 结构体的定义和使用

语法:struct 结构体名 {结构体成员列表};

结构体创建的方式三种:

  • (1)struct 结构体名 变量名
  • (2)struct 结构体名 变量名={成员1值,成员2值…}
  • (3)定义结构体是顺便创建变量
#include<iostream>
#include<string>
using namespace std;
//创建学生数据类型:学生包括(姓名,年龄,分数)
struct Student
{//成员列表//姓名string name;//年龄int age;//分数int score;
}s3;  //3、定义结构体是顺便创建变量int main()
{system("color 5E");//1、struct 结构体名 变量名struct Student s1;s1.name = "张铁蛋";s1.age= 23;s1.score = 100;cout << "姓名:" << s1.name << " 年龄:" << s1.age << " 分数:" << s1.score << endl;//2、struct 结构体名 变量名={成员1值,成员2值......}struct Student s2 = { "徐铁柱",24,100 };cout << "姓名:" << s2.name << " 年龄:" << s2.age << " 分数:" << s2.score << endl;s3.name = "憨憨";s3.age = 23;s3.score = 99;cout << "姓名:" << s3.name << " 年龄:" << s3.age << " 分数:" << s3.score << endl;return 0;
}

在这里插入图片描述

注意:结构体定义的时候不能省略struct,创建变量的时候可以省略

8.3 结构体数组

作用:将自定义的结构体放入到数组中方便维护

语法:struct 结构体名 数组名[元素个数]={{},{},{}…}

int main()
{system("color 5E");//创建结构体数组struct Student arr[3] ={{"张铁蛋",18,100},{"徐铁住",23,99},{"憨憨",22,90}};arr[2].name = "徐傻傻";for(int i=0;i<3;i++)cout << "姓名:" << arr[i].name << " 年龄:" << arr[i].age << " 分数:" << 			arr[i].score << endl;return 0;
}
8.4 结构体指针

作用:通过指针访问结构体中的成员

  • 利用操作符“->”可以通过结构体指针访问结构体属性
	//创建结构体变量struct student s = { "张三",18,100 };//通过指针指向结构体变量struct student *p=&s;//通过指针访问结构体中的数据p->name = "铁蛋";cout << "姓名:" << p->name << " 年龄:" << p->age << " 分数:" << p->score << endl;
8.5 结构体嵌套结构体

作用:结构体的成员可以是另一个结构体

如:每个老师辅导一个学员,一个老师是一个结构体,记录一个学生结构体

#include<iostream>
#include<string>
using namespace std;
//定义学生结构体
struct student
{int num;//学号string name;int age;
};
//定义老师结构体
struct teacher
{int id;string name;int age;struct student stu;
};
int main()
{system("color 5E");//创建老师、学生teacher ter = { 2311,"王老师",35,{20180505,"张三",22} };cout << "老师的编号:" << ter.id << endl;cout << "老师的名字:" << ter.name << endl;cout << "老师的年龄:" << ter.age << endl;cout << "老师的学生学号:" << ter.stu.num << endl;cout << "老师的学生的名字:" << ter.stu.name << endl;cout << "老师的学生的年龄:" << ter.stu.age << endl;return 0;
}

在这里插入图片描述

8.6 结构体做函数参数

作用:将结构体作为参数向函数中传递

传递的方式:

  • 值传递
  • 地址传递
#include<iostream>
#include<string>
using namespace std;
//定义学生结构体
struct student
{string name;int age;int score;
};
//值传递
void printStudent(struct student s)
{s.age = 55;cout << "子函数1打印的结果:" << endl;cout << "姓名:" << s.name << " 年龄:" << s.age << " 分数:" << s.score << endl;
}
//地址传递
void printfStudent1(struct student *s)
{cout << "子函数2打印的结果:" << endl;cout << "姓名:" << s->name << " 年龄:" << s->age << " 分数:" << s->score << endl;s->name = "张铁蛋";s->score = 999;}
int main()
{system("color 5E");student s = { "张三",23,99 };printStudent(s);cout << "main打印的结果:" << endl;cout << "姓名:" << s.name << " 年龄:" << s.age << " 分数:" << s.score << endl;cout << endl;printfStudent1(&s);cout << "main打印的结果:" << endl;cout << "姓名:" << s.name << " 年龄:" << s.age << " 分数:" << s.score << endl;return 0;
}

在这里插入图片描述

8.7 结构体中const使用场景

作用:用const来防止误操作

#include<iostream>
#include<string>
using namespace std;
//定义学生结构体
struct student
{string name;int age;int score;
};
//将函数中的形参改为指针,可以减少内存空间,而且不会复制新的副本
void printStudent(const struct student *s)
{//s->age = 55;//加入const之后,一旦有修改的操作就会报错,防止误操作cout << "姓名:" << s->name << " 年龄:" << s->age << " 分数:" << s->score << endl;
}
int main()
{system("color 5E");student s = { "张三",23,99 };//只读,不可修改printStudent(&s);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/167756.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

set和map + multiset和multimap(使用+封装(RBTree))

set和map 前言一、使用1. set(1)、模板参数列表(2)、常见构造(3)、find和count(4)、insert和erase(5)、iterator(6)、lower_bound和upper_bound 2. multiset3. map(1)、模板参数列表(2)、构造(3)、modifiers和operations(4)、operator[] 4. multimap 二、封装RBTree迭代器原理R…

9.输出国际象棋盘【2023.11.24】

1.问题描述 要求输出国际象棋棋盘。 2.解决思路 国际象棋棋盘由64个黑白相间的格子组成&#xff0c;分为8行*8列。用i控制行&#xff0c;j控制列&#xff0c;根据ij的和的变化来控制输出黑方格还是白方格。 3.代码实现 #include<stdio.h> int main(){for(int i0;i&…

基于广义正态分布算法优化概率神经网络PNN的分类预测 - 附代码

基于广义正态分布算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于广义正态分布算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于广义正态分布优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xf…

网络安全—自学

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…

深度学习之基于Pytorch照片图像转漫画风格网络系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 以下是一个基本的设计介绍&#xff1a; 数据准备&#xff1a;收集足够的真实照片和漫画图像&#xff0c;用于训练模…

typora中的快捷键shift enter 和 enter的交换

1 问题&#xff1a; 我最近在用 typora 进行写作&#xff0c;但是在合格 typora 的 markdown 编辑器很奇怪&#xff0c;它的一个回车符是两次换行&#xff0c;而用 shfit ent 找了半天都不知道怎么解决的这个问题&#xff0c;然后我就去了这个 typora 在 github 开源的问题仓库…

hive 报错return code 40000 from org.apache.hadoop.hive.ql.exec.MoveTask解决思路

参考学习 https://github.com/apache/hive/blob/2b57dd27ad61e552f93817ac69313066af6562d9/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java#L47 为啥学习error code 开发过程中遇到以下错误&#xff0c;大家觉得应该怎么办&#xff1f;从哪方面入手呢&#xff1f; 1.百…

解决在Windows10或Windows11下无权限修改hosts文件

解决在Windows10或Windows11下无权限修改hosts文件&#xff0c;无法写入内容 1、首先在开始菜单中找到这个 2、接着输入&#xff1a; C:\Windows\System32\drivers\etc3、再次输入以下命令行&#xff1a;notepad hosts &#xff0c;并回车&#xff1a; notepad hosts 4、然后…

DataFunSummit:2023年现代数据栈技术峰会-核心PPT资料下载

一、峰会简介 现代数据栈&#xff08;Modern Data Stack&#xff09;是一种集合了多种技术和工具的软件基础设施&#xff0c;旨在更好地管理和处理数据&#xff0c;并为企业提供数据驱动的洞察和决策。包含以下几个组件&#xff1a;数据采集、数据处理、数据存储、数据查询和分…

区块链技术与应用 【全国职业院校技能大赛国赛题目解析】第四套区块链应用后端开发

第四套区块链应用后端开发 环境 : ubuntu20 fisco : 2.8.0 springboot 2.1.1 fisco-java-sdk: 2.7.2 maven 3.8.8 前言 这套后端样题,只涉及调用fisco的系统接口,不涉及此食品溯源项目的业务接口,所以我就直接生成一个springboot项目进行完成此题目。 请提前准备好一…

Docker的项目资源参考

Docker的项目资源包括以下内容&#xff1a; Docker官方网站&#xff1a;https://www.docker.com/ Docker Hub&#xff1a;https://hub.docker.com/ Docker文档&#xff1a;https://docs.docker.com/ Docker GitHub仓库&#xff1a;https://github.com/docker Docker官方博客…

Unity中Shader的Standard材质解析(二)

文章目录 前言一、我们对 Standard 的 PBR 的 GI 进行解析1、我们先创建一个PBR的.cginc文件&#xff0c;用于整理用到的函数2、然后在Standard的Shader中引用该cginc文件 二、依次整理函数到该cginc文件中我们来看一下PBR中GI的镜面反射做了些什么 二、最终代码.cginc代码&…

【教学类-06-07】20231124 (55格版)X-X之间的加法、减法、加减混合题

背景需求 在大四班里&#xff0c;预测试55格“5以内、10以内、20以内的加法题、减法题、加减混合题”的“实用性”。 由于只打印一份20以内加法减法混合题。 “这套20以内的加减法最难”&#xff0c;我询问谁会做&#xff08;摸底幼儿的水平&#xff09; 有两位男孩举手想挑…

joplin笔记同步 到腾讯云S3

创建存储桶 打开腾讯云的存储桶列表&#xff0c;点击“创建存储桶”&#xff0c;输入名称&#xff0c;选择地域&#xff08;建议选择离自己较近的地域以降低访问时延&#xff09;和访问权限&#xff08;建议选择“私有读写”&#xff09;。 s3 存储桶&#xff1a; 存储桶的名称…

【经典小练习】简单的文件加密解密

文章目录 &#x1f339;什么是文件加密⭐应用场景 &#x1f6f8;案例&#x1f33a;描述&#x1f33a;代码 &#x1f339;什么是文件加密 Java文件加密是指使用Java编程语言和相关的加密算法对文件进行加密处理。通过这种方式&#xff0c;可以将文件内容转换为一种非常规的形式…

Halcon Solution Guide I basics(4): Blob Analysis(连通性解析)

文章目录 文章专栏前言文章解析开头步骤分析简单案例进阶方案 进阶代码案例crystal&#xff0c;结晶匹配需求分析 文章专栏 Halcon开发 Halcon学习 练习项目gitee仓库 CSDN Major 博主Halcon文章推荐 前言 今天来看第三章内容&#xff0c;既然是零基础&#xff0c;而且我还有大…

希宝猫罐头怎么样?专业人士告诉你口碑好的猫罐头推荐

作为一个从业宠物营养师7年的人&#xff0c;可以说对于猫咪的食物很有研究和猫罐头品牌选购上&#xff0c;我有自己的见解。那么希宝猫罐头怎么样呢&#xff1f; 希宝猫罐头采用了先进的加工工艺&#xff0c;注重产品的包装和密封性&#xff0c;其包装设计简洁时尚&#xff0c…

STM32 中断系统

单片机学习 目录 文章目录 前言 一、中断系统 1.1 什么是中断 1.2 中断优先级 1.3 中断嵌套 1.4 C语言中的中断程序 二、STM32的中断通道和中断向量 2.1 中断通道 2.2 嵌套向量中断控制器NVIC 2.2.1 什么是NVIC 2.2.2 NVIC基本结构 2.2.3抢占优先级和响应优先级 2.2.4 NVIC的优…

深度学习卷积神经网络参数计算难点重点

目录 一、卷积层图像输出尺寸 二、池化层图像输出尺寸 三、全连接层输出尺寸 四、卷积层参数数量 五、全连接层参数数量 六、代码实现与验证 以LeNet5经典模型为例子并且通道数为1 LeNet5网络有7层&#xff1a; ​ 1.第1层&#xff1a;卷积层 ​ 输入&#xff1a;原始的图片像素…

c语言数字转圈

数字转圈 题干输入整数 N&#xff08;1≤N≤9&#xff09;&#xff0c;输出如下 N 阶方阵。 若输入5显示如下方阵&#xff1a; * 1** 2** 3** 4** 5* *16**17**18**19** 6* *15**24**25**20** 7* *14**23**22**21** 8* *13**12**11**10** 9*输入样例3输出样例* 1*…