C语言指针的基础知识2

// 以一个简单地交换两个数为例
// 不能完成互换
#include <stdio.h>
void swap_1(int x, int y)	//第二行
{	
	int t;
	t = x;
	x = y;                   //这是没学指针时写的函数
	y = t;
}
int main()
{
	int x=3, y=4;
	swap_1(x,y);
	printf("x=%d, y=%d\n",x,y);       //输出结果为 x=3, y=4;
	return 0;
}
	那么究竟为什么没能实现两个数交换呢?
		其中要注意的是main函数中调用swap_1函数,其中括号填的是实参(可以理解为用户输入的参数)
		而第二行中的swap_1 中的参数为形参(顾名思义形式参数)而在本程序中形参为局部变量,实参为全局变量
		即使形参和实参的名字一样,但是是不同的东西
		因为在运行过程中调用函数后系统会给形参分配新的存储单元,但在执行完函数之后
		此函数是没有返回值的,故在swap_1函数中 x 与 y 的值确实的得到了交换 
		但是函数执行完后(形参)x 与 y 的存储单元就被释放,故最后的结果相当于没有交换。
		主要是因为,在swap_1函数中完成交换的两个数之后存储单元被释放
		(当然有返回值的话可以实现,但现在讨论的是没有返回值)
		(因此要用一种工具,在函数没有返回值的情况下能把已交换的值在存储单元被释放前带到主函数main中)
		(那么我们应该考虑的是改变其地址,就是变量所指的地址)
		从而完成数字的交换。
		那么 C程序的灵魂 —— 指针能够帮到我们! 

//可以完成互换功能
#include <stdio.h>
void swap_1(int *p, int *q)	
//再强调下,这里 x,y 为 变量名,数据类型为 int * ,是用来存储整形变量地址的变量
//而 *x,*y 表示的是以x(或y)的内容为地址的变量,即是一个值,而且是int类型,即*x,*y是一个地址!!!	
{	
	int t;	  //如果要互换*p和*q的值,t要定义为int类型,不能定义为 int *(等号左右两边数据类型要一致)
	t = *p;				// *p = x, *q = y;
	*p = *q;  					                                 
	*q = t;              // 这一操作即是把 a , b的地址互换从而达到数字互换的目的。
}
int main()
{
	int x=3, y=4;
	swap_1(&x,&y);		// 注意传入的不是值,而是地址!
	printf("x=%d, y=%d\n",x,y);       //输出结果为 x=4, y=3;
	return 0;
}
		通过指针能改变两个变量的值~
#附注:
		* 的几个含义(用法):
		1. 作为乘法的运算符
		2. 用来定义指针变量  例如: int *p; 
							p 为变量名字,int *  为数据类型表明变量p只能存放int类型数据的地址
		3.指针(运算符)
			用在已定义好的指针变量前面,比如2中的p为已经定义好的指针变量。
			如果 p 为一个已定义好的指针变量
			则  *p 表示为以 p 的内容为地址的变量(可以说是一个值,像2中就是一个int类型的值)						
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Michael 2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值