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


标量型

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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/311755.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Vue2+3入门到实战】(18)VUE之Vuex状态管理器概述、VueX的安装、核心概念 State状态代码实现 详细讲解

目录 一、[Vuex](https://vuex.vuejs.org/zh/) 概述1.是什么2.使用场景3.优势4.注意&#xff1a; 二、需求: 多组件共享数据1.创建项目2.创建三个组件, 目录如下3.源代码如下 三、vuex 的使用 - 创建仓库1.安装 vuex2.新建 store/index.js 专门存放 vuex3.创建仓库 store/index…

骑砍战团MOD开发(30)-游戏大地图map.txt

骑砍1战团mod开发-大地图制作方法_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1rz4y1c7wH/ 一.骑砍游戏大地图 骑砍RTS视角游戏大地图 大地图静态模型(map.txt) 军团/城镇图标(module_parties.py). 骑砍大地图的战争迷雾和天气通过API进行管理和控制: # Weather-h…

移动端开发框架mui代码在安卓模拟器上运行(HbuilderX连接到模拟器)

开发工具 HBuilder X 3.8.12.20230817 注意&#xff1a;开发工具尽量用最新的或较新的。太旧的版本在开发调试过程中可能会出现莫名其妙的问题。 1、电脑下载安装安卓模拟器 我这里使用的是 夜神模拟器 &#xff0c;也可以选择其他安卓模拟器 夜神模拟器官网&#xff1a;夜神安…

轻松删除文件名中的符号,使用替换功能,让管理文件更加得心应手!

在我们的日常生活和工作中&#xff0c;文件管理是一项必不可少的任务。而一个整洁、有序的文件名系统则有助于我们快速找到所需的文件。如果你发现文件名中存在一些不必要的符号&#xff0c;那么这款文件重命名工具将是你的得力助手。它具备强大的替换功能&#xff0c;可以轻松…

2023 搞懂git 工作目录---暂存区---本地仓库---版本库

最近了解了下git的底层原理&#xff08;大神录制的视频放在最下方&#xff09;&#xff0c;记录下&#xff1a; 工作区 就是存放待提交文件的目录&#xff08;下图图解标注&#xff09;比如pyhon_test目录暂存区 .git目录下的index文件 对应的指令 git add本地仓库 .gi…

63页!嵩山版Java开发手册分享

作为广受欢迎的编程语言之一&#xff0c;Java在软件开发领域扮演着重要的角色。然而&#xff0c;由于Java的灵活性和广泛应用&#xff0c;很容易出现代码质量低下、可读性差、维护困难等问题。为了解决这些问题&#xff0c;阿里巴巴集团发布了一份权威指南——阿里嵩山版Java开…

ansible管理windows测试

一、环境介绍 Ansible管理主机&#xff1a; 系统: redhat7.6 Linux管理服务器需安装pywinrm插件 Windows客户端主机&#xff1a; 系统: Server2012R2 Windows机器需要安装或升级powershell4.0以上版本&#xff0c;Server2008R2默认的版本是2.0&#xff0c;因此必须升…

数据库——LAMP的搭建及MySQL基操

1.实验内容及原理 1. 在 Windows 系统中安装 VMWare 虚拟机&#xff0c;在 VMWare 中安装 Ubuntu 系统,并在 Ubuntu 中搭建 LAMP 实验环境。 2. 使用 MySQL 进行一些基本操作&#xff1a; &#xff08;1&#xff09;登录 MySQL&#xff0c;在 MySQL 中创建用户&#xff0c;并对…

electron——查看electron的版本(代码片段)

electron——查看electron的版本(代码片段)1.使用命令行&#xff1a; npm ls electron 操作如下&#xff1a; 2.在软件内使用代码&#xff0c;如下&#xff1a; console.log(process) console.log(process.versions.electron) process 里包含很多信息&#xff1a; process详…

内网常规攻击路径

点击星标&#xff0c;即时接收最新推文 随着网络技术的发展&#xff0c;企业内部网络架构的变化&#xff0c;网络设备多样性的增加&#xff0c;面对内网攻击&#xff0c;防御体系逐渐阶梯化&#xff0c;通过不同维度的防御联动&#xff0c;将攻击拒之门外。对于突破网络边界后进…

Springcloud Alibaba使用Canal将Mysql数据实时同步到Redis保证缓存的一致性

目录 1. 背景 2. Windows系统安装canal 3.Mysql准备工作 4. 公共依赖包 5. Redis缓存设计 6. mall-canal-service 1. 背景 canal [kənl] &#xff0c;译意为水道/管道/沟渠&#xff0c;主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费。其诞…

Zookeeper实现分布式锁和注册中心

目录 分布式锁 实现方式 分布式锁场景如何选择Redis和zookeeper 用InterProcessMutex实现分布式锁 zookeeper实现注册中心 分布式锁 实现方式 数据库唯一索引Redis的setnxZookeeper创建临时节点及监听机制Zookeeper创建临时有序节点 分布式锁场景如何选择Redis和zookeepe…