c语言函数参数为指针的情况分析

2023-05-16

指针取*解引用:表示的是指针所指向内存单元中内容;或者理解为该内存空间。

指针传递其实也是一种值传递,只不过传递的是地址值,如果通过该地址取*解引用,是可以改变形参指针的原值的,但如果只是指针的值发生变化的话,并不会影响实参指针及其原值。

故:可以这么说:

函数参数均为值传递

函数参数为指针时的情况分析:

1)实参已经初始化

例如://传递指针改变原值的情况

char ch[1024];
int* func(char *p)
{
    memcpy(p,"hello");//是对*ch的值进行改变,地址没有变化,原值变了。
}

//函数调用:
func(ch);

分析:实参已经被初始化了,即:指针ch已经指向了内存空间。

2)实参未初始化或者值为NULL。

//无法改变形参值,仅仅是地址形式的值传递

char *ch = NULL;
int* func(char *p)
{
    p = (char*)malloc(sizeof(char)*5);
    p[0]='h';
    
}

//函数调用:
func(ch);

//仅仅是将NULL的值传递给形参,且函数内并没有解引用,故既不能改变实参指针也没有指针原型可以改变。当然也无法初始化实参。

解释:将NULL值复制给了指针p,但是函数内p又被重新赋值了,这只是单纯的值传递,无法改变实参的值。因为,函数内,也没有对指针的原型做改变,而仅仅是对指针进行了赋值。 

改正方法一:采用传引用的方式,而不是值传递的方式
 

char *ch;
int* func(char* &p)
{
    p = (char*)malloc(sizeof(char)*5);
    p[0]='h';
    
}

//函数调用:
func(ch);

 改正方法二:采用指针传递,而不是值传递,因为实参本身是指针,所以函数参数可以为二重指针

char *ch;
int* func(char** p)
{
    *p = (char*)malloc(sizeof(char)*5);
    (*p)[0]='h';
    
}

//函数调用:
func(&ch);

改正方法三:将指针通过返回值返回。

char *ch;
void* func(char* p)
{
    p = (char*)malloc(sizeof(char)*5);
    p[0]='h';
    
}

//函数调用:
ch = func(ch);

//do sth.

free(ch);

 实参为NULL的情况

//实参虽然初始化为NULL了,仍然不能直接使用//因为指针仍然没有指向内存
char *ch=NULL;
int* func(char*p)
{
   if(!ch)
        printf("error");
    
}

//函数调用:
func(ch);

总结

1)如果函数形参要通过指针传递,且该指针没有初始化,则要么采用(二重)指针的形式,要么采用引用的形式进行参数初始化;

如果实参指针已经初始化了,则除通过上述方法外,还可以直接通过值传递即可。

其实,函数传的参数都是一样的,包括指针和普通变量,只要实参是未初始化的,肯定是通过指针和引用传参(未初始化,当然不能通过值传递了。。。);如果实参已经初始化,则除可以通过指针、引用传参外,还可以通过原值传递。

所以:

  • 可以通过实参是否已经初始化,可以推断是什么类型的传参方式。
  • 如果形参为指针,查看函数内是否对该指针进行解引用了,如果解引用了,可以改变原值,如果没有则对原值及实参指针没有影响。

只有指针和引用才能改变实参原值,如果原值是普通变量,则参数一重指针,如果原值为一重指针,则参数为二重指针。

2)函数参数均为值传递。

另,参考示例可以参看本文。

实际中经常用的是结构体指针作为形参的形式

typedef struct{
    char *mm;
    int nn;
    float gg;

}STU;


void func_1(float* p)
{
    *p = 3.14;
    
}
void func(STU* p)
{
    p->nn = 2;
    p->mm = (char*)malloc(sizeof(char));
    func_1(&p->gg);
    
}

STU ch;

