zoukankan      html  css  js  c++  java
  • 以指针作为实参的问题

    以指针作为实参时,实参p传递给形参p1的其实是p的拷贝,所以在局部函数中改变形参p1的指向对身处主函数的p是无影响的,但是因为p1是p的拷贝,

    所以他们的指向是相同的,所以可以通过p1修改了那块内存的值。如果实参p的指向为空,也就是说p是一个空指针的话,那么它就没有指向某块内存,

    形参也就无法操作p所指向的内存了(因为p本就没有指向任何一块内存),即使p1在局部函数中指向了一个malloc的空间,

    这其实是改变了p1的指向(从NULL到指向malloc的空间),但是如前所述,p1只是p的拷贝,改变副本的指向对本尊是没有任何影响的,

    所以对p没有影响,p还是为空。但是因为p1的生存周期是在局部函数范围内,所以一旦函数执行结束,p1这个变量就会被销毁释放,

    但是那块malloc的空间却不会被释放,那就会成为空间碎片。

    实参指针为空的一个例子:

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 void f(int *p1)
     5 {
     6     p1 = (int*)malloc(sizeof(int));
     7     *p1 = 100;
     8 }
     9 
    10 int main()
    11 {
    12     int *p = NULL;
    13     f(p);
    14     printf("%d", *p);//程序崩溃,因为p是空指针,试图解引用一个空指针
    15     return 0;
    16 }

    实参指针不为空的一个例子:

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 void f(int *p1)
     5 {
     6     p1 = (int*)malloc(sizeof(int));    //改变了p1的指向,p1指向新分配的那块内存,对主函数中的p无任何影响
     7     *p1 = 100;
     8 }
     9 
    10 int main()
    11 {
    12     int a = 10;
    13     int *p = &a;
    14     f(p);
    15     printf("%d", *p);    //输出为10
    16     return 0;
    17 }

     传一个空指针时可以用二级指针

    #include <stdio.h>
    #include <stdlib.h>
    
    void f(int **p1)
    {
    	*p1 = (int*)malloc(sizeof(int));
    	**p1 = 100;
    }
    int main()
    {
    	int *p = NULL;
    	f(&p);
    	printf("%d", *p);//程序崩溃,因为p是空指针,试图解引用一个空指针
    	return 0;
    }
    

      

  • 相关阅读:
    面向对象进阶
    初识面向对象
    模块和包
    day 17递归函数
    pip命令无法使用
    Python中的iteritems()和items()
    C# 截取字符串
    Python连接Mysql数据库
    【PYTHON】 Missing parentheses in call to 'print'
    javaScript中with函数用法实例分析
  • 原文地址:https://www.cnblogs.com/hi3254014978/p/9478307.html
Copyright © 2011-2022 走看看