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.mzph.cn/news/582263.shtml

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

相关文章

win32 WM_MENUSELECT消息学习

之前写了一些win32的程序&#xff0c;处理菜单单击都是处理WM_COMMAND消息&#xff0c;通过 LOWORD(wParam) 获取菜单ID&#xff0c;判断单击的是哪个菜单项&#xff1b; 还有一些其他菜单消息&#xff1b; 当在菜单项中移动光标或鼠标&#xff0c;程序会收到许多WM_MENUSELEC…

stm32f103系统滴答定时器

简介 SysTick定时器, 是一个24位的定时器, 只能向下计数(n->0). 从RELOAD寄存器中自动重装载定时初值. 24位可以粗略约等于16M个数字. 寄存器 库函数配置系统定时器中断 选择8分频还是系统时钟源. 系统滴答次数, 也就是重装载值, 每次结束都会产生一个中断. 使用系统时钟…

12.28

1 有道云笔记 2 #include <iostream>using namespace std;class person { private:int *age;string &name; public:person(int age,string name):age(new int(age)),name(name){}~person(){delete age;}person(const person &other):age(new int(*(other.age)…

软件测试/测试开发丨学习笔记之Python运算符

运算符的作用 Python基础语法的内容通常表示不同数据或变量之间的关系 算数运算符 运算符描述加-减*乘/除%取模**幂//取整除 取模与取余区别 概念上&#xff1a;取模是计算机术语&#xff0c;取余属于数学概念&#xff1b; 结果上&#xff1a;当同号的两个数相除&#xff…

程序员如何高效学习技术?

我们相信努力学习一定会有收获&#xff0c;但是方法不当&#xff0c;既让人身心疲惫&#xff0c;也没有切实的回报。 不少朋友每天都阅读技术文章&#xff0c;但是第二天就忘干净了。工作中领导和同事都认可你的沟通和技术能力&#xff0c;但是跳槽面试却屡屡碰壁。面试官问技术…

系统学习新技术的心得体会

在当今快速发展的技术时代&#xff0c;持续学习和掌握新技术已经成为保持竞争力和创新能力的关键。系统学习新技术不仅仅是获取知识和技能&#xff0c;更是一种挑战自我、拓展视野和实现个人成长的过程。在这个过程中&#xff0c;我积累了一系列宝贵的心得体会。 首先&#xf…

EasyExcel多线程批量导出数据,动态表头,静态资源访问

1.导入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency>2.建立实体 Data public class ActResultLogVO implements Serializable {private static…

关于MySql字段类型的实践总结

当字段为数值类型时应使用无符号UNSIGNED修饰 ALTER TABLE infoMODIFY COLUMN user_id int UNSIGNED NOT NULL; 当字段为varchar类型时应注意是否选择合适的字符集 例如存储一些范围值&#xff0c;数字英文字符时&#xff08;IP、生日、客户端标识等或以“,”分隔的数据&…

Google Chrome 现在会在后台扫描泄露的密码

谷歌表示&#xff0c;Chrome 安全检查功能将在后台运行&#xff0c;检查网络浏览器中保存的密码是否已被泄露。 如果桌面用户正在使用标记为危险的扩展程序&#xff08;从 Chrome Web Store 中删除&#xff09;、最新的 Chrome 版本&#xff0c;或者如果启用安全浏览来阻止 Go…

Dolphinscheduler-3.2.0 离线部署 伪集群模式

Dolphinscheduler-3.2.0(离线)伪集群模式 一、依赖(前置准备工作) 1.JDK&#xff1a;版本要求 JDK(1.8),安装并配置 JAVA_HOME 环境变量,并将其下的 bin 目录追加到PATH 环境变量中; 2.数据库&#xff1a;PostgreSQL(8.2.15) 或者MySQL(5.7),两者任选其一即可,如 MySQL 则需要…

我的NPI项目之行业黑话 -- 电子/机构/软件/认证

因为最近的NPI项目&#xff0c;参加了很多项目的会议&#xff0c;有电子/机构/软件/认证相关的各方面的专业词汇就出现了。这里我将之称为黑话&#xff0c;就是对我&#xff08;纯软件) 来说是黑盒的话。这里简单记录并用于理解。 EE有关&#xff1a; Layout&#xff0c;一直…

基于Qt之QChart 图表(优美的曲线图案例)

## 项目演示 平台:ubuntu18.04 Qt版本:QT5.14.2 源码位置GitCode:https://gitcode.com/m0_45463480/QCharts/tree/main ## QChart 图表 自从 Qt 发布以来,给跨平台的用户带来很多便利。在 Qt5.7 之前,Qt 在开源社区版本里没有 Qt Charts(自带的绘图组件库)。这使得像…

安卓开发学习笔记

Android发展历史 开发工具 Android Studio 安装工具 下载页面&#xff1a;下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 安装步骤 要求代理&#xff0c;关闭就可以 下载SDK 完成后创建新项目 努力学习中~

12-28

#include <iostream>using namespace std; class Person {int *age;string &name; public:void ss(){cout<<"年龄:"<<*age<<endl<<"名字:"<<name<<endl;}//拷贝构造函数(深拷贝&#xff09;Person(const Pe…

docker学习(二十一、network使用示例container、自定义)

文章目录 一、container应用示例1.需要共用同一个端口的服务&#xff0c;不适用container方式2.可用示例3.停掉共享源的容器&#xff0c;其他容器只有本地回环lo地址 总结 二、自定义网络应用示例默认bridge&#xff0c;容器间ip通信默认bridge&#xff0c;容器间服务名不通 自…

C++ DAY1 作业

1.定义自己的命名空间myspace&#xff0c;并在myspace中定义一个字符串&#xff0c;并实现求字符串长度 #include <iostream>using namespace std; namespace myspace {string str;int length_fun(){getline(cin,str);int i 0;while(str[i] ! \0){i;}return i;}} using…

数字反转(升级版)#洛谷

题目背景 以下为原题面&#xff0c;仅供参考: 给定一个数&#xff0c;请将该数各个位上数字反转得到一个新数。 这次与 NOIp2011 普及组第一题不同的是&#xff1a;这个数可以是小数&#xff0c;分数&#xff0c;百分数&#xff0c;整数。整数反转是将所有数位对调&#xff…

案例214:基于微信小程序的水果销售系统的设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder …

【网络安全 | 指纹识别工具】WhatWeb使用详析

前言 WhatWeb 是一款用于识别 Web 应用程序和 Web 服务器的开源工具。它可以识别网站使用的编程语言、Web 框架、Web 服务器软件、Web 应用程序等信息&#xff0c;从而帮助安全测试人员快速了解目标网站的技术特征&#xff0c;发现可能存在的漏洞。 本文将对 WhatWeb 的使用方法…

git 如何将某个分支的某个提交复制到另外一个分支

请直接去看原文: 原文链接:git 如何将某个分支的某个提交复制到另外一个分支_gitlab里面的markdown文件可以复用其他分支的吗-CSDN博客 --------------------------------------------------------------------------------------------------------------------------------…