C++重点内容
基本语法(部分)
1. 指针
1.1 基本概念
作用:通过指针间接访问内存
- 内存编号是从0开始记录的,一般用十六进制数表示,如0xf300
- 可以利用指针变量保存地址
指针就是一个地址
1.2 指针变量
声明:数据类型 * 指针变量名
其中数据类型 *
是一个整体,为指针数据类型
初始化:指针变量名 = &被指向的变量
通过&
符号可以取得变量的地址赋给指针
使用:*指针
在指针前加上*
表示解引用,找到指针指向内存中的数据,并且可以对内存中的数据进行读写操作
1.3 指针所占空间
指针也是一种数据类型
在32位系统下,任何类型的指针都只占用4个字节内存空间;64位系统下,任何类型的指针都占用8个字节的内存空间
1.4 空指针和野指针
空指针:指向内存中编号为0的指针。一般用于初始化指针int * p = NULL
空指针不允许访问,因为系统中0-255的内存编号都是系统占用的,不可以访问
野指针:指向非法的内存空间int * p = (int *)0x1100
。因为野指针指向的内存空间不是主动申请的,指向的内存可能没有权限访问或者禁止访问
野指针无法确定其指向的地址是否能够访问,所以不要随意使用野指针
空指针和野指针都不是我们申请的内存空间,所以不可访问
★ 1.5 const修饰指针
-
const修饰指针——常量指针,指向常量的指针
在指针类型前加const:
const int * p = &a
指针的指向可以修改,但是指针指向的值不可以修改,指针指向的必须是一个常量。这里指的是a的值不可以通过指针来修改*p = b
,但是可以通过直接访问a的方式修改a的值a = b;
-
const修饰常量——指针常量,指针本身属性是一个常量
在指针变量名前加const:
int * const p = &a
指针的指向不可以改,指针指向的值可以改。这里指的是a的值可以通过指针修改,但是p指向的地址不允许修改 -
const既修饰指针,又修饰常量
同时在指针类型和指针变量名前加const:
const int * const p = &a
指针的指向和指针指向的值都不可修改
1.6 指针、数组、函数
利用指针访问数组中的元素:int * p = arr
arr既是数组名,也是数组的首地址,所以说数组也是指针。可以通过p++
实现指针的递增,访问数组中的下一个元素
函数中的地址传递:void func(int *a, int *b)
函数参数传入的是地址,并使用指针类型接收,在函数体中使用时需要用*进行解引用。地址传递时,形参改变会导致实参的值也改变
2. 结构体
2.1 结构体定义和使用
定义:struct 结构类型名 {结构成员列表}变量名;
其中变量名可省略,作用为在声明结构体时顺便创建变量,作用域同结构体定义的作用域相同
结构体变量创建:struct 结构类型名 变量名
其中的struct可以省略。
const使用场景:在函数的地址传递中使用const常量,可以在节省内存空间的同时避免函数体中修改指针指向的变量值
2.2 结构体数组
创建:struct 结构体名 数组名[元素个数]={};
2.3 结构体指针
创建:结构体名 * 指针变量名 = & 结构体变量名
通过指针指向结构体变量student * p = & s
访问:指针变量名->结构体成员
通过指针可以访问结构体变量中的成员变量p->name
2.4 结构体嵌套
定义:一个结构体中的成员可以是另一个结构体。成员中的结构体需要在第一个结构体之前声明
2.5 结构体做函数参数
传递方式有值传递和地址传递