指针--按值调用与模拟按引用调用,非法访问内存

news2024/11/16 15:44:32

在前面的章节介绍过普通变量作函数参数的方法,它其实是一种按值调用(Call by Value)的方法,即程序将函数调用语句中的实参的一份副本传给函数的形参。

例题:演示程序按值调用的例子。

#include <stdio.h>
void Fun(int par)
{
	printf("PAR = %d\n",par);
	par=2;
 } 
 
 int main(void)
 {
 	int arg=1;
 	printf("arg = %d\n",arg);
 	Fun(arg);
 	printf("arg = %d\n",arg);
 	return 0;
 }

在这里插入图片描述
程序在函数Fun()中的第二行(bar=2)改变了形参的值,并在main中调用了Fun()函数后再次输出实参的值,由程序的运行结果可以看出,函数形参值得改变并未影响实参得改变。这是因为传给函数形参的值只是函数调用语句中实参值的副本,因此,按值调用的方法不能再被调函数中改变其调用语句的实参值。
那么如何再函数中改变实参的值呢?这就要用到指针这个武器了。
指针变量的一个重要应用就是用作函数参数,指针作函数参数时,虽然实际上也是传值给被调函数(C语言中的所有函数调用都是按值调用),但是传给被调函数的这个值不是变量的值,而是变量的地址,通过向被调函数地址传递某个变量的地址值可以再被调函数中改变主调函数中的这个变量的值,相当于模拟了C++语言中的按引用调用,因此称为模拟按引用调用(Simulating Call by Reference)

例题:演示程序模拟按引用调用的例子。

#include <stdio.h>
void Fun(int *par);
int main()
{
	int arg=1;
	printf("arg = %d\n",arg);
	Fun(&arg);
	printf("arg = %d\n",arg);
	return 0;
}
void Fun(int *par)
{
	printf("par = %d\n",*par);
	*par=2;
}

在这里插入图片描述
程序将Fun中的形参改为指针类型,使用指针变量作为函数形参,这就意味着形参接收到的数据指针是一个地址值。因此main中使用取地址符&获取变量arg的地址值,并将其传给函数Fun(),从而使形参par指向了变量arg。

思考:下列程序是否能将随意输入的两个整数进行交换后在输出?

#include <stdio.h>
void swap(int x,int y);
int main(void)
{
	int a,b;
	printf("Please enter a,b:");
	scanf("%d%d",&a,&b);
	printf("Before swap :a = %d,b = %d\n",a,b);
	swap(a,b);
	printf("After swap  :a = %d,b = %d\n",a,b);
}

void swap(int x,int y)
{
	int temp=0;
	temp=x;
	x=y;
	y=temp;
}

在这里插入图片描述
从结果可以看出无法实现数据的调换。结合上一个程序的分析,再函数swap中只是对形参进行了改变,但不会对实参进行操作。

修改:

#include <stdio.h>
void swap(int *x,int *y);
int main(void)
{
	int a,b;
	printf("Please enter a,b:");
	scanf("%d%d",&a,&b);
	printf("Before swap :a = %d,b = %d\n",a,b);
	swap(&a,&b);
	printf("After swap  :a = %d,b = %d\n",a,b);
}

void swap(int *x,int *y)
{
	int temp=0;
	temp=*x;
	*x=*y;
	*y=temp;
}

在这里插入图片描述
上述程序中,若将swap中的取地址符&去掉,则会出向错误:
27 11 D:\exercise\Simulating Call by Reference\main.cpp [Error] invalid conversion from ‘int’ to ‘int*’ [-fpermissive]
可以看出大致意思使类型不同。但是在scanf是不会给出错误或警告,但是在运行程序的时候会出现问题,导致死机等情况。
在其他的一些编译器中,则会出现如非法内存访问的错误
主要原因是,去掉取地址符后,会将整形参数赋值给指针,指针知道的地址不是我们所需要的。

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

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

相关文章

关于ASO优化的搜索指数

