指针、间接访问和左值
int a;
int *d = &a;
指针变量可以作为左值,并不是因为它们是指针,而是因为它们是变量。对指针变量进行间接访问表示我们应该访问指针所指向的位置。间接访问指定了一个特定的内存位置,这样我们可以把间接访问表达式的结果作为左值使用。
指针、间接访问和变量
*&a = 25;
这个表达式的意思是把值25赋值给变量a,首先&操作符产生变量a的地址,它是一个指针常量,接着,*操作符访问其操作数所表示的地址。在这个表达式中,操作数是a的地址,所以值25就存储于a中。这条语句和 a = 25; 做比较,从功能上说是相同的,但是上述表达式涉及更多的操作,会使所产生的目标代码将会更大、更慢,使源代码可读性变差,因此没有人会使用。
指针常量
*100 = 25;
这条语句实际上是非法的,因为字面值100的类型是整形,而间接访问操作只能作用于指针类型表达式,如果确实想把25储存于位置100,必须使用强制类型转换。
*(int *)100 = 20;
强制类型转换把值100从“整形”转换为“指向整形的指针”,这样对它进行间接访问就是合法的,就相对于把值25存储于a。
指针的指针
int a = 12;
int *b = &a;
int **c = &b;
//分析
表达式 相对于表达式
a 12
b &a
*b a, 12
c &b
*c b, &a
**c *b, a, 12
实例
//计算一个字符串的长度
#include <stdlib.h>
size_t
strlen(char *string)
{
int length = 0;
//依次访问字符串的内容,计数字符数,直到遇见NUL终止符
while(*string++ != '\0')
length += 1;
return length;
}