C语言中二重的指针的作用

2024-03-25 17:12
文章标签 语言 作用 指针 二重

本文主要是介绍C语言中二重的指针的作用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

当你需要修改实参(已经定义的)的指针的时候,形参就需要传递指针的指针。

void GetMemory(char *p,int num)
{p=(char*)malloc(sizeof(char)*num);       //p是形参指向的地址
}
void main()
{char *str=NULL;GetMemory(str,100);                            //str是实参指向的地址,不能通过调用函数来申请内存strcpy(str,"hello");
}

 这里并不会正常运行,因为函数在执行完之后,就已经从栈中释放了内存,所以str变量不会申请内存。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
void allocateMemory(char *str,int len)
{str = (char *)malloc(sizeof (char) * len + 1); // 栈中的内存,函数执行完就已经销毁了
}
int main()
{char* str = NULL;allocateMemory(str, 20);strcpy(str, "hello");printf("str is %s" , str); // 所以会无法打印return 0;
}

C语言中,传递给函数的值是变量的copy,而不是真实的变量,如果要对变量进行操作需要使用&符号,对于指针来说,定义好的参数和传递给函数的参数指向的是同一个地址。

 可以看到函数中确实申请到了str的内存

 但是执行完函数之后,内存释放,申请到的内存也释放了,所以str依旧是空指针。

也就是说函数内部对指针的修改不会影响到外部的指针。

我们对代码进行简单的修改,可以理解到二重指针的作用

void allocateMemory(char **str,int len)
{*str = (char *)malloc(sizeof (char) * len + 1); // 栈中的内存,函数执行完就已经销毁了
}
int main()
{char *str = NULL;allocateMemory(&str,6);strcpy(str,"hello");printf("str is %s",str);return 0;
}

 

通过调试,我们发现了

 函数中仍然是正常申请到了内存,当函数结束并释放内存的时候,退回到主程序

 我们能正常的申请到了内存。这是为什么?

上文提到了C语言中函数传递变量是传递变量的copy,如果要修改变量的地址,需要&符号

我们将指针变量的地址传入了函数中

接下来,让我们先介绍一下,二重指针之间的传递关系

是这个样子的,大多数人的疑问应该会和我一样,为什么指针变量作为参数却传入了一个而二重指针函数中呢?

因为二重指针可以使我们在函数内部修改外部指针的值,定义的指针变量使用&符号传递给函数时,传递给函数的其实是指针变量的地址。

如图,每一个指针变量都有一个地址,&p就是地址,&(*p)就是指针指向的第一个元素的地址,所以在函数外部,我们传递给函数一个指针变量的的地址,在函数中,*p=malloc...这个语句就是给当前指针指向的内存空间申请空间,这没什么问题,我们发现,其实函数就是在给外部的指针变量申请空间。

这篇关于C语言中二重的指针的作用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/845680

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

css中的 vertical-align与line-height作用详解

《css中的vertical-align与line-height作用详解》:本文主要介绍了CSS中的`vertical-align`和`line-height`属性,包括它们的作用、适用元素、属性值、常见使用场景、常见问题及解决方案,详细内容请阅读本文,希望能对你有所帮助... 目录vertical-ali

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

浅析CSS 中z - index属性的作用及在什么情况下会失效

《浅析CSS中z-index属性的作用及在什么情况下会失效》z-index属性用于控制元素的堆叠顺序,值越大,元素越显示在上层,它需要元素具有定位属性(如relative、absolute、fi... 目录1. z-index 属性的作用2. z-index 失效的情况2.1 元素没有定位属性2.2 元素处

Spring 中 BeanFactoryPostProcessor 的作用和示例源码分析

《Spring中BeanFactoryPostProcessor的作用和示例源码分析》Spring的BeanFactoryPostProcessor是容器初始化的扩展接口,允许在Bean实例化前... 目录一、概览1. 核心定位2. 核心功能详解3. 关键特性二、Spring 内置的 BeanFactory

Spring组件初始化扩展点BeanPostProcessor的作用详解

《Spring组件初始化扩展点BeanPostProcessor的作用详解》本文通过实战案例和常见应用场景详细介绍了BeanPostProcessor的使用,并强调了其在Spring扩展中的重要性,感... 目录一、概述二、BeanPostProcessor的作用三、核心方法解析1、postProcessB