【面向对象编程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,保证程序可读性与合法性。

相关推荐
Brilliantwxx3 小时前
【Linux】 自主shell编写巩固复习篇
linux·运维·服务器·开发语言
十年Java程序媛3 小时前
Java 多线程基础与锁机制详解|进程线程、锁升级、synchronized 与 Lock 对比
java·开发语言·spring boot
弯_弯3 小时前
FDE 的工程能力画像:数据接入、PoC 与可复用资产的落地口径
java·服务器·开发语言
xxwl5853 小时前
区域赛算法模版第八章---贪心(Greedy)
c++·笔记·学习·算法
雾沉川3 小时前
Visual C++运行库合集 v105.0 安装教程
开发语言·c++·dll
_wyt0013 小时前
洛谷P17461 [GESP202609 八级] 生成树计数 题解
c++·数学·树·gesp·八级·仙人掌
CCblandy4 小时前
向量检索 ANN 参数实测:换一种数据分布,recall 掉了 51 个百分点
人工智能·python·算法·自然语言处理·性能优化
CS创新实验室4 小时前
一棵树怎么做到“自平衡还不太费力“?——红黑树的旋转与染色
数据结构·算法·红黑树·408·计算机考研
Logic1014 小时前
C语言/数据结构位运算题解:异或XOR找出被挑选一次的果子编号——只出现一次的数字
c语言·数据结构·算法·数组·位运算·时间复杂度·空间复杂度