函数传参——一级指针与二级指针

我们先来看一级指针作为参数:

float *s = NULL;         //①

 void fun(float *p1,float *p2, float *s)          //②

{

       s=(float *)calloc(1,sizeof(float));        //③

       *s=*p1+*p2++;

}

调用函数fun(a, b ,s);

        上述代码看似将一级指针s作为参数传入到fun函数内部,实际上并不是。因为①中的指针s与②中的参数指针不是一个同一个指针。如下图:

①中的指针s与②中的参数指针直接的关系如下:

 

由于fun函数中在堆空间中申请一块空间,关系如下:

         从图中可以看到,fun()函数中的一级指针的指向被改变了。但是,无论我们在fun()函数中怎么折腾,始终都只能改变栈区指针的指向和堆空间中的值,而全局变量区中的指针的指向始终指向NULL,不会受丝毫改变。而且,当fun()函数执行完后,栈区中的一级指针就会被释放掉,那么此时我们也就再也无法寻找到这个一级指针指向的堆空间了。

        这样的传参看似是地址传递,实际上它是值传递,因为它具有值传递的特性

我们再来看一级指针地址(即二级指针)作为参数:

float *s;         //①

 void fun(float *p1,float *p2, float **s         //②

{

       *s=(float *)calloc(1,sizeof(float));        //③

       **s=*p1+*p2++;

}

调用函数fun(a, b ,&s);

        我们可以看到,地址传递是一环扣一环。

         二级指针**s保存的是全局变量区中一级指针*s的地址,所以,二级指针变量就指向全局变量区的一级指针。所以,fun()函数中,s表示的是栈区中的二级指针。而s的解引用*s,则表示的是二级指针指向的一级指针,注意:该一级指针是在全局变量区而不是在栈区。*s的解引用**s,就表示一级指针指向的空间。

        fun()函数中, 语句:*s=(float *)calloc(1,sizeof(float)); ,申请一个堆空间,将堆空间的地址交给*s来保存,由上述所知,一级指针*s不是在fun()中,但是我们却可以通过对fun()函数内的二级指针s进行解引用,来改变栈区外面一级指针*s的指向。这个就是地址传递的特性

        所以,地址传递:

                                 ①对于普通变量,则用它的地址作为参数(即一级指针)。

                                 ②对于一级指针变量,则用它的地址作为参数(即二级指针)。

        值传递与地址传递的区别就是,值传递,传递的是拷贝的数据副本。而地址传递,传递的则是变量所在的位置。

无敌小小雷
关注 关注
  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言函数值传递
lovekelly24的博客
04-26 4708
之前在某高教等级考试书中有这么一题,代码如下:#include <stdio.h> #include <stdlib.h> void fun(float *p1,float *p2,float *s) { s=(float *)calloc(1,sizeof(float)); *s=*p1+*p2++; } int main() { float a[2]={1.1,2...
【C语言】函数参数传递中的一级指针二级指针
qq_43331089的博客
11-04 1287
而在添加删除结点的过程中,我们并没有改变函数参数指针的指向,而是通过传入的指针如Node *head,找到要删除结点的位置,并未对该指针做改变,因此退出函数后,该指针无影响。void fun(int *p),指针参数p的副本为_p,编译器使_p=p,_p和p指向相同的内存空间,如果在函数内修改了_p所指向的内容,就会导致p的内容也做相应的改变;通过上述例子,我们可以看到,在某些情况下,函数参数传递一级指针时,在函数体内对指针做变动,也不会对原始指针产生变化,而传递二级指针时,则可以,这是为什么呢?
C语言学习——一阶二阶指针传参函数指针的介绍及其应用、回调函数
weixin_46010517的博客
07-27 697
一级指针二级指针传参函数指针,通过函数指针数组实现计算器,回调函数,通过回调函数实现计算器以及冒泡排序法和qsort函数的实现。函数名就是地址函数指针——指向函数指针函数指针的创建:指向函数的返回类型 (*函数指针变量)(指向函数的形参类型) = &指向函数(不用&也可以)。可以将int (*(*pc)[5])(int, int)分开理解,*pc表示首先是指针,(*pc)[5]表示其指向类型为数组,int (*)(int, int)表示数组中元素类型是函数指针。...
一级指针二级指针传参问题(学习笔记)
weixin_47783699的博客
10-23 879
你还在烦恼,二级指针怎么使用??适合小白入门
指针进阶【2】
qq_51947882的博客
04-19 1612
指针传参 一级指针传参 一级指针传参的时候,用一个相同的一级指针来接收,这是没有问题的 --- 就相当于a = b 一级指针传参一级指针来接收,一级指针地址传参二级指针来接收,n级指针指向的是n-1级指针,0级指针就是存储在内存空间中的数据。 二级指针传参 二级指针传参一级指针类型 二级指针作为形参时肯定能够接收二级指针,这是ok的,其次二级指针作为形参还能够接收一级指针地址 一级指针作为形参的时候可以接收一级指针,也能够接收一级指针指向的内存空间的地址 二级指针作为形参的
C/C++二级指针传递参数【个人遇到内存值发生改变现象的记录及相关修正方法】
nanke_yh的博客
01-08 1076
​在c/c++中,时常会使用到主调函数通过参数去获取被调函数中的数值情况。针对这种情况,我前面也写过C/C++主调函数从被调函数中获取(各种类型)数据内容方式的梳理归纳文章。但这篇文章中着重是写各基础数据类型的传递方式,如何传递一维数组值或者多维数组值得情况就没有涉及。那么在c/c++中,传递n维数值则需要通过n+1维的指针参数去传递。这篇文章就是讲一下二级指针传递数组值情况中发生的奇怪现象。需要了解详细的二级指针传参原理和过程可以去查看:C语言参数传递(值传递、地址传递)+二级指针和使用二级指针传出参数。
C语言 一级指针二级指针详细介绍
01-01
// 申请了一个变量, 即在内存中开辟了一块内存, 存储数据  // 开辟了 8 个字节, 在 Mac 下 指针都占 8 个字节  使用指针, 实际上应该说成使用指针变量  1> 算术运算  +1 移动几个字节?  看类型: int *
详解C语言-二级指针三种内存模型
08-19
在C语言中,二级指针是一种复杂的数据结构,指的是指针指针,它可以指向其他指针或数组。二级指针的内存模型主要有三种:char *arr[]、char arr[][]和char arr。下面详细介绍这三种内存模型。 一、char *arr[]...
08_01_C_02_二级指针&函数指针
06-30
08_01_C_02_二级指针&函数指针08_01_C_02_二级指针&函数指针08_01_C_02_二级指针&函数指针08_01_C_02_二级指针&函数指针08_01_C_02_二级指针&函数指针08_01_C_02_二级指针&函数指针08_01_C_02_二级指针&函数指针08_...
函数参数的传递问题(一级指针二级指针
Flying snow
04-08 678
(1)概念 一级指针:即我们一般说的指针,就是内存地址二级指针:指向指针指针,就是地址地址; 例如: int a=1; int *p=&a;  // p为a变量的地址,通过*p可以得到a的值 int **q=&p;   // q为p指针地址,通过**q可以得到a的值 (2)指针参数传递的示例 (A)sample 1 #include<stdio.h> void fun(int *p){ int b=100; p=&b; }
解析二级指针为形参时,可以传什么样的参数,为什么可以接收这样的参数
weixin_58791060的博客
04-25 394
首先我们知道,二级指针的概念:存放一级指针地址指针。 也就是说,二级指针就是用来存放一级指针地址。 同理,一级指针地址,我们要用二级指针来存放 ..........
C语言之一二维数组传参与一二级指针传参的讲解
weixin_69283129的博客
07-25 1377
一二维数组传参与一二级指针传参的讲解
C语言中的二级指针(1) -- 值传递问题
落尘纷扰的专栏
04-25 3132
先看一个我们非常熟悉的代码: #include void swap(int a, int b) { int tmp; tmp = a; a = b; b = tmp; } int main() { int a = 3, b = 5; swap(a, b); printf("a = %d, b = %d\n", a, b); return 0; }我们都知道,这段代码中的s
二级指针函数参数
Arithmetic-logic
08-11 2240
下面围绕对指针数组的操作进行说明 第一种内存模型 #include "stdio.h" #include <stdlib.h> #include <string.h> void printArr(char** arr,int num) { if (arr == NULL)return -1; for (int i = 0; i < num; i++) { printf("%s\n", arr[i]); } } int sortArr(char** arr, int.
C语言二级字符串指针的使用(函数传参/长度获取/空间分配)
asd123pwj的博客
10-11 2229
文章首发及后续更新:http://mwhls.top/619.html 新的更新内容请到mwhls.top查看。 如果没有图片请到上方的文章首发页面查看。 被整型数组的sizeof误导,我二级指针的空间分配一直出现问题,今天(和今天的明天)终于解决了!还有如何将字符串数组的传参问题!我!墙!啊! 概念 指针用来指向地址,例如int *p = &num;表示用 int型的p指针 存放 num的地址。 而二级指针,int *q = &p;表示用 q 存放 p 的地址。注意这里的&
链表初始化为什么传二级指针,建表传一级指针
快乐星球
10-20 2471
简单来说,修改头指针则必须传递头指针地址, 不修改头指针就传一级指针(即头指针本身)。 这与普通变量类似,当需要修改普通变量的值,需传递其地址,否则传递普通变量的值即可(即这个变量的拷贝)。 如果用一级指针,则只能修改指针所指内容,却无法修改指针的值,也就是无法修改指针所在的(指向) 内存块。 所以创建链表和销毁链表需要二级指针或者一级指针引用 typedef struct Node{ Ele...
二级指针/传值、传址
qq_39224221的博客
08-20 328
二级指针/传值、传地址
C++一级指针和双重(二级)指针作为函数参数传递
沙丁鱼鱼鱼
06-07 6637
引用博文:https://www.cnblogs.com/WeyneChen/p/6672045.html函数参数传递的只能是数值,所以当指针作为函数参数传递时,传递的是指针的值,而不是地址。当指针作为函数参数传递时,在函数内部重新申请了一个新指针,与传入指针指向相同地址。在函数内部的操作只能针对指针指向的值。#include &lt;iostream&gt; using namespace st...
为什么链表传参二级指针
最新发布
03-26
链表传参二级指针,是因为链表中的每个节点都是一个包含数据和指向下一个节点的指针的结构体,而每个节点的地址都是动态分配的,传入函数的是该链表的头节点指针。如果传入的是一级指针函数内部只能访问到该节点...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • stm32f103——中断——UART中断服务函数 16112
  • STM32外围电路硬件解析 12022
  • stm32f103——通用定时器输出PWM 9961
  • GPIO I/O口——八种工作模式(总结) 8426
  • stm32f103——滴答定时器 8204

最新评论

  • stm32f103——通用定时器输出PWM

    新世纪代码农场主: 我也想要

  • stm32f103——通用定时器输出PWM

    南桥北桥: 您用的这个查看库函数原型的文档怎么获取啊,能卖我一份吗

  • stm32f103——外部中断和事件——检测按键按下点灯

    ttteapot: 妙啊 写得太好了 清晰易懂

  • stm32f103——中断——UART中断服务函数

    m0_64179121: 你这个是标准库写的吗楼主

  • stm32f103——IIC总线通信与EEPROM

    筱伟同学: 有没有spi的博客啊

大家在看

  • linux桌面运维---第二天 379
  • 数组方法总结
  • Matlab|【防骗帖】考虑时空相关性的风电功率预测误差建模与分析
  • python6入门 | 组合数据类型
  • 探索Linux中的pinky命令:数据处理与分析的得力助手

最新文章

  • 网络基础知识总结
  • stm32f103——IIC总线通信与EEPROM
  • stm32F103——ADC与DMA(按键与光敏电阻)
2022年33篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司盐田外贸网站制作同乐品牌网站设计丹竹头百度seo光明阿里店铺运营坂田网站关键词优化同乐网站改版盐田企业网站改版龙岗SEO按天收费沙井模板网站建设南澳外贸网站设计南联外贸网站制作坑梓百姓网标王推广东莞网站改版横岗网站推广福田网站设计模板大运营销型网站建设永湖网站搜索优化大浪seo吉祥外贸网站制作坪山至尊标王丹竹头seo优化惠州关键词按天计费盐田SEO按天扣费大芬阿里店铺运营龙岗网络广告推广同乐百度爱采购南山百度爱采购木棉湾外贸网站建设观澜百度seo木棉湾seo歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化