二级指针的形参问题

草草嗒!下面的程序myMalloc是没有返回值的!害我想半天=。=

用一级指针同样可以实现程序2,但需要返回值。

总结:二级指针做形参时,操作的对象已经不是临时变量了;而一级指针操作的是临时变量。

====下面的已经没价值了===============================

程序1:  
void  myMalloc(char  *s)  //我想在函数中分配内存,再返回  
{  
     s=(char  *)  malloc(100);  
}  
 
void  main()  
{  
     char  *p=NULL;  
     myMalloc(p);    //这里的p实际还是NULL,p的值没有改变,为什么?  
     if(p)  free(p);  
}  
程序2:

void  myMalloc(char  **s)  
{  
     *s=(char  *)  malloc(100);  
}  
 
void  main()  
{  
     char  *p=NULL;  
     myMalloc(&p);    //这里的p可以得到正确的值了  
     if(p)  free(p);  
}

==========================================================================

void  myMalloc(char  *s)  //我想在函数中分配内存,再返回  
{  
     s=(char  *)  malloc(100);  
}  
 
myMalloc(p)的执行过程:  
分配一个临时变量char  *s,s的值等于p,也就是NULL,但是s占用的是与p不同的内存空间。此后函数的执行与p一点关系都没有了!只是用p的值来初始化s。  
然后s=(char  *)  malloc(100),把s的值赋成malloc的地址,对p的值没有任何影响。p的值还是NULL。  
注意指针变量只是一个特殊的变量,实际上它存的是整数值,但是它是内存中的某个地址。通过它可以访问这个地址。

