本文来自LinuxC,一下摘抄整理为学习笔记。
#include <stdio.h>
int *swap(int *px, int *py){
int temp;
temp = *px;
*px = *py;
*py = temp;
return px;
}
int main(void){
int i = 10, j = 20;
int *p = swap(&i, &j);
printf("now i=%d j=%d *p=%d\n", i, j, *p);
return 0;
}
int *px = &i;int *py = &j;
所以px和py分别指向main函数的局部变量i和j,在swap函数中读写*px和*py其实是读写main函数的i和j。尽管在swap函数的作用域中访问不到i和j这两个变量名,却可以通过地址访问它们,最终swap函数将i和j的值做了交换。
上面的例子还演示了函数返回值是指针的情况,return px;语句相当于定义了一个临时变量并用px初始化:
int *tmp = px;
然后临时变量tmp的值成为表达式swap(&i, &j)的值,然后在main函数中又把这个值赋给了p,相当于:
int *p = tmp;
最后的结果是swap函数的px指向哪就让main函数的p指向哪。我们知道px指向i,所以p也指向i。
int a[10];
int *pa = &a[0];
pa++;
首先指针pa指向a[0]的地址,注意后缀运算符的优先级高于单目运算符,所以是取a[0]的地址,而不是取a的地址。
然后pa++让pa指向下一个元素(也就是a[1]),由于pa是int *指针,一个int型元素占4个字节,所以pa++使pa所指向的地址加4,注意不是加1。
E1[E2]这种写法和(*((E1)+(E2)))是等价的。由于(*((E1)+(E2)))显然可以写成(*((E2)+(E1))),所以E1[E2]也可以写成E2[E1],这意味着2[a]、2[pa]这种写法也是对的,但一般不这么写。