C语言之指针和函数

目录

作为函数参数的指针

 二值互换

scanf函数和指针

指针的类型

空指针

标量型


在C语言程序中,指针的一个重要作用就是作为函数参数使用,下面我们就来学习作为函数参数的指针的相关内容。


作为函数参数的指针

假如我有一个神奇的能力,能改变我所获得的工资,我想让它是多少就是多少,我们先来判断下面的这部分函数是可用的吗?

oid salary(int money)
{
	if(money < 20000)
		money = 20000;
}

显然这样是不行的,函数的形参无论怎样修改,都是临时赋值的值,并不会反映到主调函数的实参中,,如果不能直接修改,就可以通过指针间接修改,如下:

#include<stdio.h>

/*让我的工资不到2万达到2万*/
void salary(int *money)
{
	if(*money < 20000)
		*money = 20000;
}
int main()
{
	int wage = 9999;
	
	salary(&wage);
	
	printf("我的工资变为:%d。", wage);
	
	return 0;
}

下面我们来分析下程序:

  1. 通过调用函数表达式salary(&wage)调用函数的情况如下图:
  2. 在salary函数中,形参money被声明为“指向int型变量的指针变量”,函数被调用时将&wage(216号)复制到money,即money指向了wage。
  3. 由于在指针前加上了指针运算符*,就可以显示该指针指向的对象,因此*money就是wage的别名。
  • 综上所述,要想在函数中修改变量的值,就需要传入指向改变量的指针,告诉程序:传入的是指针,请对该指针指向的对象进行处理!

只要在被调用的函数里的指针写上指针运算符*,就能间接的处理该指针指向的对象,这也是*运算符也称为间接访问运算符的原因,通过在指针前写上指针运算符*访问该指针指向的对象,称为解引用(dereference)


 二值互换

#include<stdio.h>
/*将px、py指向的对象的值进行互换*/

void swap(int *px, int *py)
{
	int temp = *px;
	*px = *py;
	*py = temp;
}

int main()
{
	int na, nb;
	printf("请输入两个整数。\n");
	
	printf("整数A:");    scanf("%d", &na);
	printf("整数B:");    scanf("%d", &nb);

	swap(&na, &nb);
	puts("互换后的值是:");
	
	printf("整数A的是:%d\n", na);
	printf("整数B的是:%d\n", nb);
	
	return 0;
}

在调用swap函数后,作为指针的的形参px、py分别指向na、nb,在swap函数内交换了*px和*py的值就相当于在main函数内交换了na和nb的值。


scanf函数和指针

scanf函数的使命是为主调函数中定义的对象保存值,倘若它接受到的纯粹是变量的值,是无法保存的,因此scanf函数接收到的是指针(具有地址的“值”),由该指针所指对象保存从标准输入读到的值。

因此,调用scanf函数的一方必须发出以下请求:请将读取到的值放入该地址指向的对象中存储


指针的类型

对如上的程序中的部分语句进行如下改动:

	double na, nb;
	printf("请输入两个整数。\n");
	
	printf("整数A:");    scanf("%lf", &na);
	printf("整数B:");    scanf("%lf", &nb);

	swap(&na, &nb);
	puts("互换后的值是:");
	
	printf("整数A的是:%f\n", na);
	printf("整数B的是:%f\n", nb);

进行二值互换后,得到互换后的值是一个随机生成的值,是因为swap进行的是int型数值的互换,而传入的却是double类型的指针。

一般情况下,指向type型对象的指针,即Type*指针,并不只是指向()()号,更确切的说是指向以()()号为首地址的Type型对象。

除了使用一些特殊的技巧下,Type*型指针一般不会指向Type型以外的对象。


空指针

空指针(null pointer)是能够和指向对象的指针明确区分的“什么也不指向”的特殊指针,表示空指针的对象式宏,是称为空指针常量的NULL


标量型

可以将表示地址编号的指针视为一种数量。


往后还有关于指针与数组、字符串的内容,学完后关于指针的基础知识就差不多学完了,大家可以通过简单地学习数据结构与算法来更详细的学习指针的功能(体现出的好处)。

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

学海无涯.苦作舟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值