C语言指针入门学习、知识点梳理(三)

news2024/11/25 18:35:21

本篇继续深入介绍C语言指针的基本概念与知识点,以经典指针程序--------”互换两个数字“进行阐述,基础不牢地动山摇,有关指针的基础概念,需要提前学习的,可以通过链接跳转至第一、第二篇。

C语言指针入门学习、概念梳理(一)

C语言指针入门学习、概念梳理(二)

C语言指针入门学习、知识点梳理(三)

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

首先看一个经典程序 : ”互换两个数字“

# include <stdio.h>
//不能完成互换功能
void exchange_1(int a, int b) //形参接收的是值,而不是a,b的地址,实参和形参互不影响,简单来说,
                              //此处括号中及子函数中的形参a,b可以改成其他任意字符,如x,y效果是一样的。
{
	int t;
	t = a;      //此处的a,b与exchange_1()括号中的a,b是同一个
	a = b;
	b = t;	
	return;     //经过exchange_1函数后,修改了形参a,b 的值,但不影响main函数中实参a,b的值,所以输出还是a = 3,b = 5
}
int main(void)
{
	int a = 3;  //实参 
	int b = 5;         
    exchange_1(a,b);  //此处括号的a,b与main函数定义的a,b相同,实参单向传给形参
	printf("a = %d, b = %d\n", a,b);
	
	//exchange_1函数中的形参a,b与 main主函数中的实参a,b不是同一个a,b
}
---------------------------------------------------------------------------------------------------------------------------------
	
	运行结果: a = 3, b = 5  //想想为什么?为什么没有交换数值?
	
    经过main主函数exchange_1(a.b)后,实参a,b将数值3,5传递给形参,进入交换子函数后,在函数内部完成了交换,
    随后形参a,b的空间释放,而实参空间未释放,仍是a = 3,b = 5 ,故未达成互换目的。

    形参交换了数据,而实参保持原数据不变,这是单向的实参到形参的传递过程,所以形参的值改变后实参的值没变,
    形参在函数中是变量名,在函数调用时,形参被临时分配相应的内存。调用结束后,形参单元被释放,而实参单元保留并维持原值。   
运行结果是 3,5 还是 5, 3 ?首先要知道,局部变量执行完就释放了,达不到置换效果。main函数中的局部变量a,b,只在本函数使用,所以与exchange_1函数中的a,b不冲突,如果结果是a = 5,b = 3意味着exchange_1把main函数中的a,b改写了;如果结果还是a = 3 , b = 5意味着调用完exchange_1函数后,a,b的值照样没有改变。

若要使其数值交换,需要如何更改呢?

1.在调用子函数更改数值后,在子函数结束,释放形参空间前将结果输出打印出来,另外在主函数中输出打印a,b,测试实参a,b是否被修改

# include <stdio.h>
//不能完成互换功能
void exchange_1(int x, int y)   //形参与实参互不影响,因此与使用什么符号无关
{
	int t;
	t = x;      //此处的a,b与exchange_1()括号中的a,b是同一个
	x = y;
	y = t;	
    printf("a = %d,b = %d\n", x,y);  //形参交换成功,在函数结束,释放形参前将结果打印输出 
    return;
}

int main(void)
{
	int a = 3;  //实参 
	int b = 5;         
    exchange_1(a,b);  //此处括号的a,b与main函数定义的a,b相同,实参单向传给形参x,y
    printf("a = %d,b = %d\n", a,b);   //参照组,看看实参a,b的值是否被更改 
}


------------------------------------------------------------------------------------------------------------------------------

运行结果 : 
          a = 5,b = 3
          a = 3,b = 5

结果表明,形参与实参互不影响,形参交换成功,实参未能交换,因为函数调用结束形参将被释放,主函数中实参值不变。

在这里插入图片描述

2. 使用指针------错误用法

