指针使用的九大铁律

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

1.1 指针是一种变量

它占有内存空间,用来保存内存地址。

char *p1 = 100;  //分配4个字节的内存
char ****p2 = 100;

不论指针是几级的,都只分配4个字节的空间

1.2 *p操作内存

  1. 在指针声明时,*号表示所声明的变量为指针 。
  2. 在指针使用时,*号表示 操作 指针所指向的内存空间中的值。
  3. *p相当于通过地址(p变量的值)找到一块内存;然后操作内存 。
  4. *p放在等号的左边赋值(给内存赋值)。
  5. *p放在等号的右边取值(从内存获取值)。

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

  1. 给p赋值p=0x1111; 只会改变指针变量值,不会改变所指的内容;p = p +1; p++
  2. 给 *p赋值 *p=‘a’; 不会改变指针变量的值,只会改变所指的内存块的值
  3. *p 在等号的左边表示给内存赋值(*p放在=号左边 写内存), *p 在等号右边表示取值(*p放=号的右边 读内存)
  4. 保证所指的内存块能修改

注意:不断的给指针变量赋值(例:p = 0x1122),就是不断的改变指针变量(和所指向内存空间没有任何关系)。

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

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

铁律2:间接赋值(*p)是指针存在的最大意义

指针指向某个变量,就是把某个变量地址否给指针
*p的使用
*p间接赋值成立条件:3个条件

  1. 2个变量(通常一个实参,一个形参)
  2. 建立关系,实参取地址赋给形参指针
  3. *p形参去间接修改实参的值
int iNum = 0; //实参
int *p = NULL;
p = &iNum;
iNum = 1;
*p =2 ; //通过*形参 == 间接地改变实参的值
*p成立的三个条件;

引申: 函数调用时,用n级指针(形参)改变n-1级指针(实参)的值。
指针传参
函数调用时,形参传给实参,用实参取地址,传给形参,在被调用函数里面用*p,来改变实参,把运算结果传出来

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

主调函数 被调函数

  1. 主调函数可把堆区、栈区、全局数据内存地址传给被调用函数
  2. 被调用函数只能返回堆区、全局数据

内存分配方式

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

输入特性:被调函数中申请内存
输出特性:主调函数中申请内存

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

在这里插入图片描述

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

一级指针做输入:

int showbuf(char *p)  //方式1
int showArray(int *array, int iNum)   //方式2

一级指针做输出:

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:一般应用禁用malloc/new

  1. 使用C语言的 malloc () 和 free () 库函数可能会带来灾难性的副作用,例如内存泄漏或者碎片。
  2. malloc () 常常会表现出极其不可预测的特性,这使其成为在多核系统上进行多线程C语言程序开发的瓶颈

总结起来,尽可能多地使用自动存储功能使你的程序:
·更快的类型;
·运行时更快;
·不易出现内存/资源泄漏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值