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...这个语句就是给当前指针指向的内存空间申请空间,这没什么问题,我们发现,其实函数就是在给外部的指针变量申请空间。

相关推荐

  1. void * 指针作用_C

    2024-03-26 13:42:03       109 阅读
  2. C语言指针函数和函数指针

    2024-03-26 13:42:03       19 阅读
  3. C语言作用域与生命周期

    2024-03-26 13:42:03       55 阅读
  4. c语言,局部变量作用域是?

    2024-03-26 13:42:03       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-26 13:42:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-26 13:42:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-26 13:42:03       82 阅读
  4. Python语言-面向对象

    2024-03-26 13:42:03       91 阅读

热门阅读

  1. Pandas 数据结构 - DataFrame

    2024-03-26 13:42:03       43 阅读
  2. maya 重定向 pycharm运行

    2024-03-26 13:42:03       42 阅读
  3. 找数字中的数据结构与算法

    2024-03-26 13:42:03       42 阅读
  4. 迷宫与陷阱(蓝桥杯)

    2024-03-26 13:42:03       44 阅读
  5. PHP面试基础题记录

    2024-03-26 13:42:03       30 阅读
  6. 【python】正则表达式

    2024-03-26 13:42:03       41 阅读
  7. OpencV图像几何形状绘制

    2024-03-26 13:42:03       46 阅读
  8. 面试算法-113-打家劫舍

    2024-03-26 13:42:03       39 阅读
  9. 计算机网络

    2024-03-26 13:42:03       36 阅读