【面向对象编程c++】| 指针与自定义数据类型

一、指针

指针是一个变量,其值为另一个变量的地址,即内存位置的直接地址。 和普通变量一样,使用指针存储变量地址前,必须先声明。

指针声明

cpp 复制代码
type *var-name;
  • type:指针的基类型,必须是合法 C++ 数据类型
  • var-name:指针变量名
  • 声明里的*代表这是指针,和乘法的星号含义不同

有效的指针声明示例:

cpp 复制代码
int    *ip;    /* 一个整型的指针 */
double *dp;    /* 一个 double 型的指针 */
float  *fp;    /* 一个浮点型的指针 */
char   *ch;    /* 一个字符型的指针 */

知识点:所有指针变量本身存放的都是内存地址(十六进制长数字)。不同类型指针的区别:指针指向的数据类型不同。

解引用

  • 普通变量:存放数据
  • 指针变量:存放内存地址
  • 使用*p访问指针指向内存的值,这个操作叫做解引用 ,通过*操作指针指向的内存空间。

const 修饰指针(3 类)

  1. 常量指针 :const type *p,不能通过指针修改指向的值;指针本身可以修改指向。
  2. 指针常量 :type *const p,指针本身的指向不可修改;指向的值可以修改。
  3. const 常量指针 :const type *const p,指针指向 和 指向的值都不能修改。

指针算术运算

指针本质是地址数值,可以做算术运算(++、--、加减整数)。

cpp 复制代码
int *p;
p++;

指针自增 / 自减,移动的单位是指向类型的字节大小,不是简单 + 1。

多级指针(指向指针的指针)

多级间接寻址,指针存放另一个指针的地址。

cpp 复制代码
int *p;
int **pp; // pp是指向int*类型指针的指针

指针和数组

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

  1. C++ 规定,数组名就是数组的起始地址
  2. 数组的指针等价于数组首地址
  3. 数组名作为函数实参传递,传递的是数组首地址(地址传递)

示例:

cpp 复制代码
cout << *p << endl;
p++;

指针作为函数参数 & 指针函数

  1. 指针作函数参数:地址传递,可以在函数内部修改外部实参的值。
  2. 指针函数:返回指针值的函数。
cpp 复制代码
// 类型名 * 函数名 (参数列表)
int *a(int x,int y)
{
    //
}

二、结构体 struct

C++ 允许用户自定义数据结构,将不同类型的数据组合成一个整体,内部数据相互关联,这种结构称为结构体。

结构体声明格式:

cpp 复制代码
struct 结构体名
{
    成员列表;
};
  • 结构体名:结构体类型标记
  • 大括号内为结构体成员,成员声明格式:类型名 成员名;
  • 成员列表也叫域表,单个成员称为一个域;成员命名规则和普通变量一致。

示例:

cpp 复制代码
struct student {
    int num;
    char name[20];
    char sex;
    int age;
    float score;
    char addr[30];
}student1, student2;

访问成员:普通变量用.;结构体指针用->

三、共用体 union

共用体是特殊数据类型,同一块内存位置可以存放不同类型的数据 。 共用体可以定义多个成员,但任意时刻,只有一个成员有效。共用体可以高效复用内存空间。

共用体定义格式:

cpp 复制代码
union [union tag]
{
    member definition;
    member definition;
    ...
} [one or more union variables];

对比记忆:结构体成员拥有独立内存,所有成员同时存在;共用体成员共享同一块内存,同一时间只能使用一个成员。

四、枚举 enum

枚举类型 (enumeration) 是 C++ 派生数据类型,是用户自定义的若干枚举常量的集合。

定义格式

cpp 复制代码
enum <类型名> {<枚举常量表>};

格式说明:

  • 关键字enum:标记后面标识符是枚举类型名。
  • 枚举常量表:由枚举常量(枚举成员)组成,本质是整型标识符,代表枚举变量可取的值;多个常量用逗号分隔,常量名必须互不相同。

示例:

cpp 复制代码
enum color_set1 {RED, BLUE, WHITE, BLACK}; // 定义枚举类型color_set1
enum week {Sun, Mon, Tue, Wed, Thu, Fri, Sat}; // 定义枚举类型week

枚举常量取值规则

编译系统会自动给每个枚举常量分配整型值:

  • 默认:序号从 0 开始。
  • 手动指定部分常量值:指定值之前的常量按默认规则;指定值之后的常量依次 + 1。
  • 枚举常量的整数值允许重复。

枚举变量输入输出

枚举变量本身存储的是整数,一般使用switch语句,把枚举常量转换成字符 / 字符串进行输入输出。 枚举类型的业务处理通常搭配 switch,保证程序可读性与合法性。

相关推荐
Pniubi4 小时前
力扣438.找到字符串中所有字母异位词
算法·leetcode·职场和发展
yeccheng4 小时前
MySQL 索引超详解:从底层 B+ 树到面试高频考点
java·开发语言·jvm·mysql·面试
联犀4 小时前
纯 Go 的 CAD 开源库 go-cad:直接解析 DWG/DXF,现在也能导出 PDF
开发语言·golang·pdf
zjxtxdy5 小时前
C++面向对象程序开发-类与对象
开发语言·c++
東隅已逝,桑榆非晚6 小时前
算法6. 双指针法-查找总价格为目标的两个商品
c++·学习·算法
Eyfcom6 小时前
〖物联网终端实战 01〗UWB 室内高精度定位:仓储 AGV 与人员的厘米级轨迹追踪
物联网·算法·物流系统·快递系统·跨境物流快递系统·物联网终端实战
qq_406981037 小时前
c++拷贝构造函数
开发语言·c++
bro_Java6667 小时前
《排序的底层逻辑:比较、交换与分治》
java·算法·排序算法
爱喝雪碧的可乐7 小时前
MATLAB
开发语言·算法·matlab
叼烟扛炮8 小时前
Linux 学习笔记(六十):单线程的逆袭——epoll 高并发服务器实战
linux·服务器·网络·笔记·学习·算法