C语言中,为什么通过函数为指针变量分配内存,形参一定要是二级指针? 为什么数据结构中的树的操作函数的形参都是些二级指针,用一级指...

作者&投稿:弭谦 (若有异议请与网页底部的电邮联系)

我感觉没有必要用二级指针,我们的目的主要是为了让主函数中的指针的地址指向一个空内存。我们完全可以通过传递这个指针的地址到子函数中,然后给这个指针的地址分配内存就可以了。例如下面这个程序就是正确的。根本没有必要使用到二级指针呀。



假设是这样
void get(int *p,int num)
{
p=(int *)malloc(num*sizeof(int));
return;
}

调用函数
int *pi;
get(pi,10); get函数里的这个参数只是pi的一个副本,get函数结束后就没了,malloc分配的内存首地址也没带出来,pi还是原来的pi没变,还发生了内存泄漏

想用一级指针当参数 可以这样
int* get(int *p,int num) //返回指针
{
p=(int *)malloc(num*sizeof(int));
return p;
}
这样看起来是返回了一个局部变量的地址,但这个地址是个堆地址,函数结束后任然有效,只要记得释放就行了

那么就可以这样了

int* pi;

pi=get(pi, 10); //是不是有点脱裤放屁的感觉,还不如直接pi=(int*)malloc(10*sizeof(int))

最后在适当的时候释放 free(pi)

这其实就是参数传递的一个问题,我只能说通过一个简单的例子来类比。
先说一个简单点的问题:如果说我想通过参数来改变一个整数类型的变量的值,就只能用
void Fun(int *a)
{
*a=9;
}
而不能用
void Fun(int a)
{
a=9;
}
因为我的第一种写法传入的是变量a在内在中的地址,子函数改变的是这个地址所指向的内存空间里面的内容,从而改变了变量的值;但是第二种写法只是将变量a的值传入到函数当中,并不能改变它的值。你说的情况跟这个是类似的,第二种情况没有改变p的值(p的值是一个地址,函数执行完之后p的值没变,所以还是指向原来的内存空间)

函数调用其实就是值传递
#include <iostream>
using namespace std;

void get(int *p)
{
*p=5;
}
void main()
{
int i=1;
int *p1=&i;
cout<<i<<endl;
get(p1);
cout<<i<<endl;
}
为什么我们用指针可以 i 的值,其实就是把 i 的地址值p1(&i)传递到p中,这是*p(*(&i))还不是指的 i ;
我们再看下面两个方法,这里我们的目的为*p1分配内存,也就是改变p1的值。
void get(int **p,int num);
void get(int *p,int num);
int *p1,i=1;
get(p1,i); //p1的值(unsigned int)传递给p,现在执行*p=(int *)malloc(num*sizeof(int));这时改变的是*p1,然而p1没变
get(&p1,i); //p1的 地址值 (unsigned int)传递给p,现在执行*p=(int *)malloc(num*sizeof(int));这时改变的就是p1

推荐你看看内存管理 http://www.cppblog.com/yishanhante/articles/18957.html?opt=admin

可以改,但你下面也要改
*p=(int *)malloc(num*sizeof(int));
改成
p=(int *)malloc(num*sizeof(int));

C语言中为什么函数形参中二级指针和一级指针指输出的结果一样~

兄弟,那个不是一级指针,那是指针数组
指针数组作为函数形参时会自动转换为指针的指针,也就是你说的二级指针

char **p=book;从这一行也能证明我说的,自动转换

特别注意:它只会转换数组的最内层(我有点分不清内外)
int arr[2][6];
int (*aa)[6] = arr;//对
//int *aa1[6] = arr;//错
//int (*aa2)[2] = arr;//错
//int (*aa3)[] = arr;//错
//int *aa4 = arr;//错
//int **aa5 = arr;//错

一般我们用一个指针来指向树的根节点,并用这个指针来表示树。
但是在树的操作中,有可能需要修改这个指针本身的值,比如树的某个叶子节点变化为了根节点。注意,这里不只是修改该指针指向的变量内容(比如根节点的数据域的值)。
因此,在函数传参时,就要传这个指针的指针,即二级指针。

C语言中,为什么通过函数为指针变量分配内存,形参一定要是二级指针?
答:我们的目的主要是为了让主函数中的指针的地址指向一个空内存。我们完全可以通过传递这个指针的地址到子函数中,然后给这个指针的地址分配内存就可以了。例如下面这个程序就是正确的。根本没有必要使用到二级指针呀。

在C程里,为啥用指针做形参的函数可以改变实参数组的值?
答:c语言就这样规定的,可以访问到那个地址,改变了地址里元素的值,所以实参数组的值也改变了

C语言关于调用函数交换2数的问题,请问为什么用了指针才能交换?
答:的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。指针传递:可以改变指针指向内容的值,但是不能改变指针本身,无需复制开销。

为什么在被调函数中使用指针就能够互换主函数中两个变量的值?_百度知 ...
答:指针指向一个变量地址,在被调函数中,将变量地址做为参数,这样被调函数就可通过地址(指针)访问变量的内存存储单元对变量进行读写修改,如这样一个输入语句理解:scanf("%d", &n); //表示先取n的地址,通过地址向单元写...

C语言 写一个函数交换两个数的值,为什么一定要用指针?
答:fun4()是正确的。为了在函数中改变了的变量能被其它函数调用,正确的办法是用指针变量作为函数参数,在函数执行过程中使指针变量所指向的变量值发生变化。函数调用结束后,哲别变量值的变化依然保留下来,这样就实现了通过函数...

函数指针是什么意思?
答:函数指针是 C 语言中的一种特殊数据类型。在 C 语言中,函数被视为一种“可执行代码块”,它们可以被传递到其他函数中做为参数,也可以被赋值给指针变量。这就是函数指针的作用所在。函数指针在指针变量的基础上,增加了...

C语言中函数指针用法
答:2:函数指针变量 在C语言中规定,一个函数总是占用一段连续的内存区, 而函数名就是该函数所占内存区的首地址。 我们可以把函数的这个首地址 ( 或称入口地址 ) 赋予一个指针变量, 使该指针变量指向该函数。然后通过...

解释下为什么C语言中用函数交换两个数的值只能用指针,而不能用这个方法...
答:函数返回后,这两个变量被舍弃,函数调用也没有将这两个临时变量的值返回给main函数中调用使用的参数功能。所以,在函数中要操作调用者申请的变量,需要给出它们的指针,函数中用指针来找到这些变量的位置和内容。

指针的作用是什么啊?
答:第二,指针使得一些复杂的链接性的数据结构的构建成为可能,比如链表,链式二叉树等等。第三,有些操作必须使用指针。如操作申请的堆内存。还有:C语言中的一切函数调用中,值传递都是“按值传递”的。如果要在函数中修改被...

c语言中函数指针是什么 有什么用 举个实例
答:函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。函数指针有两个用途:调用函数和做函数的参数。函数...