|
超级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]=&#34;hello world&#34;;
str1是数组 开辟128字节 存放字符串&#34;hello world&#34;sizeof(str1) == 128字节
8.3.2 字符串指针变量
char *str2=&#34;hello world&#34;;
sizeof(str2) == 4字节 或 8字节
str2是指针变量 在栈区/全局区 保存的是字符串常量&#34;hello world&#34;的首元素地址,而”hello world“在文字
常量区。
8.4 指针数组
指针数组:本质是数组 只是数组的每个元素为 指针。
8.4.1 数值的指针数组

8.4.2 字符指针数组
char *arr[4]={&#34;hehehehe&#34;, &#34;xixixixixi&#34;, &#34;lalalalala&#34;, &#34;hahahahaha&#34;};

8.4.3 二维字符数组
char *arr1[4]={&#34;hehehehe&#34;, &#34;xixixixixi&#34;, &#34;lalalalala&#34;, &#34;hahahahaha&#34;};
char arr2[4][128]={&#34;hehehehe&#34;, &#34;xixixixixi&#34;, &#34;lalalalala&#34;, &#34;hahahahaha&#34;};
arr1是在指针数组 存放的是每个字符串的首元素的地址
arr2是二维字符数组 存放的是每个字符串
8.5 指针的指针
int num = 10;
int *p = &num;
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<<&#34;sizeof(p) = &#34;<<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-指针-函数指针作为函数的参数 |
|