查看: 107|回复: 0

【千锋教育超级C++课程】第八章 指针

[复制链接]

4

主题

6

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2023-6-26 20:50:56 | 显示全部楼层 |阅读模式
超级C++课程精品笔记第八章,字数:3974。文末有10节视频课程。
讲师介绍
千锋智能物联网+嵌入式学科梁老师(梁哥),10年行业开发经验。
参与研发过的产品涉及工业控制,智能交通,物联网开发、智能家电、及消费类电子产品多个领域。精通C/C++ 、Gtk/Qt图形界面开发、Linux多任务开发、网络编程开发、数据库编程开发、shell脚本、数据结构与算法。精通NB-lot、Zigbee、RFID、Bluetooth、WIFl、传感器、MQTT等物联网技术。精通BSP开发、Linux内核移植、文件系统开发、驱动设计开发。
<hr/>8.1 指针变量

8.1.1 内存的概述

在32位平台,每一个进程 拥有4G的空间。
系统为内存的每一个字节 分配一个32位的地址编号(虚拟地址)。这个编号称之为地址。
无论什么类型的地址,都是存储单元的编号,在32位平台下都是4个字节,即任何类型的指针变量都是4
个字节大小。


8.1.2 地址和指针变量的关系

地址 就是内存的地址编号。
指针变量:本质是变量 只是该变量 保存的是 内存的地址编号。(不是普通的数值)
8.1.3 指针变量的定义

1)定义步骤(定义的时候)
*修饰指针变量p。
保存谁的地址 就先定义谁。
从上往下整体替换。
2)在32位平台任何类型的指针变量 都是4字节
8.1.4 指针变量的初始化

指针变量 在操作之前 必须指向合法的地址空间。
1)指针变量 如果不初始化 立即操作 会出现段错误
2)指针变量 如果没有指向合法的空间 建议初始化为NULL
3)将指针变量 初始化为 合法的地址(变量的地址、动态申请的地址、函数入口地地址)
8.1.5 指针变量的类型

1)指针变量自身的类型: 将指针变量名拖黑,剩下的类型就是指针变量自身的类型
指针变自身的类型,一般用于赋值语句的判断。
2)指针变量指向的类型(重要)
将指针变量名和离它最近的一个* 一起拖黑,剩下的类型就是指针变量指向的类型 。
3)指针变量的指向类型 决定了取值宽度
4)指针变量的指向类型 决定了+1跨度
8.1.6*p等价num

8.1.7 指针变量的注意事项

1)void 不能定义普通变量
2)void * 可以定义指针变量
p就是万能的一级指针变量, 能保存 任意一级指针的地址编号
万能指针 一般用于 函数的形参 达到算法操作多种数据类型的目的。
记住:不要直接对void *p的指针变量 取 *  
对p取*之前 对p先进行指针类型强转。
3)指针变量 未初始化 不要取*
4)指针变量 初始化NULL 不要取*
5)指针变量 不要越界访问
8.2 数组元素的指针

8.2.1数组元素的指针概述

数组元素的指针变量 是用来保存数组元素的地址 。
8.2.2 数组元素的指针变量 和 数组名(作为地址) 等价

8.2.3 在使用中 【】就是 *()的缩写

8.2.4 指向同一数组的元素的两个指针变量间的关系

8.3字符数组

8.3.1 字符数组

char str1[128]="hello world";
str1是数组 开辟128字节 存放字符串"hello world"sizeof(str1) == 128字节
8.3.2 字符串指针变量

char *str2="hello world";

sizeof(str2) == 4字节 或 8字节
str2是指针变量 在栈区/全局区 保存的是字符串常量"hello world"的首元素地址,而”hello world“在文字
常量区。
8.4 指针数组

指针数组:本质是数组 只是数组的每个元素为 指针。
8.4.1 数值的指针数组



8.4.2 字符指针数组

char *arr[4]={"hehehehe", "xixixixixi", "lalalalala", "hahahahaha"};


8.4.3 二维字符数组

char *arr1[4]={"hehehehe", "xixixixixi", "lalalalala", "hahahahaha"};
char arr2[4][128]={"hehehehe", "xixixixixi", "lalalalala", "hahahahaha"};
arr1是在指针数组 存放的是每个字符串的首元素的地址
arr2是二维字符数组 存放的是每个字符串
8.5 指针的指针

int num = 10;
int *p = #
int **q = &p;
n级指针变量 可以保存 n-1级指针变量的地址


8.6 数组指针