(此处  s=(char  *)  malloc(100);操作的是临时变量
 
程序2:void  myMalloc(char  **s)  
{  
     *s=(char  *)  malloc(100);  
}  
 
void  main()  
{  
     char  *p=NULL;  
     myMalloc(&p);    //这里的p可以得到正确的值了  
     if(p)  free(p);  
}  
程序2是正确的,为什么呢?看一个执行过程就知道了:  
myMalloc(&p);将p的地址传入函数,假设存储p变量的地址是0x5555,则0x5555这个地址存的是指针变量p的值,也就是Ox5555指向p。  
调用的时候同样分配一个临时变量char  **s,此时s  的值是&p的值也就是0x5555,但是s所占的空间是另外的空间,只不过它所指向的值是一个地址:Ox5555。  
*s=(char
 *)  malloc(100);这一句话的意思是将s所指向的值,也就是0x5555这个位置上的变量的值赋为(char  *)
 malloc(100),而0x5555这个位置上存的是恰好是指针变量p,这样p的值就变成了(char  *)
 malloc(100)的值。即p的值是新分配的这块内存的起始地址。  (指针本身有一个地址,指针的内容是另一个数据的地址;对*s这个二级指针操作改变的是二级指针存储的数据(即一级指针的地址,这个已经不是临时变量了),所以即使myMalloc没有返回值,但是一级指针的地址仍会被修改(实参))
 
这个问题理解起来有点绕,关键是理解变量作函数形参调用的
时候都是要分配一个副本,不管是传值还是传址。传入后就和形参没有关系了,它不会改变形参的值。myMalloc(p)不会改变p的值,p的值当然是
NULL,它只能改变p所指向的内存地址的值。但是myMalloc(&p)为什么就可以了,它不会改变(&p)的值也不可能改变,但是
它可以改变(&p)所指向内存地址的值,即p的值。

时间: 2024-10-30 21:54:31

二级指针的形参问题的相关文章

指针做形参做局部变量以及内存分配

指针做形参做局部变量以及内存分配 一级指针做形参:首先一定要明白形参和你传递参数的那个实参是两个不同的变量,即使同名也还依然不同.指针传递的是一个变量或者一个值的地址,但是它本身还是采用值传递的方式.即你不能使它指向另外一块地址,但是你可以改变它指向的空间里存的值. 二级指针做形参:二级指针也是传值,但是他指向的地址是个一维指针,所以可以改变二维指针指向的地址空间里的内容也就是要申请空间的一维指针,不能改变二维指针本身的值,即不能让他指向一个新的一维指针.所以二维指针传递的是一个一维指针. 具体

指针形参,二级指针改值

程序: #include <stdio.h> #include <stdlib.h> void change(char *a) {//副本 printf("change 1:%s\n", a); a="change";//实参副本指向改变,不影响实参的指向 printf("change 2:%s\n", a); } void change2(char **a) { printf("change2 1:%s\n&q

二级指针**P

首先理解几个概念: 1.对于一个普通变量,进行引用操作,得到的是一级指针.如int a=0;int *p=&a,则&a就是一级指针.因为&a的值就是a的地址,p的值也是a的地址,则&a和p就是一级指针变量(简略为指针),对&a进行解引用操作,int b=*&a;这b等于0. 2.对于普通变量作为形参传递到函数内部,参数的值传递就意味着只是简单的将变量的值copy了一份到临时变量中,然后将临时变量传递给函数,然而临时变量和原始变量是没有任何关系,则函数是无法改

二级指针的问题汇总

二级指针的问题 如何在被调用函数里面新建数据,然后将数据的地址传递出来呢? 一般来说有两种方法,第一种思路是将数据的首地址以返回值的方法返回,第一种方法如下: #include <stdio.h> #include <stdlib.h> #include <string.h> char *newBuf(int num) { char *p; p = (char *)malloc(num * sizeof(char)); return p; } void deleteBu

C提高4 多维数组,结构体与二级指针

昨天的试题:原题见昨天作业题 [email protected]:~/high/day03$ cat main.c  /* 二级指针,绝佳训练题1 */ #include <stdio.h> #include <stdlib.h> #include <string.h> int spitspring(char *buf1,char *c,char **myp,int *total) { char *p_head =  buf1; char *p_tail =  buf1

二级指针的简单运用

在C语言中,数组名就是一个指针常量,保存数组的首地址.因为数组名是一个常量指针常量,不能修改其指向的值,因此可以定义一个指针变量指向数组.这样使用数组名加下标可访问数组中的元素,使用指针名加下标也可访问数组中的元素.这些在本章前面已经介绍过了. 现在如果再定义一个二级指针变量,让其指向一级指针,就可使用二级指针变量操作数组.例如,使用以下语句定义二级指针变量: int a[10]; int *p=a; int **pp=&p; 这样,二级指针变量pp.一级指针变量p和数组a之间的关系,如图9-4

指针用作传出参数时,需要二级指针

1. 参数传递的原则是:形参传给实参,不能反向传递: 2. 一级指针可以在函数内部修改形参指针指向的内容; 如: void fun(char *p) { p[2] = a;//由形参(实参)指向的函数外部的数组的内容就被改变了. } 如果我们想改变实参本身呢?也就是说,我们连指针值都要改变,如果使用: void GetMemory(int num, char *p) { p = (char *)malloc(num * sizeof(char)) //或C++中:p = new char[10]

把指针作为形参,用于取值的用法。

指针作为函数的形参有两种用法:1.传值.2.取值.下面我们讨论下,使用指针取值的用法.指针之所以能够用来取值是作用域和生存周期的原因. (1)用一级指针取数值. int fun1(int* p) { *p = 3;// *p为整型变量,3为整数常量.如此两侧对等. } (2)用二级指针取一级地址值. int fun2(int** p) { int* pnew = (int*)malloc(sizeof(int)); *p = pnew;// *p是一级指针变量,pnew也是一级指针变量.如此两侧

指针数组,数组指针,指针函数,函数指针,二级指针详解

先看个简单的:char *p,这定义了一个指针,指针指向的数据类型是字符型,char  *(p)定义了一个指针P: char *p[4], 为指针数组,由于[]的优先级高于*,所以p先和[]结合,p[]是一个数组,暂时把p[]看成是q,也就是char *(q),定义了一个指针q,只不过q是一个数组罢了,故定义了一个数组,数组里面的数据是char *的,所以数组里面的数据为指针类型.所以char *p[4]是四个指针,这四个指针组成了一个数组,称为指针数组,既有多个指针组成的数组. char(*p