指针小结

一、指针初始化

所有的指针都必须进行初始化,那么不进行初始化的指针又怎样呢?
下面看这个例子:
int * a;
*a=100;
第一条语句是声明创建了一个指针变量,然后下一条语句是把100储存在 a 所指向的内存位置。不过,a 指向哪里呢?我们虽然声明了这个变量,但是并没有进行初始化,所以,我们不知道100到底储存在什么地方。
所以在这里再次强调:所有的指针都必须初始化。那么要是这个指针本身没有任何指向呢?
我们知道在变量中,一般都是初始化为0。指针变量还是变量,所以这里也是一样的,那么这里就要说一种新的指针:NULL指针。他表示不知向任何值。

二、指针的左值

我们都知道右值是放在等号右边的变量,表示的是变量所在内存空间所存放的内容;左值就是放在等号左边的,表示储存空间。同样的指针变量也是这样。指针变量可以作为左值并不是一味它是指针,而是因为它是变量。
看下面两条语句:
*d=10-*d; ————–①
d=10-*d; ————–②
①包含了两条操作符,右边的间接访问作为右值使用,所以他的值是 d 所指向的位置所储存的值;左边的间接访问操作符作为左值使用,所以 d 所指向的位置把赋值符右侧表达式计算的结果作为他的新值。
②是非法的。他表示的是把一个整形数量存储在一个指针变量中。

三、二级指针

指针的定义是指向整形的指针,那么二级指针就是指向”指向整形的指针“的指针。
我们看下面的表达式的声明:
int a=100;
int *b=& a;
int **c=& b;
前两个都不陌生了,我们来分析一下第三个,**c:
根据操作符的自右向左结合性,我们可以写成 ( *c ),从里向外求值即可。下面看下表:

这里写图片描述

四、指针表达式

现在我们来看几个常用的指针表达式,并且分析一下他们分别作为左值和右值又是如何求值的。
我们先来声明两个变量:
char ch=’a’;
char *cp=& ch;
那么现在就来看几个指针表达式的左值和右值吧:

这里写图片描述

这里是几个简单的表达式,都是符合基本规律的,右值代表的是变量的值,左值表示的是变量所处的内存位置。而&ch等表达式不能作为左值使用,当表达式&ch进行求值时它的结果应该储存在计算家中的某个位置,但具体存在哪?并不清楚。也就是说,这些表达式并未标识任何计算机内存的特定位置,所以,它们不是一个合法的左值。

这里写图片描述

这里先来声明一下图形所代表的内容:方块代表的是内存,椭圆表示表达式的值。
那么接下来我们来看一下表格中的内容,这里只强调两点,就是 ++ 的优先级要高于 * 的优先级,另外就是关于*cp++的,前后两个操作符都是对于cp单独进行的。

五、简单的例子

说了这么多干货,现在来看一个例子解解渴吧!

int strlen(char*string)
{
int len=0;
while(*string++ != 0)
{
len++;
}
return len;
}

这是简单的求字符串长度的函数,在指针到达字符串末尾的‘\0’之前,while语句中*string++一直为真,同时增加指针的只用于下一次测试。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值