//函数调用:
func(&ch);

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言函数参数为指针的情况分析 的相关文章

  • 传统交换机或路由器与OpenFlow交换机区别

    OpenFlow交换机分为 xff1a 纯of交换机 xff08 of only xff09 和支持of交换机 xff08 of enable xff09 前者仅需要支持必备行动 xff0c 后者还可以支持NORMAL xff08 NORM
  • Windbg及Dump文件分析方法

    1 WinDbg 1 1WinDbg介绍 WinDbg全称Debugging Tools for Windows xff0c 是windows平台下的调试工具 获取Windbg的三种途径 xff1a xff08 1 xff09 在Visua
  • hadoop实现单表和多表关联

    转载请注明 xff1a http hanlaiming freetzi com p 61 123 在mapreduce上编写简单应用后 xff0c 开始学习稍微高级一点的单表关联和多表关联 在学习过程中我参考了这篇文章 xff0c 谢谢ht
  • 第一个C++程序

    第一个C 43 43 程序 一般每个程序员的第一个C 43 43 程序都从 Hello world 开始 xff0c 不多说 xff0c 直接上代码 include lt iostream gt using namespace std in
  • 《自己动手写操作系统》初学笔记------软盘第一扇区写入问题解决方案

    这个学期刚刚学习了操作系统这门课 xff0c 我始终相信计算机学科是一门注重实践的学科 xff0c 从实践中感受学习计算机知识的快乐才是真谛 xff0c 恰巧让我碰到了 自己动手写操作系统 这本书 xff0c 刚一遇见很是兴奋 xff0c
  • CAS单点登录学习笔记二之部署CAS Server

    CAS Server 服务器部署 b 简介 b CAS Server 是一套基于 Java 实现的服务 xff0c 该服务以一个 Java Web Application 单独部署在与 servlet2 3 兼容的 Web 服务器上 xff
  • STM32标准库的引入视频课程-第3季第6部分-朱有鹏-专题视频课程

    STM32标准库的引入视频课程 第3季第6部分 1017人已学习 课程介绍 本课程是 朱有鹏老师单片机完全学习系列课程 第3季第6个课程 xff0c 本课程详细讲解了STM32官方新标准库3 5版本 xff0c 从理论到实践 xff0c 从
  • VMware虚拟机开机黑屏一系列问题解决方法

    VMware虚拟机开机黑屏一系列问题解决方法 虚拟机一开机就是黑屏 xff0c 网上看了很多方法 xff0c 都是以管理员身份运行VMware 或者是以管理员身份打开cmd 输入netsh winsock reset xff0c 再重启计算
  • vmware workstation vmx进程结束不了!!!

    打开任务管理器会看到有一个这个进程 xff0c 使用vmware的时候出现死机情况 xff0c 然后使用任务管理器结束vmware进程 xff0c 之后却发现资源监视器中有一个vmware vmx exe进程始终关不掉 xff0c 获得管理
  • 形式化方法课程学习笔记(一)|Cop的安装以及简单使用

    一 Cop的介绍以及安装 1 Cop介绍 Coq是一个著名的 xff0c 也被广泛使用的正式证明管理系统 它提供了一种正式的语言来编写数学定义 可执行的算法和定理 xff0c 以及用于机器检查证明的半交互式开发的环境 有关Coq的更多信息
  • 虚拟机共享文件夹制作|Ubuntu与本机文件共享

    一 引言 使用虚拟机 xff0c 经常出现想要把主机文件复制到虚拟机中 xff0c 或者是相反的情况 xff0c 一般来说是不能直接复制的 xff0c 另外个人感觉安装VMware tool的方式并不是很好 xff0c 似乎也容易出问题 x
  • VScode使用Remote - SSH插件实现远程服务器开发

    一 引言 最近做实验需要用到远程服务器开发 xff0c 在windows系统上可以下载Xshell PuTTY 来进行实验 xff0c 因为助教推荐使用VScode 43 Remote ssh来进行实验 xff0c 所以百度了怎么样来操作
  • YUV/RGB颜色空间转换公式

    经过调研 xff0c 最终选择以下转换公式 xff1a Jack Keith Video Demystified a Handbook for the Digital Engineer LLH Technology Publishing 3
  • c语言编程软件有哪些 Win7下用哪种C语言编译器

    C语言是一门历史很长的编程语言 xff0c 其编译器和开发工具也多种多样 xff0c 其开发工具包括编译器 xff0c 现举几个开发工具供大家选择 xff0c 当然也要根据自己的操作系统来选择适合自己的开发工具 好多刚开始接触c语言的朋友都
  • 大数据时代的图表可视化利器——highcharts,D3和百度的echarts

    还记得阿里巴巴那个令人澎湃激情的双十一吗 xff1f 还记得淘宝生动形象地把你的的消费历程一一地展示给你看吗 xff1f 还记得那些酷炫拽的it报告图表吗 xff1f 在这个大数据越来越盛行的年代 xff0c 怎样去表达一些用户的关系 xf
  • 在tinycorelinux上安装lxc,lxd (1)

    本文关键字 xff0c 在tinycorelinux上安装lxc xff0c lxd gcc4 4 self reference struct typedef 在前面的文章中我们讲到过内置虚拟化的os设计 xff0c 它可以使包括裸金属 x
  • STM32上第一个程序-GPIO控制LED-第3季第5部分-朱有鹏-专题视频课程

    STM32上第一个程序 GPIO控制LED 第3季第5部分 759人已学习 课程介绍 本课程是 朱有鹏老师单片机完全学习系列课程 第3季第5个课程 xff0c 从零开始带大家写代码控制板载LED xff0c 并且用三个版本的开发板都实现了功
  • Cas 5.3x cas-overlay-template用iframe实现登录跳转

    Cas 5 3x cas overlay template用iframe实现登录跳转 在上一篇Cas 5 3x 简单配置 xff0c 解决https访问的问题的基础上 xff0c 我尝试了一下如何用iframe实现登录和跳转 xff0c 因
  • Linux自带防火墙基本使用

    文章目录 四 Linux自带防火墙1 查看linux的防火墙状态2 查看已经对外开放的端口3 开放端口 重载防火墙配置4 filewalld常用命令 四 Linux自带防火墙 前言 xff1a CentOS7 端口的开放关闭查看都是用防火墙

