指针的间接访问如下:
int a;
int *d = &a; //d指向变量a的地址
*d = 10 - *d; //左边的*d 是以变量身份存在,右边的*d是以指针的形式存在
d = 10 - *d; //这是一条非法语句。
指针常量:
//假设地址100存放了整型数20
*100 = 20; //这种方式为非法形式
*((int*)100) = 20; //合法方式,
/*
* 解析: (int*)100是将100强制转换成指向内存地址100处且存放的值为int型的指针常量。
* *(int*)100 = 20, 是将整型值20放到硬件地址为100的地方。
*/
指针的指针:
/*指向指针的指针*/
int a = 12; //1
int *b = &a; //2
int **c = &b; //3
/*
* 解析:
* **c需要右结合性,从里向外进行分析。
* 由第3行 **c = &b,右结合性:
* ==> c = &b;
* ==> *c = *(&b) = b = &a;
* ==> **c = **(&b) = *(*&b) = *b = *(&a) = a;
* 故可以推导出 **c = a, 即c是指向指针的指针。
*/
指针表达式:
char ch = 'a'; //ch是字符变量,内容是字符'a'
char *cp = &ch; //cp指向字符变量&ch
/*
* 解析:
* 1. &ch可以作为右值,表示变量的地址。
* 2. &ch不可以作为左值,违法操作。
* 3. *cp = 'a', cp指向 'a'的地址。
* 4. *cp + 1 = 'a' + 1 = 'b',内容+1
* 5. *(cp+1)指向ch地址的下一个单元内容。
* 6. ++*cp, 右结合性可知,++(*cp) = 'a'+1 = 'b'
* 7. (*cp)++ = ++*cp
* 8. *cp++ = *(cp++) = *(cp+1)指向ch的下一个单元。
* 9. ++*++cp,右结合性,++*(++cp)即ch的下一个单元++*(ch下一个单元)
* 即对ch下一个单元的内容+1.
*/