我们可以看到,当程序执行到Swap_a(x,y);时 x,y 变量的值被复制了一份,传到 函数的形参 a, b 中,此时,a 和 b并不是x,y本身,他是在Swap_p函数的栈帧中重新定义的整型变量,只不过是接收了 x和y 的值,我们用第三方变量 c 交换了 a,b 变量的值以后,Swap_p 函数结束后栈帧释放 a 和 b的生命周期结束,然而x,y的值并没有被交换 。
然而要想在在函数中交换a,b的值,在定义函数的时候,形参用两个整型指针来接受 x 和 y 的地址。
当调用 Swap_b 函数时,我们将 x变量 和 y变量的地址传给 ap 和 bp
此时相当于 int *ap = &x; int *bp = &y;
这时候我们对ap和bp的操作,实际上是间接的对x,y操作
这时候 x,y就被交换,通过指针传递直接对地址操作
当程序运行到 func 函数时,将s传给 int *p 而s里存放的是x变量的地址,相当于 int *p = &x;
此时 *p = 100;实际上是间接操作 x,使x的值为100;
程序执行到下一条语句 p = &a; 将a的地址给了p;
fun 函数结束释放栈帧,我们可以看到,虽然改变了p存放的地址,使得p指向a,但是s的值并没有被改变,而 x的值经过一系列操作已经被改为了 100,所以打印结果为:
1)指针 + - 整型 (不可以是浮点型) 2)指针 + 指针(可以,没有意义) 3)指针 - 指针2.1类型对指针+1的影响 示例: int 指针变量 +1 char 类型指针变量 +1 double 类型指针变量 +1
我们可以看出,不同类型的指针变量在+1以后所指向的内存并不是都是+1
而是加了自身类型大小的字节
1.将 p 中存放的地址提取出来暂时存放在在临时空间中
2. 计算 指针类型大小 x 所加的数
3. 将临时空间中累加过的值赋值给 p
指针的类型不同, +1 的能力也不一样。
如:
typename *p ; p = p+1; 被编译器解释成 p = p + sizeof(typename) * 1;**
指针和整型加减后的结果仍然是整型类型
想一想下列代码运行结果(运算符优先级和结合性)
如: int a = 10; int *ap = &a;
假如有一个 int 类型的变量 a ,pa 是他的指针,那么*&a,和&*pa, *&pa 分别是什么意思?
*&a可以理解为*(&a),&a表示取变量a的地址(等价于pa),*(&a)表示取这个地址上的数据(等价于*pa) ,绕来绕去,又回到了原点, *&a仍然等价于a
&*pa可以理解为&(*pa), *pa表示取得pa指向的数据(等价于a) , &(*pa) 表示数据的地址(等价于&a),所以&*pa等价于pa
*&pa 可以理解为 *(&pa),&pa表示pa指针自身地址并不是它保存的地址,
*(&pa) 等价于pa 。



