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

相关文章

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

C语言逗号运算符和逗号表达式的使用小结

《C语言逗号运算符和逗号表达式的使用小结》本文详细介绍了C语言中的逗号运算符和逗号表达式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 在C语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把两个表达式连接其一般形式为:表达

Go语言实现桥接模式

《Go语言实现桥接模式》桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化,本文就来介绍一下了Go语言实现桥接模式,感兴趣的可以了解一下... 目录简介核心概念为什么使用桥接模式?应用场景案例分析步骤一:定义实现接口步骤二:创建具体实现类步骤三:定义抽象类步骤四:创建扩展抽象类步

GO语言实现串口简单通讯

《GO语言实现串口简单通讯》本文分享了使用Go语言进行串口通讯的实践过程,详细介绍了串口配置、数据发送与接收的代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录背景串口通讯代码代码块分解解析完整代码运行结果背景最近再学习 go 语言,在某宝用5块钱买了个

JAVA transient 关键字作用详解

《JAVAtransient关键字作用详解》Java的transient关键字用于修饰成员变量,使其不参与序列化过程,通过自定义序列化方法,可以手动控制transient变量的序列化行为,本文给大... 目录一、transient关键字作用二、原理详解三、典型使用场景四、代码示例五、注意事项六、与 stat

Spring Boot/Spring MVC核心注解的作用详解

《SpringBoot/SpringMVC核心注解的作用详解》本文详细介绍了SpringBoot和SpringMVC中最常用的15个核心注解,涵盖了请求路由映射、参数绑定、RESTfulAPI、... 目录一、Spring/Spring MVC注解的核心作用二、请求映射与RESTful API注解系列2.1

GO语言zap日志库理解和使用方法示例

《GO语言zap日志库理解和使用方法示例》Zap是一个高性能、结构化日志库,专为Go语言设计,它由Uber开源,并且在Go社区中非常受欢迎,:本文主要介绍GO语言zap日志库理解和使用方法的相关资... 目录1. zap日志库介绍2.安装zap库3.配置日志记录器3.1 Logger3.2 Sugared

Go语言中如何进行数据库查询操作

《Go语言中如何进行数据库查询操作》在Go语言中,与数据库交互通常通过使用数据库驱动来实现,Go语言支持多种数据库,如MySQL、PostgreSQL、SQLite等,每种数据库都有其对应的官方或第三... 查询函数QueryRow和Query详细对比特性QueryRowQuery返回值数量1个:*sql

C#中的sealed修饰符的作用详解

《C#中的sealed修饰符的作用详解》在C#中,sealed修饰符的作用是“密封”用来阻止类被继承,或者阻止方法/属性在派生类中被重写,接下来通过本文给大家介绍C#中的sealed修饰符的作用详解,... 目录✅ 1.sealed用于类(class)作用:示例:✅ 2.sealed用于方法或属性(必须与

GO语言中gox交叉编译的实现

《GO语言中gox交叉编译的实现》本文主要介绍了GO语言中gox交叉编译的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、安装二、使用三、遇到的问题1、开启CGO2、修改环境变量最近在工作中使用GO语言进行编码开发,因