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


标量型

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


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTML5和JS实现新年礼花效果

HTML5和JS实现新年礼花效果 2023兔年再见&#xff0c;2024龙年来临了&#xff01; 祝愿读者朋友们在2024年里&#xff0c;身体健康&#xff0c;心灵愉悦&#xff0c;梦想成真。 下面是用HTML5和JS实现新年礼花效果&#xff1a; 源码如下&#xff1a; <!DOCTYPE html>…

Apollo自动驾驶:从概念到现实的里程碑

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 ChatGPT体验地址 文章目录 前言1. Apollo Client2. Apollo Server3. Apollo Federation4. Apollo Tracing5. Apollo Codegen6. Apollo Link7. 其他工具和框架结论 &#x1f680;&#x1f…

插入排序 InsertionSort

插入排序的原理是默认前面的元素都是已经排序好的&#xff0c;然后从后面逐个读取插入到前面排序好的合适的位置&#xff0c;就相当于打扑克的时候每获取一张牌的时候就插入到合适的位置一样。 以{26,53,48,11,13,48,32,15)为例&#xff0c;插入排序的过程如下所示: 动态演示 …

如何实现WinApp的UI自动化测试?

WinApp&#xff08;WindowsAPP&#xff09;是运行在Windows操作系统上的应用程序&#xff0c;通常会提供一个可视的界面&#xff0c;用于和用户交互。例如运行在Windows系统上的Microsoft Office、PyCharm、Visual Studio Code、Chrome&#xff0c;都属于WinApp。常见的WinApp&…

gitee(码云)仓库内容更新,使用TortoiseGit同步本地仓库和远程仓库

前言&#xff1a; 网上有很多同步仓库教程&#xff0c;但都是git命令行操作。这篇使用TortoiseGit可视化操作同步本地仓库和远程仓库 克隆本地仓库&#xff0c;上传远程仓库&#xff0c;下载TortoiseGit可以看这篇使用gitee&#xff08;码云&#xff09;上传自己的代码&#xf…

DFS

目录 DFS 实现数字全排列 N 皇后问题 DFS 算法的理解 优先考虑深度&#xff0c;换句话说就是一条路走到黑&#xff0c;直到无路可走的情况下&#xff0c;才会选择回头&#xff0c;然后重新选择一条路。空间复杂度&#xff1a;O&#xff08;h&#xff09;和高度成正比 不具…

F12开发者工具如何找到对应接口

Web问题定位 1、进入 NetWork页面2、点击Fetch/XHR&#xff0c;这里可以看到页面发起的接口3、找到出问题的接口4、NetWork页面怎么看接口详情5、问题定位 最常用的定位前后端问题的方法。即&#xff1a;一般用来查看是后端返回给前端的数据有误&#xff0c;还是前端显示有误。…

详解Vue3中的鼠标事件click和dblclick

本文主要介绍Vue3中的常见鼠标事件。 目录 一、click——单击事件二、dblclick——双击事件三、在使用click和dbclick需要注意的地方 下面是Vue 3中常用的鼠标事件&#xff1a; 一、click——单击事件 click事件是一种常见的事件类型&#xff0c;用于在用户点击某个元素时触发…

网络运行状况监控工具

网络运行状况是网络在其操作和环境约束范围内按预期运行的能力&#xff0c;但是&#xff0c;随着云和人工智能等技术的出现&#xff0c;网络变得越来越复杂&#xff0c;维护其 IT 基础设施是一项越来越繁琐的任务。为了确保网络可靠性&#xff0c;组织需要了解每个端点的运行状…

高并发处理专题研究 - epoll并发编程[更新中]

文章目录 1 前置知识1.1 Socket编程基础Socket概述Socket通信模型Socket API一个简单的Socket编程实例 1.2 IO多路复用1.3 阻塞原理 2 epoll原理2.1 epoll概述2.2 epoll系统调用epoll_create()epoll_ctl()epoll_wait() 2.3 epoll工作原理 3 示例代码及演示 1 前置知识 1.1 Soc…

了解 NSA 关于管理 OSS 和 SBOM 的最新指南

开源软件很容易受到恶意行为者的攻击&#xff0c;但软件材料清单可以帮助减轻威胁。美国国家安全局的指导为管理生态系统奠定了坚实的基础。 软件供应链安全仍然是网络安全和软件行业的一个关键话题&#xff0c;并且有充分的理由&#xff0c;从针对大型软件供应商的持续攻击到…

vue3使用vuex

vuex: 状态管理工具 使用场景&#xff1a;用户登录状态 购物车 地理位置 等 数据位置&#xff1a;内存 安装 项目根目录 yarn add vuex 在src目录下新建store文件夹 下面新建index.js src/store/index.js 在main.js中引入并使用 // 导入状态管理工具vuex import store…

基于价值认同的需求侧电能共享分布式交易策略(matlab完全复现)

目录 1 主要内容 2 部分程序 3 程序结果 4 下载链接 1 主要内容 该程序完全复现《基于价值认同的需求侧电能共享分布式交易策略》&#xff0c;针对电能共享市场的交易机制进行研究&#xff0c;提出了基于价值认同的需求侧电能共享分布式交易策略&#xff0c;旨在降低电力市…

23 UVM Event

even机制提供进程之间的同步。与System Verilo event相比&#xff0c;UVM event提供了额外的灵活性&#xff0c;如保持事件等待器/event waiters的数量和设置回调。 uvm_event类声明&#xff1a; virtual class uvm_event_base extends uvm_object class uvm_event#(type Tuv…

语义分割的应用及发展

语义分割(Semantic Segmentation)是一种计算机视觉领域的任务&#xff0c;旨在将一张图像中的每一个像素都分配一个语义标签&#xff0c;即将图像中的每个物体区域进行精确的分类划分。例如&#xff0c;在一张街景图中&#xff0c;语义分割可以将人、车、路、天空等每个像素分别…

Android14新特性 开启前台service服务

1. Android14新特性 1.1. 场景 在Android14&#xff08;targetSDK34&#xff09;系统手机开启前台service服务崩溃 ATAL EXCEPTION: mainProcess: com.inspur.lbrd, PID: 15634java.lang.RuntimeException: Unable to create service com.inspur.lbrd.service.KeepAliveServi…

计算机毕业设计 基于html5的图书管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

数据结构期末复习(1)数据结构和算法 线性表

数据结构期末总复习&#xff08;gaois课堂版&#xff09; 数据结构的概念 数据结构是计算机科学中的一个重要概念&#xff0c;它指的是组织和存储数据的方式。数据结构可以帮助我们高效地操作和管理数据&#xff0c;使得计算机程序能够更加有效地执行各种任务。 数据结构有很…

关于链表的一些问题

求链表的中间节点 可以定义两个指针&#xff0c;一个一次走两步一个一次走一步&#xff0c;当走的快的走到NULL时&#xff0c;走的慢的就是链表的中间节点。&#xff08;此法求出的偶数个节点的链表的中间节点是它中间的第二个&#xff09; 求倒数第K个节点 也可以定义两个指…

【HarmonyOS】ArkTS语言介绍与组件方式运用

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…