# include <stdio.h>
//不能完成互换功能
void exchange_2(int * p, int * q)   //此处指针变量是p, int *是数据类型,指针变量p必须接收同类型的变量地址
{
//	int t;               //error:错误,t = p类型不一致,p是指针变量,t也必须是同类型变量
    int * t;             //若要互换p、q的值,t必须是int *类型,不能是int类型
	t = p;
	p = q;
	q = t;
    return;
}

int main(void)
{
	int a = 3;
	int b = 5;
	//exchange_2(*p, *q);    //error: 错误,形参中指针变量p必须接收同类型的便利地址,*p,*q不是变量地址。
	//exchange_2(a, b);      //error: 错误,理由同上
	exchange_2(&a, &b);      //正确,&a, &b都是整型变量地址,传递给整型指针变量p
	printf("a = %d, b = %d\n", a, b);  //对于a,b来说,值和地址都没变,换的是p,q存储的内容。
	return 0;
}

------------------------------------------------------------------------------------------------------------------------------

运行结果:  a = 3, b = 5


1.不要把p,q看成是指针,单纯看成变量,调用函数时传入的不是a,b而是a,b的值,相当于把a,b的值拷贝了一份传递给p,q, 子函数怎么玩都是p,q的值,而不是a,b本身,形参的改变不影响实参。

2.p是地址,*p是值,p和q的地址互换并不影响a,b ,a,b的地址和值并没有改变, 通俗来讲就是:a,b分别住在两间房中,p,q把门牌号互换了,但a,b还各自躺在原来的房间里,房间相对于走廊的地址并没有变(如a开始是在二楼第一间,互换门牌号后还是在二楼第一间)

在这里插入图片描述

3.使用指针------正确用法:

# include <stdio.h>
//能完成互换功能
void exchange_3(int * p, int * q)   //此处指针变量是p, int *是数据类型,指针变量p必须接收同类型的变量地址
{
    int  t;             //若要互换*p、*q的值,t的类型要与*p,*q一致,即int整型,不能定义成int * 否则语法会错误
	t = *p;             //*p代表的是以p的内容为地址的变量,p存放整型地址,则*p代表整型变量,所以*p是int整型,即t也要是整型int t;
	*p = *q;            //*p就是a, *q就是b,所以互换的不是q,p的值,此函数将a,b的值给改了,完成了交换
	*q = t;             //这里的*p,*q在全局整个程序中都是等同于a, b的,所以*p,*q地址和值都已改变,成功交换主函数中的a,b
    return;
}

int main(void)
{
	int a = 3;
	int b = 5;
	exchange_3(&a, &b);      //正确,&a, &b都是整型变量地址,传递给整型指针变量p
	printf("a = %d, b = %d\n", a, b);  //对于a,b来说,值和地址都没变,换的是p,q存储的内容。
	return 0;
}

-------------------------------------------------------------------------------------------------------------------------

运行结果: a = 5, b = 3



这里的*p,*q在全局整个程序中都是等同于a, b的,所以*p,*q地址和值都已交换,所以等价于a,b交换。

在这里插入图片描述
仔细观察exchange_1()、exchange_2()、exchange_3()的相同与不同之处,为何只有3才能交换成功。
因为
exchange_1()只改变形参,实参地址与值没变,交换失败;
exchange_2()只交换形参地址,不影响实参,交换失败;
exchange_3()交换*p,*q地址和数值都交换了,且二者分别等同于a,b,故交换成功。

(本人能力有限,博客仅供广大网友参考学习,若有不足之处,还望指正,共同进步!)

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

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

相关文章

Linux常见指令

Linux常见指令 引言Linux常见指令查指令——man文件管理相关指令lspwdcdtouchmkdirrmdir与rmrmdirrm cpmvfind 文件查看类catmorelesshead 与 tailheadtail使用管道显示某段内容 grep 打包压缩相关指令zip/unziptar 总结 引言 Linux与我们熟悉的Window都是操作系统&#xff0c…

C语言之指针详解(6)

