从本质理解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指针本质的应用进行了一番梳理,发现,最核心的内容往往是对于基础知识的合理运用,比如左值和右值操作符的先后顺序等等,这更加坚定了我的信念,唯有对基础知识的熟练掌握,方有问鼎云端的可能,所以,加油吧!