指针专题讲座(王保明)

铁律1:指针是一种数据类型

1)指针也是一种变量,占有内存空间,用来保存内存地址

测试指针变量占有内存空间大小

2)*p操作内存

在指针声明时,*号表示所声明的变量为指针

在指针使用时,*号表示 操作 指针所指向的内存空间中的值

*p相当于通过地址(p变量的值)找到一块内存;然后操作内存

*p放在等号的左边赋值(给内存赋值)

*p放在等号的右边取值(从内存获取值)

3)指针变量和它指向的内存块是两个不同的概念

//含义1 给p赋值p=0x1111; 只会改变指针变量值,不会改变所指的内容;p = p +1; //p++

//含义2 给*p赋值*p=‘a‘; 不会改变指针变量的值,只会改变所指的内存块的值

//含义3 =左边*p 表示 给内存赋值, =右边*p 表示取值 含义不同切结!

//含义4 =左边char *p

//含义5 保证所指的内存块能修改

4)指针是一种数据类型,是指它指向的内存空间的数据类型

含义1:指针步长(p++),根据所致内存空间的数据类型来确定

p++=è(unsigned char )p+sizeof(a);

结论:指针的步长,根据所指内存空间类型来定。

注意:     建立指针指向谁,就把把谁的地址赋值给指针。图和代码和二为一。

不断的给指针变量赋值,就是不断的改变指针变量(和所指向内存空间没有任何关系)。

铁律2:通过*p/*p++ 来改变变量的值是指针存在的最大意义

1)两码事:指针变量和它指向的内存块变量

2)条件反射:指针指向某个变量,就是把某个变量地址否给指针

3)*p间接赋值成立条件:3个条件

a)2个变量(通常一个实参,一个形参)

b) 建立关系,实参取地址赋给形参指针

c) *p形参去间接修改实参的值


Int iNum = 0; //实参

int *p = NULL;

p = &iNum;

iNum = 1;

*p =2 ; //通过*形参 == 间接地改变实参的值

*p成立的三个条件:

4)引申:函数调用时,n指针(形参)改变n-1指针(实参)的值。

//改变0级指针(int iNum = 1)的值有2种方式

//改变1级指针(eg char *p = 0x1111 )的值,有2种方式

//改变2级指针的(eg char **pp1 = 0x1111 )的值,有2种方式

//函数调用时,形参传给实参,用实参取地址,传给形参,在被调用函数里面用*p,来改变实参,把运算结果传出来。

//指针作为函数参数的精髓。

铁律3:理解指针必须和内存四区概念相结合

1)主调函数 被调函数

a)        主调函数可把堆区、栈区、全局数据内存地址传给被调用函数

b)        被调用函数只能返回堆区、全局数据

2)内存分配方式

a)        指针做函数参数,是有输入和输出特性的。

铁律4:应用指针必须和函数调用相结合(指针做函数参数)


编号


指针函数参数

内存分配方式(级别+堆栈)


主调函数

实参


被调函数

形参


备注


01


1级指针

(做输入)



分配


使用


一般应用禁用



分配


使用


常用


Int showbuf(char *p);

int showArray(int *array, int iNum)


02


1级指针

(做输出)



使用


结果传出


常用


int geLen(char *pFileName, int *pfileLen);


03


2级指针

(做输入)



分配


使用


一般应用禁用



分配


使用


常用


int main(int arc ,char *arg[]); 指针数组

int shouMatrix(int [3][4], int iLine);二维字符串数组


04


2级指针

(做输出)



使用


分配


常用,但不建议用,转化成02


int getData(char **data, int *dataLen);

Int getData_Free(void *data);

Int getData_Free(void **data); //避免野指针


05


3级指针

(做输出)



使用


分配


不常用


int getFileAllLine(char ***content, int *pLine);

int getFileAllLine_Free(char ***content, int *pLine);

                 

指针做函数参数,问题的实质不是指针,而是看内存块,内存块是1维、2维。

1)如果基础类int变量,不需要用指针;

2)若内存块是1维、2维。

铁律5:一级指针典型用法(指针做函数参数)

一级指针做输入

int showbuf(char *p)

int showArray(int *array, int iNum)

一级指针做输出

int geLen(char *pFileName, int *pfileLen);

理解

主调函数还是被调用函数分配内存

被调用函数是在heap/stack上分配内存

铁律6:二级指针典型用法(指针做函数参数)

二级指针做输入

int main(int arc ,char *arg[]); 字符串数组

int shouMatrix(int [3][4], int iLine);

二级指针做输出

int Demo64_GetTeacher(Teacher **ppTeacher);

int Demo65_GetTeacher_Free(Teacher **ppTeacher);

int getData(char **data, int *dataLen);

Int getData_Free(void *data);

Int getData_Free2(void **data); //避免野指针

理解

主调函数还是被调用函数分配内存

被调用函数是在heap/stack上分配内存

铁律7: 三级指针输出典型用法

三级指针做输出

int getFileAllLine(char ***content, int *pLine);

int getFileAllLine_Free(char ***content, int *pLine);

理解

主调函数还是被调用函数分配内存

被调用函数是在heap/stack上分配内存

铁律8:杂项,指针用法几点扩充

1)野指针 2种free形式

int getData(char **data, int *dataLen);

int getData_Free(void *data);

int getData_Free2(void **data);

2)2次调用

主调函数第一次调用被调用函数求长度;根据长度,分配内存,调用被调用函数。

3)返回值char */int/char **

