【C语言】函数传参与指针理解

news2024/11/15 14:01:38

文章目录

  • 指针与变量
    • 注意
    • 指针的本质
    • 指针和变量的用法
  • 函数与传参
    • 传变量与传指针的区别
    • 传变量与传指针的时机

指针与变量

大三,但是C语言。目标:高屋建瓴,深入浅出。

注意

所有人在最开始学C语言的时候,老师都会和你说指针指向一个空间。这么说也没错,但是没有说明白指针的本质。本文仅讨论一级指针与普通变量的关系。

指针的本质

指针,从本质上来说,也是变量。你要知道,只要是数据,就需要空间去储存。无论是指针变量还是普通变量,本身都是变量,都有地址。所以指针和普通变量从储存上来说没有区别,区别只在于储存的内容不同,以int i=10举例。

  1. 普通变量储存的就是值本身,比如00001010(10的二进制表示)
  2. 指针变量储存的是普通变量的地址,比如i的地址

指针和变量的用法

从使用上来说,指针和变量有何区别?上代码:

#include<stdio.h>

int main(void)
{
	int i1=1;
	int i2=i1;
	int* p1=&i1;
	int* p2=p1;
	
	i1=2;
	printf("%d\n",i1);
	i2=3;
	printf("%d\n",i1);//i1和i2没关系
	printf("%p\n%p\n",&i1,&i2);
	*p1=4;
	printf("%d\n",i1);
	*p2=10;
	printf("%d\n",i1);//p1和p2有关系
	printf("%p\n%p\n%p\n%p\n",p1,p2,&p1,&p2);//p1和p2储存的值相同,都是i1的地址,但是他们本身是两个不同的变量,p1和p2的地址不同
	
	return 0;
}

看下运行结果:

  1. 修改了i2后,对i1没有影响,说明i1和i2没关系
  2. 通过p1修改i1后,再通过p2修改i1,发现通过p2的修改会覆盖通过p1的修改,说明p1和p2都是指向i1的。

在这里插入图片描述

进一步,用图形,以及地址的方式来解释一下他们的关系:

  1. 创建了4个变量,有两个普通变量,两个指针变量,所以他们有4个不同的地址,对应4个不同的空间。
  2. i1和i2储存了两个变量值,他们之间互不关联。
  3. p1和p2虽然本身地址不同,是两个不同的变量,但是他们储存的值都是i1的地址,换句话说,这两个指针指向同一片区域。
  4. 既然两个指针指向的区域是一个区域,所以通过指针对目标区域的修改就会相互影响。

请添加图片描述

函数与传参

传变量与传指针的区别

首先你应该明确,函数的传参是复制一份,进入函数里的变量是函数外面的变量的副本

既然指针变量和普通变量本质上都是变量,那么当参数给函数传值的时候,其实都是复制一份过去的。那么用变量当参数和用变量的指针做参数有什么区别呢?

其实我们前面的程序已经给出了答案,i2和p2分别是i1和p1的副本:

  1. 如果是直接传递普通变量,i2(函数里的变量)和i1(函数外的变量)不会互相影响。
  2. 如果传递指针变量,通过p2修改目标空间,会影响到函数外的p1的目标空间。

传变量与传指针的时机

前面说了这两种传法的区别,这里说一下什么时候传变量,什么时候传指针:

  1. 传变量。
    • 常规操作。一般都是传变量。
    • 保护变量的值不被函数修改。当你不想让函数内部代码修改你函数外的变量时。
  2. 传指针:
    • 修改变量的值。当你想让函数内代码修改函数外变量的时候,比如你在外面初始化一个空结构体,然后传入一个结构体指针,然后函数内部通过代码填充这个结构体的内容。
    • 减少参数复制成本。当你在函数外的变量是一个巨大的结构体,复制一份成本很大的时候,我们可以把他的地址传进去,这样就只需要复制8字节的数据即可。如果单纯为了减少成本而传指针的话,会有一点危险,会有函数内代码修改函数外变量(就是这个结构体)的副作用。

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

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

相关文章

[附源码]JAVA毕业设计课程答疑系统(系统+LW)

[附源码]JAVA毕业设计课程答疑系统&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&…

LLM.int8()——自适应混合精度量化方法

Paper地址&#xff1a;https://arxiv.org/abs/2208.07339 GitHub链接&#xff1a;GitHub - TimDettmers/bitsandbytes: 8-bit CUDA functions for PyTorch 随着模型参数规模的增加&#xff0c;大模型&#xff08;如GPT-3&#xff0c;OPT-175B等NLP稠密大模型&#xff09;的实际…

某验三代滑块流程分析

一、请求流程 slide-float.html 首先请求了个HTML文本jquery.js 拿回一个jQuery的jsgt.js 拿回gt.js 像是某验的网址信息register-slide?t1669432270469 一个请求、携带时间戳。返回challenge gt等信息gettype.php 获取验证码类型 携带gtfullpage.9.1.0.js 滑块js代码get.php …

【Java开发】 Spring 08 :访问 Web 资源( 借助 RestTemplate 或 WebClient )

web 资源就是运行在服务器上的资源&#xff0c;比如放到 web 下的页面 js 文件、图片、css等&#xff0c;web资源分为静态web资源和动态web资源两类&#xff0c;接下来访问的就是动态资源&#xff08;页面返回的数据是动态的&#xff0c;由后端程序产生&#xff09;&#xff0…

Rust权威指南之编写自动化测试

一. 简述 虽然Rust的类型系统为我们提供了相当多的安全保障&#xff0c;但是还是不足以防止所有的错误。因此&#xff0c;Rust在语言层面内置了编写测试代码、执行自动化测试任务的功能。 测试是一门复杂的技术&#xff0c;本章覆盖关于如何编写优秀测试的每一个细节&#xf…