随机推荐

  • BGP边界网关协议基础知识点

    BGP xff1a 边界网关协议 AS 自治系统 由单一机构或组织管理的一系列IP网络机器设备的集合 网络范围太大 xff0c 协议跑不过来 xff0c 需要进行划分自治管理 为了方便区分和标定不同AS xff0c 我们给每个自治系统设计了
  • 温湿度传感器SHTC3驱动开发(一)小白也能轻松理解

    一 首先了解设备硬件原理图 首先在公司干活 xff0c 要你开发一个设备驱动 xff0c 那你的老大必须得给你的东西如下 xff1a 开发板主板硬件原理图驱动设备的硬件原理图驱动的设备的数据手册 xff08 datasheet xff09
  • nodejs的版本管理工具(nvm)

    1 nvm是什么 nvm全名node js version management xff0c 顾名思义是一个nodejs的版本管理工具 为了解决node各种版本存在不兼容现象 nvm是让你在同一台机器上安装和切换不同版本的node的工具 x
  • A变为a和a的ASCII值

    span class hljs comment include lt stdio h gt span main char ch span class hljs keyword printf span span class hljs stri
  • 机器学习python Kmeans聚类

    import numpy as np import matplotlib pyplot as plt import pandas as pd from sklearn cluster import KMeans from sklearn i
  • 为wget命令设置代理

    实验环境 xff1a ubuntu 12 04 LTS goagent 方法一 在环境变量中设置代理 export http proxy 61 http 127 0 0 1 8087 方法二 使用配置文件 为wget使用代理 xff0c 可
  • ubuntu14.04安裝numpy,scipy

    在windows下搞python xff0c 实在出错太多 xff0c 就安装了双系统 xff0c 在ubuntu下试着学习一下 xff0c 我的ubuntu版本为ubuntu14 04 以前不知道python的这些包之间是有依赖关系的 x
  • STM32的中断体系和FSMC控制LCD-第3季第7部分视频课程-朱有鹏-专题视频课程

    STM32的中断体系和FSMC控制LCD 第3季第7部分视频课程 861人已学习 课程介绍 本课程是 朱有鹏老师单片机完全学习系列课程 第3季第7个课程 xff0c 本课程详细讲解STM32的外部中断和FSMC模块 xff0c 这两个模块都
  • ubuntu加入Windows的AD域(使用Samba和Winbind的方式)

    ubuntu加入Windows的AD域 Integrate Ubuntu 16 04 to AD as a Domain Member with Samba and Winbind Part 8 Step 1 Initial Configu
  • XTU 1262 Fish(优先队列+贪心)

    钓鱼 http 202 197 224 59 exam index php problem read id 1262 题目描述 小明很喜欢钓鱼 xff0c 现在有n个池塘可以钓鱼 xff0c 第i个池塘首次内能钓到ai条鱼 第i个池塘如果被
  • webpack开发调试模式devtool

    devtool 有7种模式 eval 文档上解释的很明白 xff0c 每个模块都封装到 eval 包裹起来 xff0c 并在后面添加 sourceURL source map 这是最原始的 source map 实现方式 xff0c 其实现
  • HDFS 集成 Kerberos

    本文主要记录 CDH Hadoop 集群上配置 HDFS 集成 Kerberos 的过程 xff0c 包括 Kerberos 的安装和 Hadoop 相关配置修改说明 注意 xff1a 下面第一 二部分内容 xff0c 摘抄自 Hadoop
  • html实现自动清理js、css文件的缓存

    方法如下 xff1a 1 手动清除浏览器缓存 xff1b 2 添加版本号 方法一 xff1a 可以通过js自动给html添加版本号 lt script type 61 34 text javascript 34 gt document wr
  • 虚拟机在nat模式下无法连接网络

    问题导入 在vmware下使用虚拟机由于某些原因设置了静态IP但是在后续的使用发现无法创建新的ssh连接 xff08 之前建立过连接并保存了密钥的仍可连接 xff09 xff0c 同时发现了主机网络可以正常ping通虚拟机的网络 xff0c
  • 74HC573芯片简介

    芯片缺口方向 为正 xff0c 然后左上往下排列 xff0c 最后一个是GND xff0c 然后 向右 xff0c 再向右上 xff0c 右上角为Vcc GND 和Vcc成对角线 xff0c 是为了防止发生短路 LE xff1a latch
  • c语言中返回值为char*的情况分析

    容易出错的地方在于 xff1a 指针作为返回值 xff0c 但是指针指向的内存单元在函数返回后 xff0c 内存单元释放了 xff0c 这样就导致了指针成了野指针了 xff01 xff01 xff01 这样会报错 xff0c 因为str数组
  • 网线水晶头接法分两种教程

    转载 xff1a https blog csdn net VickHUC article details 90081813 我们家里如果要用网线的话 xff0c 其实是可以自己接水晶头的 xff0c 当然你得有一个叫压线钳的工具 xff0c
  • STM32的定时器和DS18B20调试-第3季第8部分视频课程-朱有鹏-专题视频课程

    STM32的定时器和DS18B20调试 第3季第8部分视频课程 975人已学习 课程介绍 本课程是 朱有鹏老师单片机完全学习系列课程 第3季第8个课程 xff0c 本课程详细讲解STM32的定时器 xff0c 尤其是SYSTICK定时器和通
  • c语言/c++中指针的动态初始化及释放

    提醒 xff1a 使用指针最容易犯得错误是 xff0c 没有初始化就直接操作 xff01 xff01 xff01 1 指针的初始化 释放 1 xff09 指针指向一个内存单元 i c语言 xff1a char ch 61 char mall
  • c语言函数参数为指针的情况分析

    指针取 解引用 表示的是指针所指向内存单元中内容 xff1b 或者理解为该内存空间 指针传递其实也是一种值传递 xff0c 只不过传递的是地址值 xff0c 如果通过该地址取 解引用 xff0c 是可以改变形参指针的原值的 xff0c 但如