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;
- C/C++函数指针传递和typedef的误区
- C 函数值传递和指针传递的效率问题
- typedef函数指针的用法(C++)
- typedef函数指针的用法(C++)
- typedef函数指针的用法(C++)
- typedef函数指针的用法(C++)
- typedef函数指针的用法(C++)
- 转:typedef函数指针的用法(C++)
- C 中typedef 函数指针的使用
- 【C/C++】函数中指针的传递
- C语言中函数和指针的参数传递
- C语言指针和typedef
- C函数的指针传递问题
- 关于typedef和指针函数的用法的一些尝试,依然有些不求甚解-C语言
- 理解复杂的C/C++声明 const, typedef , 函数指针
- 理解复杂的C/C++声明 const, typedef , 函数指针
- 理解复杂的C/C++声明 const, typedef , 函数指针
- 理解复杂的C/C++声明 const, typedef , 函数指针
- 语音知识回顾和总结---短时频域性质
- 最小C基础库
- Django学习整理
- 黑马程序员——简单画板的制作
- C++虚函数编译分析
- C/C++函数指针传递和typedef的误区
- 利用js来通过复选框控制表格的长宽
- yuv and rgb
- 结构体的内存分配(对齐)
- 文件上传简介1---上传到指定的目录
- OCP-1Z0-052-V8.02-167题
- 转折后的总结--2014年找工作
- 虚拟类--动物描述
- OCP-1Z0-052-V8.02-166题