目录
作为函数参数的指针
二值互换
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;
}
下面我们来分析下程序:
- 通过调用函数表达式salary(&wage)调用函数的情况如下图:
- 在salary函数中,形参money被声明为“指向int型变量的指针变量”,函数被调用时将&wage(216号)复制到money,即money指向了wage。
- 由于在指针前加上了指针运算符*,就可以显示该指针指向的对象,因此*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。
标量型
可以将表示地址编号的指针视为一种数量。
往后还有关于指针与数组、字符串的内容,学完后关于指针的基础知识就差不多学完了,大家可以通过简单地学习数据结构与算法来更详细的学习指针的功能(体现出的好处)。