8.6.1 数组首元素地址 和 数组首地址

数组首元素地址:&arr[0] == arr arr+1跳过一个元素
数组的首地址:&arr &arr+1跳过整个数组
8.6.2 数组指针 本质是指针变量 保存的是数组的首地址



8.6.3 数组指针的案例

int arr[5]={10, 20, 30,40,50};
int (*p)[5] = &arr;//数组指针
cout<< *((int *)(p+1)-2) <<endl;//40 分析为啥是40
8.6.4 二维数组和数组指针的关系
1)深入了解二维数组


arr[1] => *(arr+1) 第一行第0列的列地址
&arr[1] => &*(arr+1)=>arr+1 第1行的行地址
*arr+1 => 第0行第1列的列地址
arr[1]+2 =>*(arr+1)+2 =>第1行第2列的列地址
**arr ==*(*(arr+0)+0) == arr[0][0]
2)二维数组和一维数组指针的关系


int arr[n]; int *p;
int arr[n][m]; int (*p)[m];
int arr[n][m][k]; int (*p)[m][k]
n维数组 和n-1维的数组指针 等价
8.7 多维数组的物理存储

不管几维数组在物理上 都是一维存储,在逻辑上是多维的。


8.8 指针与函数

8.8.1 指针变量作为函数的参数

如果想在函数内部 修改外部变量的值 需要将外部变量的地址 传递给函数。(重要)
单向传递 之 传值
函数内部 不能修改外部变量的值
单向传递 之 传地址
函数内部 就可以修改 外部变量的值
8.8.2 一维数组作为函数的参数

函数内部 想操作(读或写)外部数组元素,将数组名 传递给函数。
一维数组 作为函数的形参 会被优化成 指针变量。
8.8.3 二维数组作为函数的参数

函数内部 想操作 函数外部的二维数组 需要将二维数组名 传递给函数
二维数组 作为函数的形参 会被优化成 一维的数组指针。
8.8.4 函数的返回值类型 为 指针类型

将函数内部的合法地址 通过返回值 返回给函数外部使用。
注意:函數不要返回 普通局部变量的地址
8.9 函数指针

8.9.1 函数指针的定义

函数名 代表函数的入口地址;
函数指针:本质是一个指针变量 只是该变量 保存的是函数的入口地址
8.9.2 函数指针变量注意

函数指针变量 不要+1 无意义
不要对函数指针变量取* 无意义
函数指针变量 判断大小 > < 无意义
函数指针变量 可以赋值 p2=p1
函数指针变量 可以判断相等 p2 ==p1
8.9.3 函数指针变量 使用typedef定义

int myAdd(int x,int y)
{
return x+y;
}
void test05()
{
//给函数指针类型取别名
typedef int (*FUN_TYPE)(int x,int y);
FUN_TYPE p=NULL;
cout<<"sizeof(p) = "<<sizeof(p)<<endl;//4B
//函数指针 和 函数入口地址建立关系
p = myAdd;
//通过p调用myAdd函数(函数+(实参))
cout<<p(10,20)<<endl;//30
}
8.9.4 函数指针作为函数的参数

目的:让算法功能多样化
案例1:设计一个算法,完成加减乘除
int myAdd(int x,int y)
{
return x+y;
}
int mySub(int x,int y)
{
return x-y;
}
int myMul(int x,int y)
{
return x*y;
}
int myDiv(int x,int y)
{
return x/y;
}
//设计算法 操作上面的函数
int myCalc(int x,int y, int (*func)(int,int) )
{
return func(x,y);
}
void test06()
{
cout<<myCalc(10,20, myAdd)<<endl;//30
cout<<myCalc(10,20, mySub)<<endl;//-10
cout<<myCalc(10,20, myMul)<<endl;//200
cout<<myCalc(10,20, myDiv)<<endl;//0
}
<hr/>【第八章指针】视频汇总:

【超级C++】065-指针-指针变量的定义
【超级C++】066-指针-指针变量的类型
【超级C++】067-指针-指针变量指向类型的作用
【超级C++】068-指针-数组元素的指针
【超级C++】069-指针-字符串与指针
【超级C++】070-指针-指针数组
【超级C++】071-指针-数组指针
【超级C++】072-指针-二维数组与数组指针的关系
【超级C++】073-指针-数组作为函数的参数
【超级C++】074-指针-函数指针作为函数的参数
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|多点娱乐

GMT+8, 2025-10-11 19:46 , Processed in 0.080041 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表