指针——铁律9条

铁律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)是指针存在的最大意义
(1)两码事:指针变量和它指向的内存块变量。
(2)条件反射:指针指向某个变量,就是把某个变量地址赋给指针。
(3)*p间接赋值成立条件:3个条件。
(a)2个变量(通常一个实参,一个形参)。
(b)建立关系,实参数地址赋给形参指针。
(c)*p形参去间接修改实参的值。

	int iNum=0;   //实参
	int *p=NULL;
	p=& iNum;
	 iNum=1;
	 *p=2;   //通过*形参  == 间接地改变实参的值

(4)引申:函数调用时,用n指针(形参)改变n-1指针(实参)的值。
//改变0级指针( int iNum=1;)的值,有两种方式
//改变1级指针( eg char *p=0x1111)的值,有两种方式
//改变2级指针( eg char **p=0x1111)的值,有两种方式
铁律3:理解指针必须和内存四区概念相结合
(1)主调函数 被调函数
(a)主调函数可把堆区、栈区、全局数据内存地址传给被调用函数;
(b)被调用函数只能返回堆区、全局数据。
(2)内存分配方式
(a)指针做函数参数,是有输入和输出特性的。
铁律4:应用指针必须和函数相结合(指针做函数参数)

编号 | 内存分配方式(级别+堆栈)/指针函数参数 | 主调函数实参 | 被调函数形参 | 备注
01 | 1级指针(做输入) 堆 | 分配 | 使用 | 一般应用禁用
01 | 1级指针(做输入) 栈 | 分配 | 使用 | 常用
int showbuf(char *p);
int showArray(int *array,int iNum);
02 | 1级指针(做输出) 栈 | 使用 | 结果传出 | 常用
int geLen(char *pFlleName,int *pFlleLen);
03 | 2级指针(做输入) 堆 | 分配 | 使用 | 一般应用禁用
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 *pFlleName,int *pFlleLen);
理解
主调函数还是被调用函数分配内存
被调用函数是在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);//避免野指针
理解
主调函数还是被调用函数分配内存
铁律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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
指针是C编程语言中非常重要的概念之一,对于初学者来说可能会感到害怕和困惑。但只要理解了指针的原理和用法,就会发现它其实并不可怕。 首先,指针是一个存储变量地址的变量,它可以指向任何数据类型的变量,包括整型、浮点型、字符型等等。我们可以通过指针访问变量的值,也可以通过指针修改变量的值,这是指针的一大优势。 其次,理解指针应用场景能够帮助我们更好地使用它。比如,当我们需要在函数之间传递大量的数据时,通过传递指针可以提高程序的执行效率。另外,在动态内存分配和释放中,指针也是一个必不可少的工具。 理解指针的用法也是很重要的。首先,我们需要理解指针的声明和初始化。指针的声明使用“类型 * 变量名”的语法,例如 int *ptr; 表示声明了一个指向整型变量的指针指针的初始化可以通过给指针赋值一个变量的地址或者通过取地址符&获取变量的地址。 然后,我们需要了解指针的运算。指针可以进行四种基本的运算:取地址运算符&,取值运算符*,指针加法和指针减法。取地址运算符&用于获取变量的地址,取值运算符*用于获取指针所指向的变量的值。指针加法和指针减法用于指针地址的增加和减少,不同数据类型的指针相加或相减会有不同的结果。 最后,我们需要注意指针的安全性。在使用指针的过程中,需要特别小心避免空指针、野指针等问题的出现,因为这些问题容易引发程序的崩溃或者产生不可预知的结果。 总结来说,指针作为C语言中的重要概念,我们应该尽早学习和掌握。只要理解指针的原理和用法,我们就能够更加灵活地操作内存,提高程序的效率和功能。通过不断的实践和学习,我们可以逐渐摆脱对指针的恐惧,让指针成为我们编程的得力助手。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值