C语言函数内部改变指针本身

C语言指针:指针作为形参如何改变其指向的地址? 题目是什么意思呢?就是一个函数的输入参数是一个指针,该函数需要改变该指针指向的地址,如: 现在有一个全局数组b,现在需要编写一个函数 输入参数是一个指针a,需要通过该函数将该指针a指向数组b,即: int b[3] = {1,2,3}; void fcn(参数); void main() { int* a; fcn(输入参数a) } 执行完fcn后,使参数的地址改变,这个功... 阅读详情

今天发一个C语言基础的小知识点:C语言中函数参数传递方式只有一种:值传递。

 

可能大家在刚开始学习C的时候都被一些教材误导,认为C中有值传递和地址传递两种方式。其实只有值传递一种,无论函数以什么形式进行传递,其实传递的都只是参数的一份拷贝!

 

举个简单的例子,一个改变某个整型变量参数的函数

int change_value(int *pChange, int val)

{

       *pChange = val;

        return *pChange;

}

 


那么pChange所指向地址内容的指改变了吗?确实改变了。

因此一些教材就认为该方式是传址,其实过程应该是这样

比如调用的 时候有如下:

 

int a = 0x55aa;

change_value(&a, 0xaa55);


这样a的值改变了,真正的情况是参数传递后,编译器做了一个参数拷贝过程,比如声明一个整型指针pCopy = &a;

这样,pCopy只是传进来参数&a的一份拷贝,但是他们都指向了a的地址,因此用这种方法可以改变a 的值。

 

那么现在有个问题,通过传递一个指针,可以改变该指针所指向地址的内容,那么如何改变指针本身呢?即如何改变指针的指向?

先看一个错误的例子

void change_ptr(void *ptr, void *dest)

{

      ptr = dest;

}


如果是这样,能达到改变指针本身的目的吗?

 

如果你有迷惑,可以这样看,把类型去掉,把参数ptr传递进去,能改变ptr吗?

显然不能!

那该怎么做才能改变ptr呢?

既然ptr也是一个变量,我要在函数内部改变它,那么就传递一个指向ptr的指针!也就是二级指针!

正确的函数形式如下

void change_ptr(void **ptr, void *dest)

{

     *ptr = dest;

}


 

其实指针也是一个变量,我们如果要改变它,必须找到它在内存中的地址,也就是指针的地址。

当然,也可以通过另一种方式,只不过该方式需要绑定调用者的行为

void *change_ptr(void *ptr, void *dest)

{

     return (ptr = dest);

}


 

 这样在调用的时候必须做如下形式的调用

char *string;

string = change_ptr(string, dest);


否则string本身是不会改变的!但是这样做意义不大,不如直接来个string = dest方便。

能用到在函数内部改变指针指向的地方通常是:一个函数完成某项功能后,得到一个指针,需要把这个指针以参数的 形式返回。

比如: foo(..., type **value);

在使用的时候通常这样:

type *val = NULL;

foo(..., &val);


这样之后,val指针就指向了正确的位置。

这里申明一点,想去改变一个变量本身的地址是不可能的,无论你怎么做,在声明(定义)变量的时候,它的地址就由编译器决定好了。

比如这里,你能修改val本身的地址吗?这就如同你能修改常量吗?

 

 

 另外,如果我们想改变结构体中某个变量,需要传递一个指向该结构体的指针!

这样,不管你想改变的是结构体中的成员是一个普通变量还是一个指针,都是可以改变的,因为通过该结构体指针,可以获得该结构体(也是该结构体中第一个成员)的地址,进而也就知道了结构体中任一成员的地址,因此对于结构体内容,想怎么改变就怎么改变!

比如

typedef struct xxx {

    int *head;

}xxx_t;

 

xxx_t my_struct;

 

void change(xxx_t *dst, void *src)

{

   dst->head = str; //dst->head已经改变!

}


 

调用时

change(&my_struct, src);


 

这时my_struct.head本身已经改变了。

C语言·自定义函数·传递参数 C语言中自定义函数时,值传递是单向的,由实参传递给形参 无论对形参做什么运算,都不会改变实参的值 但是,若想要利用自定义函数来改变实参的值,可以利用指针传递 举个栗子: #include<stdio.h> void exch(); int main() { //简... 阅读详情

相关推荐

【C语言从不挂科到高绩点】21-指针03-指针与函数【重点知识】