目录 本章重点 1. 字符指针 2. 数组指针 3. 指针数组 4. 数组传参和指针传参 5. 函数指针 6. 函数指针数组 7. 指向函数指针数组的指针 8. 回调函数 9. 指针和数组面试题的解析 指向函数指针数组的指针 指向函数指针数组的指针是一个指针指针指向一个数组 &#xff0…

【Shiro】第三章 Shiro入门

目录 1、身份认证 2、Realm 3、编码、散列算法 4、Realm使用散列算法 1、身份认证 【1】基本流程 流程如下: 1、Shiro把用户的数据封装成标识token,token一般封装着用户名&

《C++程序设计原理与实践》笔记 第19章 向量、模板和异常

本章将完成最常见、最有用的STL容器vector的设计与实现。我们将展示如何实现元素数量可变的容器&#xff0c;如何以参数形式指定容器的元素类型&#xff0c;以及如何处理越界错误。本章使用的技术依赖模板和异常&#xff0c;因此我们将介绍如何定义模板&#xff0c;并给出资源管…

糖化学试剂:4594-52-9,1,3,5-三乙酰基-2-脱氧-D-赤式戊呋喃糖,试剂用途说明

基础产品数据&#xff08;Basic Product Data&#xff09;&#xff1a; CAS号&#xff1a;4594-52-9 中文名&#xff1a;1,3,5-三乙酰基-2-脱氧-D-赤式戊呋喃糖 英文名&#xff1a;1,3,5-Tri-O-acetyl-2-deoxy-D-erythro-pentofuranose 沸点 &#xff1a;329.342.0 C at 760 m…

vue2、vue3分别配置echarts多图表的同步缩放

文章目录 ⭐前言⭐使用dataZoom api实现echart的同步缩放&#x1f496; vue2实现echarts多图表同步缩放&#x1f496; vue3实现echarts多图表同步缩放 ⭐结束 ⭐前言 大家好&#xff01;我是yma16&#xff0c;本文分享在vue2和vue3中配置echarts的多图表同步缩放 背景&#xf…

进程描述+PCB+fork用法介绍

进程控制块PCB 进程id&#xff1a;系统中每个进程有唯一的id,在c语言中用pid_t 表示&#xff0c;其实就是非负整数进程的状态&#xff1a;就绪&#xff0c;运行&#xff0c;挂起&#xff0c;停止&#xff0c;僵尸等状态进程切换是需要保存和恢复的一些cpu寄存器描述虚拟地址空…

微调Hugging Face中图像分类模型

前言 本文主要针对Hugging Face平台中的图像分类模型&#xff0c;在自己数据集上进行微调&#xff0c;预训练模型为Google的vit-base-patch16-224模型&#xff0c;模型简介页面。代码运行于kaggle平台上&#xff0c;使用平台免费GPU&#xff0c;型号P100&#xff0c;笔记本地址…

【惯性导航】隧道、高架桥、高楼林立弱信号环境室外定位_惯导模块

汽车行驶在路上&#xff0c;视野可能会受到周边的树木、同行的卡车、城市楼群的遮挡&#xff0c;卫星导航系统容易受到周围环境的影响&#xff0c;例如树木楼房等&#xff0c;造成多路径效应&#xff0c;使得定位结果精度降低甚至丢失&#xff0c;尤其是在隧道或者室内环境中&a…

树莓派开Samba协议和Windows电脑共享资料

文章目录 1. 前言2. 树莓派安装和配置Samba2.1. 更新源2.2. 安装Samba软件2.3. 修改Samba配置文件2.4. 重启Samba服务2.5. 添加用户到Samba 3. Windows访问共享目录3.1. 查看树莓派的地址3.2. 打开这个IP地址 4. 报错4.1. 用户名或者密码不正确 1. 前言 虽然出门派很方便&…

C++算法————二分查找

又是鸽了三千万年 马上要打csp了&#xff0c;开始回流学j组的知识了&#xff0c;浅说一下二分吧&#xff08;&#xff09; --------------------------------------------------------------------------------------------------------------------------------- 二分查找 …