搜索指数指数可以看出该关键词的热度&#xff0c;每一个关键词都对应着相应的指数&#xff0c;它代表着有多少人在搜索这个词。同一个词搜索的人越多&#xff0c;该关键词的热度指数就越高。 在应用商店内每天都会有用户去搜索应用&#xff0c;那么关键词的热度值至少是100。热…

三分钟免费将 Claude API 接入个人服务

首先我们介绍一下今天的主角 Claude Claude 是最近新开放的一款 AI 聊天机器人&#xff0c;是世界上最大的语言模型之一&#xff0c;比之前的一些模型如 GPT-3 要强大得多&#xff0c;因此 Claude 被认为是 ChatGPT 最有力的竞争对手。Claude 的研发公司是专注人工智能安全和研…

干货|SpringCloud-Eureka注册中心、服务提供者与消费者

内容速览&#xff1a; 一、关于注册中心、服务注册、服务发现 1问&#xff1a;为什么需要注册中心&#xff1f;2问&#xff1a;什么是服务注册&#xff1f;3问&#xff1a;什么是服务发现&#xff1f; 二、关于 Eureka 实现服务注册与服务发现 1.Eureka的特点2.Eureka注册中心…

Linux防火墙学习笔记3

iptables链的概念&#xff1a; 当客户端访问服务器端的Web服务的时候&#xff0c;客户端发送请求报文到网卡&#xff0c;而TCP/IP协议栈是属于内核的一部分。客户端的请求报文会通过内核的TCP协议传输到用户空间的Web服务&#xff0c;而客户端报文的目的地址为Web服务器所监听的…

裸辞后,过于真实...

前言 我从事软件测试行业&#xff0c;我仅从个人体验上说一下裸辞一个月的心路历程。 本人从事软件测试行业9年&#xff0c;主流测试软件都会用&#xff0c;功能&#xff0c;性能&#xff0c;接口&#xff0c;自动化测试都能独立搞定&#xff0c;近5年测试管理经验。年龄31岁…

城市内涝的原因及解决措施

城市内涝是城市面临的一个严重问题&#xff0c;它不仅会影响城市的交通、生产和生活&#xff0c;还会对城市的环境和生态造成破坏。 城市内涝是指由于强降水或连续性降水超过城市排水能力致使城市内产生积水灾害的现象。造成内涝的客观原因是降雨强度大&#xff0c;范围集中。…

Stable Diffusion使用入门教程

本文参考bilibili的链接&#xff1a;B站第一套系统的AI绘画课&#xff01;零基础学会Stable Diffusion&#xff0c;这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilibili 目录 一、prompt提示词 1、概况 2、prompt分类 3、提示词的权重分配 4、…

使用 ChatGPT(简单)+ GitHub 存储库创建 C# 聊天机器人

在本指南中&#xff0c;我们将深入探讨使用 ChatGPT 和 C# 构建聊天机器人的过程。我们将涵盖从设置 ChatGPT API 访问到部署聊天机器人的所有内容。让我们开始吧&#xff01; 最后你会发现 GitHub Repo 设置您的 ChatGPT API 访问权限 在我们开始构建我们的聊天机器人之前&…

day4 ARM异常处理

目录 异常 概念 处理机制 ARM异常源 ARM异常模式 ARM异常响应 异常向量表 FIQ和IRQ ARM微架构 指令流水线 多核处理器 异常 概念 处理器在正常执行程序的过程中可能会遇到一些不正常的事件发生这时处理器就要将当前的程序暂停下来转而去处理这个异常的时间异常事件处…

为什么CRM一定要走行业化?

很多企业、很多销售对CRM的负面评价集中在不够贴合行业、不人性化&#xff0c;也就是功能不够细分和实用。因为CRM几乎是所有企业管理系统中最贴近业务实际的&#xff0c;但各行各业的业务千差万别&#xff0c;所以功能完备、使用满意度高的CRM一定是深度行业化、与不同行业业务…

计算机网络第三章——数据链路层(上)

提示&#xff1a;节物风光不相待。桑田碧海须臾改 文章目录 前言3.1.1 数据链路层功能数据链路层功能概述 3.2.1 封装成帧和透明传输封装成帧透明传输组帧的四种方式字符计数法字符填充法零比特填充法违规编码法 3.3.1 差错控制&#xff08;检错编码&#xff09;奇偶校验码CRC循…

