栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言指针(二)——指针的应用及运算

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言指针(二)——指针的应用及运算

1.指针的应用 1.1值传递


我们可以看到,当程序执行到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的值并没有被交换 。

1.2 指针传递,指针和函数


然而要想在在函数中交换a,b的值,在定义函数的时候,形参用两个整型指针来接受 x 和 y 的地址。
当调用 Swap_b 函数时,我们将 x变量 和 y变量的地址传给 ap 和 bp
此时相当于 int *ap = &x; int *bp = &y;
这时候我们对ap和bp的操作,实际上是间接的对x,y操作

这时候 x,y就被交换,通过指针传递直接对地址操作

3.3 综合实例,想一想打印的结果


当程序运行到 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,所以打印结果为:

2.指针的运算
 1)指针 + -  整型 (不可以是浮点型)
 2)指针 + 指针(可以,没有意义)
 3)指针 - 指针
2.1类型对指针+1的影响 示例: int 指针变量 +1 char 类型指针变量 +1 double 类型指针变量 +1

我们可以看出,不同类型的指针变量在+1以后所指向的内存并不是都是+1
而是加了自身类型大小的字节

指针 +1详解

1.将 p 中存放的地址提取出来暂时存放在在临时空间中
2. 计算 指针类型大小 x 所加的数
3. 将临时空间中累加过的值赋值给 p

指针的类型不同, +1 的能力也不一样。
如:

typename *p ;
 p = p+1;     被编译器解释成 p = p + sizeof(typename) * 1;**

指针和整型加减后的结果仍然是整型类型

想一想下列代码运行结果(运算符优先级和结合性)

详解 2.2 关于 * 和 & 的谜题

如: 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 。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/528772.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号