tsx写法

1.安装插件 npm install vitejs/plugin-vue-jsx -D vite.config.ts 配置 import { defineConfig } from vite import vue from vitejs/plugin-vue import vueJsx from vitejs/plugin-vue-jsx; // https://vitejs.dev/config/ export default defineConfig({plugins: [vue(),v…

TC15WProteus仿真DS18B20温度采集报警控制系统STC15W4K32S4

STC15WProteus仿真DS18B20温度采集报警控制系统STC15W4K32S4 Proteus仿真小实验&#xff1a; STC15WProteus仿真DS18B20温度采集报警控制系统STC15W4K32S4 功能&#xff1a; 硬件组成&#xff1a;STC15W4K32S4单片机 LCD1602显示器DS18B20温度传感器蜂鸣器 1.单片机读取DS18…

数据链路层(MAC)、网络层(IP)、传输层(TCP/UDP)抓包分析

目录 OSI七层模型数据包逐层封装头部抓包分析数据包概况数据链路层抓包网络层抓包&#xff08;IP协议抓包&#xff09;UDP抓包数据负载抓包 Linux cooked-mode capture OSI七层模型 OSI模型&#xff08;OSI model&#xff09;&#xff0c;开放式系统互联通信参考模型&#xff…

【读书笔记】《小王子》- [法] 安托万•德•圣埃克苏佩里 / [法国] 安东尼·德·圣-埃克苏佩里

文章目录 Chapter 01Chapter 02Chapter 03Chapter 04Chapter 05Chapter 06Chapter 07Chapter 08Chapter 09 Chapter 01 Chapter 02 “因为我住的地方非常小…” 想起了陀思妥耶夫斯基书中的一句话&#xff0c;“要爱具体的人&#xff0c;不要爱抽象的人&#xff1b;要爱生活本…

给开发者的ChatGPT提示词工程指南

ChatGPT Prompt Engineering for Development 基本大语言模型和指令精调大语言模型的区别&#xff1a; 指令精调大语言模型经过遵从指令的训练&#xff0c;即通过RLHF&#xff08;基于人类反馈的强化学习&#xff09;方式在指令上精调过&#xff0c;因而更加有帮助&#xff0…

OverLeaf(LaTeX在线编辑器)制作项目周报

目录 注册及登录 1、登录官网 2、设置语言 制作周报 1、新建项目 2、整体预览 3、分段解析 3.1 页面大小/页边距 3.2 页眉页脚 3.3 标题样式 3.4 内容分栏显示 3.5 调整行间距 3.6 插入图片 3.7 图片和文字排版 3.8 分页 3.9 标题和内容 4、编译和导出 4.1 编…

hutool poi、apache poi实现导入导出以及解析excel

一、前言 看了例子之后后续需要更加深入学习或者更多理解其他API的话&#xff0c;建议看官方文档。hutool项目是中国人维护的&#xff0c;有中文文档&#xff0c;阅读起来很方便。apache poi比较底层一点&#xff0c;可以更加自由去二次开发自己所需的功能。 hutool官方文档 …

zkML零知识机器学习介绍

1. 引言 零知识证明技术的2大基石为&#xff1a; 1&#xff09;succinctness&#xff1a;相比于直接运行整个计算本身&#xff0c;验证该计算完整性证明要简单很多。2&#xff09;zero-knowledge&#xff1a;可在不泄露计算隐私的情况下&#xff0c;证明计算的完整性。 生成…

【Java入门】-- Java基础详解之 [数组、冒泡排序]

目录 1.为什么需要数组&#xff1f; 2.数组的介绍 3.数组的快速入门 4.数组的使用 5.动态初始化 6.静态初始化 7.数组的细节 8.数组的赋值机制 9.数组拷贝 10.数组反转 11.二维数组 12.冒泡排序 1.为什么需要数组&#xff1f; 有五个学生&#xff0c;他们英语成绩…