以指针作为实参的问题

简介: 以指针作为实参的问题

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

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

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

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

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

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

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

  #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;
 }

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

  #include <stdio.h>
  #include <stdlib.h>
  void f(int *p1)
  {
      p1 = (int*)malloc(sizeof(int));    //改变了p1的指向,p1指向新分配的那块内存,对主函数中的p无任何影响
      *p1 = 100;
  }
 int main()
 {
     int a = 10;
     int *p = &a;
     f(p);
     printf("%d", *p);    //输出为10
     return 0;
 }

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

#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;
}


相关文章
|
测试技术 C语言
C语言犄角旮旯的知识之形参、实参、main函数参数、数组或指针做函数参数等
C语言犄角旮旯的知识之形参、实参、main函数参数、数组或指针做函数参数等
|
存储 C语言
指针妙用之将函数中形参的值传递给实参
指针妙用之将函数中形参的值传递给实参
|
存储 测试技术 C++
指针作为函数参数,修改实参值
1,指针作为函数参数, 指针可以指向内存中任意一个数据,通过间接引用能够在函数内修改函数外甚至系统中的数据; 为了避免指针作为函数参数导致数据被意外修改,我们可以使用const来保护指针所指向的数据; 2,指针作为函数返回值, 同别的数据类型int,float一样,指针也能够作为函数的一种返...
770 0
通过指针修改外边实参
函数内容如何改变外部的实参? 对于上面的问题,只有C中的指针能够完成, 基本数据类型作为函数实参,只是将值纯粹的传递给形参,形参的改变并不影响实参.   1 #include 2 3 void swap(char v1,char v2) { 4 printf("更...
519 0
函数中指针和引用的形参和实参
#include using namespace std; void change(int *a,int &b,int c)//指针作形参,前面加*号,引用作形参前面加&号。 { c=*a; b=3; *a=2; } in...
619 0
|
2月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
169 13
|
3月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
42 0
|
4月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
161 4
|
5月前
|
C语言
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)

热门文章

最新文章