[LeetCode周赛复盘] 第 322 场周赛20221204

[LeetCode周赛复盘] 第 322 场周赛20221204 一、本周周赛总结二、 [Easy] 6253. 回环句1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6254. 划分技能点相等的团队1. 题目描述2. 思路分析3. 代码实现四、[Medium] 6255. 两个城市间路径的最小分数1. 题目描述2. 思路分析3. 代…

细粒度图像分类论文研读-2017

文章目录Higher-order Integration of Hierarchical Convolutional Activations for Fine-grained Visual Categorization(by end-to-end feature encoding)AbstractIntroduction关于核关于多尺度Kernelized convolutional activationsMatching kernel and polynomial predicto…

秒懂数据结构之Map _ Set ,竟如此简单

Map、Set 文章目录 前言一、Map、Set的初步理解二、Map、Set的CURD方法的实现三、Map、Set的遍历总结前言 Set和Map天然就是高效搜索/查找的语义在这里我为什么将这两个集合分别列举比较呢&#xff1f;希望通过我的这篇博客可以增进大家对Map和Set的认识&#xff01;一、Map、…

[附源码]Python计算机毕业设计Django汽车美容店管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

计算卫星高度角、方位角

最小二乘定权、电离层对流层改正&#xff0c;都需要卫星的高度角、方位角。本章将介绍求解完卫星的地固坐标系的位置后&#xff0c;如何求解卫星的高度角、方位角。 卫星位置求解请参考之前的博客&#xff1a;卫星位置解算原理与程序设计 参考书籍&#xff1a;黄丁发&#xff0…

读<算法图解><笔记摘录>

从很多途径当中,看到过这本书的知识点,是一本很有趣的算法入门书籍,最近花费了几天的时间将其阅读完,总想着总结一下这本书的算法知识点,分享给大家,也让自己掌握地更加踏实一点. 算法:一组完成任何任务的指令 算法这玩意,在保证满足条件,并且不浪费内存的情况下,要尽可能速度…

18.定位元素练习-淘宝网

注意&#xff1a; 如果一个盒子定位元素属性既有left又有right,则会执行left属性。 既有top又有bottom&#xff0c;会执行top <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compa…

五子棋游戏AI智能算法设计

五子棋游戏C语言AI智能算法设计 近来发现编制五子棋游戏很有趣&#xff0c;尤其是AI智能算法很烧脑。网上介绍有什么贪心算法&#xff0c;剪枝算法&#xff0c;博弈树算法等等&#xff0c;不一而足。 对于人机对战的电脑智能应子算法&#xff0c;参阅很多五子棋书籍棋谱和五…

有序Map集合:LinkedHashMap和TreeMap该如何选用

文章目录前言一、为什么HashMap是无序的二、LinkedHashMap如何保证有序性三、TreeMap的底层原理四、LinkedHashMap和TreeMap比较总结前言 为什么HashMap是无序的&#xff1f;有序的Map集合有哪些&#xff1f;LinkedHashMap和TreeMap都是有序的Map集合&#xff0c;他们有什么区…

智能优化算法期末复习(更新ing)

目录 一、GA遗传算法 二、ACO蚁群算法 三、PSO粒子群算法 四、SA模拟退火算法 五、ABC人工蜂群算法 六、综合 一、GA遗传算法 1.运算流程 2.遗传算法适应值分配策略&#xff08;基于目标函数的直接分配、基于排名的分配&#xff09; 3.遗传算法在二进制问题&#xff08;如0…

Windows OpenGL ES 图像绿幕抠图

目录 一.OpenGL ES 图像绿幕抠图 1.原始图片2.效果演示 二.OpenGL ES 图像绿幕抠图源码下载三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基础…

Java开发必须掌握的运维知识 (十)-- Docker集群自动化部署管理:Kubernetes快速入门

一、什么是Kubernetes Kubernetes(K8S)是Google在2014年发布的一个开源项目&#xff0c;用于自动化容器化应用程序的部署、扩展和管理。 Kubernetes通常结合docker容器工作&#xff0c;并且整合多个运行着docker容器的主机集群。 Kubernetes官网地址 二、Kubernetes相关特性 …

JavaWeb_第3章_HTTPTomcatServlet

JavaWeb_第3章_HTTP&Tomcat&Servlet 文章目录JavaWeb_第3章_HTTP&Tomcat&Servlet1&#xff0c;Web概述1.1 Web和JavaWeb的概念1.2 JavaWeb技术栈1.2.1 B/S架构1.2.2 静态资源1.2.3 动态资源1.2.4 数据库1.2.5 HTTP协议1.2.6 Web服务器1.3 Web核心课程安排2, HT…

vue中,页面布局之使用vue-splitpane实现窗格的拆分和调节,类似于flex布局

vue中&#xff0c;页面布局之使用vue-splitpane实现窗格的拆分和调节&#xff0c;类似于flex布局 1、基本介绍 npm地址&#xff1a;https://www.npmjs.com/package/vue-splitpane 安包 npm install vue-splitpane注册 main.js import splitPane from vue-splitpane // 注…

土豆清洗去皮机设计

目 录 摘 要 I Abstract II 1绪论 1 1.1选题背景及意义 1 1.2国内外研究现状 1 1.2.1国内外现状 2 1.2.2国外研究现状 2 1.3 发展趋势 3 1.4研究内容及方法 4 2毛刷式土豆清洗去皮机总体设计 5 2.1毛刷式土豆清洗去皮机的构造及工作原理 5 2.2 土豆擦皮机的相关计算 6 2.2.1设计…