Hello!彦祖们,俺又回来了!!!,继续给大家分享 《C语言从不挂科到高绩点》课程!! 本节将为大家讲解C语言中非常重要的知识点-指针:本套课程将会从0基础讲解C语言核心技术,适合人群: ===============点个关注吧====================================================前面讲解的过程中:形式参数的改变不会影响实际参数。形式参数没有数据,只有当运行起来之后,实际参数将值传递给形式参数之后,形式参数才会有值。实参将值传递给形参之后,两者就断开联系了

yueyehuguang的博客 1105

C语言通过函数调用改变指针的指向

当我们在主函数中函数中调用fun1()函数时,fun1()函数接收的是s1和s2的值,也就是s1和s2所储存的地址,此时p1、p2分别指向s1、s2所指向的地址。此时,当我们在主函数中函数中调用fun1()函数时,fun1()函数接收的是s1和s2的地址,所以p1、p2分别指向s1、s2所在的地址,此时我们执行*p1 = *p2,才能修改主函数中s1所储存的值,成功地修改s1的指向,将其指向s2指向的地址。如果我们想要通过函数调用,改变指针的指向,只有传入指针的指针才能改变指针的指向。...

cqqqqqq12138的博客 6233

WRF模型下中国土地利用数据替换USGS-24分类的完整实践指南

本文提供了在WRF模型中,将中国土地利用数据替换默认USGS-24分类的完整实践指南。详细阐述了替换下垫面数据的必要性,并分步讲解了数据准备、坐标转换、分类体系重映射、格式转换及配置文件修改等核心操作,旨在帮助用户提升针对中国区域的模拟精度。

salt的博客 777

c语言函数修改指针本身,C语言函数内部改变指针本身

