C/C++函数指针传递和typedef的误区

来源:互联网 发布:实对称矩阵对角化方法 编辑:程序博客网 时间:2024/06/02 00:28

函数指针传递误区一:错以为指针传递一定修改值

先看一个正常的内存分配

void main()

{

int *p = null;

p = (int*)malloc(sizeof(int)*100);

*p = 10;

printf("%s", p[0]);

 }

看完这个,你肯定说对的,的确是对的,而且考了几个方面,内存分配指针与数组的关系

下面进行以下修改

void mytest(int * p)

{

   p= (int*)malloc(sizeof(int)*100);
}

void main()

{

int *p = null;

mytest(p);

*p = 10;

printf("%s", p[0]);

}

对不对呢?有些人肯定回答对,有些人也会回答不对!

其实这个是不对的,为什么呢?其实这里是一个误区,设置的一个陷阱

 

当指针传进去的时候,是采用值传递就是p指针的值传给了参数p

其实我们可以把形参p看作p1就明白了,看下面

这里面形参与实参此时指向的位置都是如图所示的位置(假设都已分配,其实实参还没有分配)

 

但是这里形参分配了,而且形参在函数调用结束后就被释放了,所以p1值的改变根本无法修改实参p

那么如何修改当前传过的值??当然通过值是无法修改的,我们需要修改传过来数据指向的内容,这样就可以达到目的,这里面就是指针的指针

 

这时候就可以达到目的,注意我们要修改谁!!这个是我们需要注意的,修改谁,就传递他的指针

再看下面

void mytest(int ** p1)

{

   *p1= (int*)malloc(sizeof(int)*100);
}

void main()

{

int *p = null;

mytest(&p);

*p = 10;

printf("%s", p[0]);

}

这个时候就对了,注意我们要改变的是p的值,因为形参的值是p1,我们修改它没用,改变不了p,所以是*p1

 

总结如下:

这里在函数里面修改的都是形参,不是实参,如果修改实参,只能通过实参的地址传给形参,这时候形参本身没有被改变(应该说改变了,但是没有传递回来),但是形参指向的内容改变了。

跟const int a =5;想修改a值是一样的,我们可以
int *p = &a;然后修改p指向的内容来改变 

比如:*p =100;

 

记住:1)无论形参是变量还是指针,记住都是值传递

           2)形参其实是需要分配空间的,与实参空间是不同的单元,调用结束后会被释放


typedef定义误区二:错以为typedef为替换操作

请看以下情况:

typedef string *pstrType;

const pstrType cstrVar;

请问cstrVar是什么类型?简单的回答是const pstrType,那么这个类型是什么呢?

我以为是const string * cstrVar;对吗?

其实这个是错误的,原因就在const 修饰的是pstrType,而pstrType是一个指针类型,也就是说cstrVar本身是一个指向string的const指针

等价于string * const cstrVar;


原创粉丝点击