【编程语言 · C语言 · while语句】

​while 语句 循环 在前面我们了解到, 程序在运行时可以通过判断, 检验条件作出选择。此处&#xff0c;程序还必须能够重复&#xff0c; 也就是反复执行一段指令&#xff0c; 直到满足某个条件为止。 while 语句 while语句可以执行循环结构。 语法&#xff1a; while(表达…

6.8 互斥锁/读写锁的概念及使用、死锁的避免

目录 线程通讯-互斥 互斥锁初始化-pthread_mutex_init 互斥锁销毁pthread_mutex_destroy 申请锁-pthread_mutex_lock 释放锁-pthread_mutex_unlock 读写锁 死锁的避免 ​编辑 条件变量 线程的GDB调试 笔记 线程的互斥和同步 临界资源概念&#xff1a; 互斥锁的创…

在京东待了几年,感觉自己废了····

在一家公司待久了技术能力反而变弱了&#xff0c;原来的许多知识都会慢慢遗忘&#xff0c;这种情况并不少见。 一个京东员工发帖吐槽&#xff1a;感觉在大厂快待废了&#xff0c;出去面试问自己接口环境搭建、pytest测试框架&#xff0c;自己做点工太久都忘记了。平时用的时候…

【功能超全】基于OpenCV车牌识别停车场管理系统软件开发【含python源码+PyqtUI界面+功能详解】-车牌识别python 深度学习实战项目

车牌识别基础功能演示 摘要&#xff1a;车牌识别系统(Vehicle License Plate Recognition&#xff0c;VLPR) 是指能够检测到受监控路面的车辆并自动提取车辆牌照信息&#xff08;含汉字字符、英文字母、阿拉伯数字及号牌颜色&#xff09;进行处理的技术。车牌识别是现代智能交通…

FMC子卡设计方案原理图:两路250Msps AD、两路600Msps DA FMC子卡

一、板卡概述 ADC采用TI的ADS62P49&#xff0c;2通道250M&#xff0c;14bit&#xff0c;共1片&#xff1b; DAC采用ADI的AD9122&#xff0c;2通道&#xff0c;16bit&#xff0c;可达1.2G&#xff0c;共1片&#xff1b; 时钟采用AD9516&#xff0c;支持板上时钟和外接时钟…

驱动--自动创建设备节点

自动创建设备节点 头文件&#xff1a;#include <linux/device.h> 自动创建设备节点&#xff1a; struct class *cls; cls class_create(owner, name) /void class_destroy(struct class *cls) 功能&#xff1a;向用户空间提交目录信息 参数&#xff1a; owner :THIS_MOD…

打卡有礼!快来 2023 开放原子全球开源峰会找龙蜥玩~

回望过去&#xff0c; 2022 年开放原子全球开源峰会上&#xff0c;龙蜥社区携新一届理事成员以及 18 位产学研大咖重磅亮相&#xff0c;社区论坛及展区更是吸引了近 1400 位参会者参与互动&#xff0c;现场热闹非凡。再看今朝&#xff0c;2023 年开放原子全球开源峰会举办在即&…

淘宝618每日一猜答案(6月8日)明星孙怡最喜欢的显瘦单品?

淘宝6月8日每日一猜答案是什么&#xff1f;&#xff0c;接下来也会给大家来介绍一下6月8日淘宝大赢家每日一猜的答案。 淘宝每日一猜6月8日答案分享 活动问题&#xff1a;明星孙怡最喜欢的显瘦单品&#xff1f; 活动答案&#xff1a;【鲨鱼裤】 还有打开手机淘宝&#xff0c…

Java 高效处理千万级数据:技巧与最佳实践

引言 这篇文章主要为大家简单介绍 Java 如何处理千万级数据&#xff0c; 随着大数据时代的到来&#xff0c;数据量持续呈现爆炸式增长。在这种背景下&#xff0c;如何快速、高效地处理和分析千万级甚至更大规模的数据&#xff0c;成为企业和开发者面临的重要挑战。处理大数据…