今天发一个C语言基础的小知识点:C语言中函数参数传递方式只有一种:值传递。可能大家在刚开始学习C的时候都被一些教材误导,认为C中有值传递和地址传递两种方式。其实只有值传递一种,无论函数以什么形式进行传递,其实传递的都只是参数的一份拷贝!举个简单的例子,一个改变某个整型变量参数的函数int change_value(int *pChange, int val){*pChange = val;retu...

weixin_36003864的博客 946

SAP 人力资源工资配置项3---工资项配置

工资项设置

xiouluoyang的专栏 1万+

迈德威视相机调用( 基于 Linux系统+ OpenCV )

迈德威视相机调用( 基于 Linux系统+ OpenCV )前言一、登录迈德威视官网,下载官方SDK二、代码调用与视频帧处理( 基于 OpenCV )总结 前言     此博客记录了迈德威视工业相机在 Linux 系统下的代码调用及其环境配置,通过 OpenCV 对视频帧进行处理。   一、登录迈德威视官网,下载官方SDK      迈德威视官网 : http://www.mindvision.com.cn/     1. 进入官网后,在服务支持中选择软件下载。    2. 选择Linux系统S.

kkkkkk0729的博客 5680

c/c++向函数传递指针并修改其指向的问题

一个非常简单的用来交换两个数的值的函数,可以有若干种写法。 众所周知的错误写法为: #include using namespace std; void swap(int a, int b) { int t = a; a = b; b = t; } int main() { int a, b; cin >> a >> b; swap(a, b

bin510729392的博客 1万+

Yolov5自学笔记之一--从入门到入狱,功能强大不要乱用(实现yolov5的基本功能使用流程及训练自己的数据集)

零基础自学yolov5,学会简单使用和训练自己的数据集,在自己工作中使用

qq_41597915的博客 1万+

通过函数指针修改函数内容

很多人认为通过函数指针不能修改函数内容,而只能通过函数指针调用函数,今天在论坛上看到一段代码,通过函数指针修改函数内容,颠覆了某些人对函数指针的看法,转引过来,慢慢欣赏。#include #include #include using namespace std; void foobar(void){ printf( "function foobar %x/n

borefo的专栏 1513

五万字解析【ROOT 入门指南】

本文是cern官方root入门指南的初步翻译版,还在进一步校对中....

荷塘阅色 208

170、电机控制中的温升测试

本文以一次IGBT炸管事故为切入点,深入剖析电机控制中温升测试的实质:不仅是温度测量,更是对铜损、铁损、散热效率等热管理问题的系统验证。作者强调测试前热电偶布置、环境记录、预运行的重要性,提出实时监控电流谐波、绕组电阻、散热梯度等关键参数,并通过损耗分离与冷却系统实测,揭示真实热源。结合温升曲线异常分析与经验建议,强调留余量、仿真结合实测、关注瞬态工况等实践要点,警示温升测试是保障可靠性与安全性的核心环节。

2401_88858637的博客 49

【C 语言】指针变量作为函数形参,函数内部修改变量中地址。函数退出后,指针变量中的地址不会改变原因

疑问1:指针变量作为函数形参,

weiweiliude2的专栏 649

高可用架构设计——多节点OpenClaw集群部署与负载均衡(2026企业级)

本文介绍了企业级OpenClaw高可用集群架构设计,重点阐述了多节点部署与负载均衡方案。架构采用分层设计,包括表现层、应用层、数据层和基础设施层,确保99.99%的可用性目标。详细配置了主节点、工作节点和存储节点规格,提供Kubernetes集群部署脚本示例,实现自动化的容器编排管理。通过硬件冗余、故障隔离和弹性扩展等可靠性原则,构建能够应对各种故障场景的稳定AI助手系统。

博客 421

关于AVL平衡二叉树的c语言实现(函数内部改变指针本身)

最近在看数据结构就用c语言写了一个AVL树出来,结果可以运行但无结果输出,搜索许多资料后发现是指针传递的问题,这里总结一下。 头文件(修改后的代码) #ifndef __ggh #define __ggh typedef int ElementType; typedef struct AVLTreeNode *AVLTree,*Position; struct AVLTreeNode{ El

as14569852的博客 438

高级数据库--作业及答案

中科大金培权老师的高级数据库课程作业及答案

一杯水果茶!足矣~ 1658

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C语言函数调用指针交换值

int p; p = *a; *a = *b; *b = p; 可以发现函数调用前后还是函数执行前后地址都没有发生改变,值做了交换     int *p; *p = *a; *a = *b; *b = *p; 可以发现三个指针互换时,是不能交换值和地址的,只有中间*a = *b起到了作用,所以b的值给了a     int *p; p = a; a = b; b = p; 可以发现在函数里交换了地址,值做了交换,但只在当前函数生效, 但丝毫不影响主函数的值,因此在其他函数交换指

只是个人笔记,请见谅 2692

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C语言——通过调用函数改变形参指针 改变实参指针问题

1,按值传递,在调用函数的时候,将指向数据的指针实参传递到调用函数的形参中去 2,单向传递,形参中的指针子函数改变地址后不能传给主调函数,变量同样指向了我们希望处理的数据,然后对形参的指针变量指向的数据进行各种希望的处理,在调用函数运行完成后,各个形参指针变量进行了释放。子函数改变地址后不能传给主调函数。 注:红字为摘抄部分 下面是测试代码.c: #include #include

Curious 1152

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

c语言二级指针的作用,为什么要使用二级指针?

概念提到指针,我们都知道指针是用来存储一个变量的地址。所以,当我们定义了一个指向指针的指针的时候(pointer to pointer),我们也称之为二级指针,那针对于这个二级指针来说,第一级指针存放的是指向的变量的地址,第二级指针存放的是第一级指针的地址。可以用下面这张图表示他们之间的关系。 上图所表达的意思也就是,一级指针变量 ptr1 存放的是 var 变量的地址,二级指针变量 ptr2 存...

weixin_34900419的博客 3336

C语言指针作为形参如何改变其指向的地址?

关注、星标公众号,直达精彩内容来源:知乎作者:ERYUESANH题目是什么意思呢?就是一个函数的输入参数是一个指针,该函数需要改变该指针指向的地址,如: 现在有一个全局数组b,现在需要编写...

李肖遥的专栏 1081

c 指针地址 突然改变_C语言指针关于指针名称以及所指变量的认识

几个月没有写博客,我认为这代表了几个月以来我的编程技术没有进步。这次的指针问题其实是我上个月就拖下来的问题,我以为我懂了,其实我没有。代码如上。目的其实是在一列entry的最前面再加一个entry。其实我知道有更简单的方法。(然而其实代码已经很简单了)原代码(错误代码如下)当代码header = element放在insertEntry函数定义的最后一行时,main函数中的header并不会改变。...

weixin_42097208的博客 518

C语言指针值传递和地址传递

C语言传参分为值传传递和地址传递。C语言指针传参时,可以通过指针引用方式改变指针指向的值。改变变量,可以使用指针应用方式,改变地址,使用指针的指针引用方式。 C语言值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参) #include <stdio.h> void swap(int x, int y); main() { int a = 10, b = 20; swap(a,

tecoes的博客 1万+

指针作为函数参数传递以及指针的指针

指针作为函数参数传递 函数参数传递的只能是数值,所以当指针作为参数传递时,传递的是指针的值,而不是地址。 #include <stdio.h> void pointer(int* p) { int a = 11; printf("\n\nEnter function"); printf("\nthe p is point to %p , addr is %X,*p is %d",...

z1360408752的博客 2981
上一篇: 常量引用
下一篇: 运算符重载
seadplus
博客等级 码龄15年 57粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值