从本质理解C指针的应用(2)
来源:互联网 发布:淘宝店怎么去推广 编辑:程序博客网 时间:2024/06/15 14:26
前面我们提到过要想真正的理解C指针,那么对于它的操作符自然而然的需要十分的熟悉,上文说到左值和右值对于C指针的重要性,今天我们就来具体的谈一谈C 指针的应用
char ch='a';char *p=&ch;
上面的代码十分的清晰,初始化了一个值为’a’的字符变量ch,和一个值为ch地址的指针变量p,众所周知,声明一个指针变量并不会自动的分配任何内存,在对指针执行间接访问前,指针必须进行初始化:使它指向现有的内存(如上)或者分配动态内存(malloc),对于未初始化的指针变量执行间接访问操作(*
)是非法的,也就是说我们不能够在代码中出现所谓的野指针,否则程序调试将会出现大问题。
指针的应用——指针表达式
以代码片段为例:
char ch='a';char *p=&ch;
表达式:&ch
左值:非法(&求值时,我们只知道求取的值,但不知晓存放在何处,有定义可知非法)
右值:合理(ch当前位置的值)
表达式:&p
左值:非法(存储位置不明确)
右值:合理(指针的地址)
表达式:*p
左值:合理(指向ch的地址)
右值:合理(提取ch中的值)
表达式:*p+1
左值:非法 (*优先级高于+,但此时并未指明地址)
右值:合理(值为a+1)
表达式:*(p+1)
左值:合理(指明了ch下一个地址;若没有*,则非法)
右值:合理(提取ch下一个地址的值)
表达式:++p
左值:非法( 结果增值后指针的一份拷贝,但并未指明地址)
右值:合理(是指针增值后的值)
表达式:p++
左值:非法(只指明一个值,没有明确位置)
右值:合理(时指针未增值前的值的拷贝)
表达式:*++p
左值:合理(指明增值后指针的位置)
右值:合理(提取增值后指针位置中的值)
表达式:*p++ (常用于访问数组)
左值:合理(指明当前指针的位置)
右值:合理(提取当前指针位置的值)
PS:这里涉及3个步骤:1.++操作符产生P的一份拷贝。2.然后++操作符增加p的值。3.最后,在p的拷贝上执行间接访问操作(即未增加的p值)
表达式:++*p
左值:非法(结果是++拷贝后的一份值)
右值:合理(先执行*p提取地址中的值,然后++,使得结果为++后的拷贝的值)
表达式:(*p )++
左值:非法(结果是*p的值)
右值:合理(先执行*p提取地址中的值,然后++,但结果时*p
的值)
说了这么多,看一看现学现卖的例子吧
代码
#include<stdio.h>int Strlen(char*string){ int a=0; while(*string++!='\0') a+=1; return a; } int main() { int b; char *s; gets(s); b=Strlen(s); printf("the len=%d",b); return 0; }
上栗中,使用了*string++来统计字符串个数,首先使得string++,但返回的却是string当前的值,所以开始的时候指向的是字符串第一个位置,然后一直到字符串结束的位置,此时为'\0'
,所以终止。说白了*string++,是先判断,然后再移动位置的。
总结
本次对于C指针本质的应用进行了一番梳理,发现,最核心的内容往往是对于基础知识的合理运用,比如左值和右值,操作符的先后顺序等等,这更加坚定了我的信念,唯有对基础知识的熟练掌握,方有问鼎云端的可能,所以,加油吧!
- 从本质理解C指针的应用(2)
- 从本质理解C指针的应用(1)
- C语言的本质(10)——指针本质
- 指针的本质(一) 从CPU的位数说起
- C语言指针从理解到深入(2)
- C/C++ 中指针的本质(2)——指针之高级篇
- C/C++中指针,多级指针的理解和应用
- 深入浅出--C\C++指针的本质
- 从汇编角度分析C语言的本质(一)
- C指针本质
- c++父类指针强制转为子类指针后的测试(帮助理解指针访问成员的本质)(反多态)
- C语言的本质(13)——指向指针的指针
- 指针的本质2-void和void*及其应用在nginx中的应用
- C 指针的理解
- C 指针的理解
- C 指针的理解
- C 指针的理解
- C 指针的理解
- db2dart工具
- activity无法直接跳转到fragment中
- 23种设计模式(1)-单例模式
- 各种距离
- C#中英文混合字符串对齐输出
- 从本质理解C指针的应用(2)
- 初识博客
- MFC中修改静态文本框中文字的字体、颜色
- OWASP中国来讯飞嘉年华放大招啦
- PHP的Mcrypt加解密
- Andaroid之静态Fragment之间传值两种思路
- Unity网格合并_合并后模型与碰撞器位置变化问题
- switch和assert的详解
- python ethereum 代码分析《2》