4)C程序书写结构

商业软件,每一个出错的地方都要有日志,日志级别

铁律9:一般应用禁用malloc/new

时间: 2024-08-12 22:37:58

指针专题讲座(王保明)的相关文章

UESTC 884 方老师的专题讲座

数位DP问题. 定义:cnt[L][K]表示长度为L,最高位为K的满足条件C的个数. 首先预处理出cnt数组,枚举当前长度最高位和小一个长度的最高位,如果相差大于2则前一个加上后一个的方法数. 然后给定n,计算[1,n-1]中满足条件C的数的个数. 设有K位数,则不足K位的累加,然后枚举K位数的情况,从高位到低位枚举,每次枚举到比该位小1的数,注意:如果某时刻该数中有两位相差大于2,则再枚举下去已经没有意义,因为以后的数再也不会满足条件C,这时退出即可. 代码: #include <iostre

项目管理者联盟《项目管理与PMP考试动态》专题讲座(免费)

项目管理者联盟<项目管理与PMP考试动态> 专题讲座(免费) 项目经理日益成为众多企业(尤其项目型企业,譬如IT企业.研发机构)的核心执行层,企业项目管理团队的能力水平与成熟度直接影响企业的营运与业绩.本次讲座将带来最新项目管理框架与趋势,剖析项目经理角色.职责与能力需求,不仅为众多年轻的项目经理提供对照,明确自身能力完善方向,同时为企业管理层与人力资源部门建立.培养项目管理团队带来指导. 美国项目管理学会PMP认证作为全球认可的项目管理权威认证,她所要求的项目管理层知识与能力要求,为企业提供

高二数学【理】备考热点难点突破练专题02-推理证明与复数

高二数学[理]备考热点难点突破练专题02-推理证明与复数 原文地址:https://www.cnblogs.com/wanghai0666/p/9213774.html

c指针-专题

六---指针 内存和地址怎么理解呢? 机器中有一些位置,每一个位置被称为[字节]/byte,许多现代机器上,每个字节包含8个位.更大内存单位[字],通常包含2个或4个字节组成. 一个字包含4个字节,它的地址是什么? 他仍然只有一个地址,是最左边还是最右边的那个字节的位置,取决于机器. 机器事实-关于整型的起始位置: 在要求边界对齐(boundaryalignment)的机器上,整型存储的起始位置只能是某些特定的字节,通常是2或4的倍数. 变量名和地址关系? 所有高级语言的特性之一,就是通过名字而

1159 最大的两个数(指针专题)

题目来源:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1159Description 求n个整数中的最大的两个元素.要求定义一个函数LargestTow(),求数组a的最大的两个元素,分别存入形参指针pfirst和psecond所指存储单元,函数原型如下: void LargestTow(int a[],int n,int *pfirst,int *psecond) { /*数组a有n个元素,将数组中的最大值存入形参指针pfirst所指内存单

1160 矩阵的最大值(指针专题)

题目来源:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1160Description 找出一个2×3的整数矩阵中的最大值及其行下标和列下标,要求调用函数FindMax(int p[][3], int m, int n, int *pRow, int *pCol)实现,行下标和列下标在形参中以指针的形式返回. void FindMax(int p[][3], int m, int n, int *pRow, int *pCol){ //在m*n

1161 字符串长度(指针专题)

题目来源:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1161Description编写一函数len,求一个字符串的长度,注意该长度不计空格.要求用字符指针实现.在主函数中输入字符串,调用该len函数后输出其长度. int len(char *sp) { //实现sp所指串的长度,不计空格. } Input输入一个字符串,以回车结束,长度不超过100.Output输出一个整数,单独占一行.Sample InputWhat day is tod

零售数字化必经哪四个阶段?CCFA这场高质量专题讲座值得一听!

本文整理自刘湛在CCFA专题分享的演讲实录,演讲主题为<NOME数字化零售之路> 本文的主要内容如下: ? 未来零售潜力来源于AI+BI ? 零售数字化演进的四个阶段 ? AlphaZero的启示 ? 零售核心主数据及相关分析 未来零售潜力来源于AI+BI 谢谢苏总邀请,首先说一下我们为什么选择和观远数据合作.观远数据是一家非常出色的新兴数据公司,在经过深入了解后,发现我们对数据赋能的理念非常相似,所以一拍即合.很快就决定达成合作. 为什么觉得理念非常相似呢?我觉得未来零售潜力一定是来自于AI

指针专题4-指针作为函数返回值(指针函数)

C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数.下面的例子定义了一个函数strlong(),用来返回两个字符串中较长的一个. /* 返回两个字符串中最长的一个 */ char *strlong(char *str1, char *str2) { if(strlen(str1)>=strlen(str2)){ return str1; }else{ return str2; } } void main(){ char str1[30],str2[30],*str; gets