双重指针做参数传递
来源:互联网 发布:瓦拉内fifa数据 编辑:程序博客网 时间:2024/04/30 13:42
今天话了点时间想了一下用双重指针做参数传递的问题,以前一直只知道用,没有细想过为什么,今天正好有点xian。
#include"stdio.h"
void fun(char * pa)
{
printf("pa的值:%d\n",pa);
pa = "bb";
printf("pa的值:%d\n",pa);
}
int main(void)
{
char * p = 0;
printf("p的值:%d\n",p);
fun(p);
if(p != 0)
{
printf("改变后输出p = ");
puts(p)
}
else
{
printf("p值未改变!\n");
}
return 0;
}
结果输出"p值未改变!",分析一下不难理解:给fun函数传参的时候,其实应该是有一个隐形的操作pa=p ,这个操作和普通的两个变量赋值是一样的,把p的值赋给了pa,
然后,我们通过打印出来的值可以看到,在fun里面,pa的值原本是p的地址的,但是,pa在fun里面指向了“bb”,这样,问题就出来了,pa的值确实改变了,指向也变了,
但是,我们想要改变的p的值仍旧是”0“。
后来,我发现,p的值没有改变是因为pa改变的是他自己的值,没有改变他的指向的地址的值,但在这个例子里面作为参数的p初始化是0,也就是NULL,如果进行*pa = 'b'
这样的操作的话是非法的。 为了使操作成功,我给p赋了初值”aa“,然后进行这个操作发现仍旧不成功。原来,因为计算机的内存主要是分为:栈区、堆区、静态区、只读
区,其中,栈区,分配的是局部变量空间,比如是函数的调用,局部变量,需要执行的代码等等一些不需要我们手动分配和释放的内存;堆区,是向上增长的,主要是分配程序员申请的空间;静态分区,分配的是静态变量、全局变量;只读分区,分配的是常量和代码空间。 所以,这个操作才会失败。。
现在,来总结一些:首先,我们需要的结果是通过传递一个指针,来改变这个指针的指向的值,上面那个例子里面,传递的仅仅是一个地址值,因此,在下面的例子里面,我们需要传递的是一个完整的指针变量,我把这个指针变量的地址传进去,这就是我理解的二重指针做参数:
#include"stdio.h"
void fun(char ** pa)
{
printf("pa的值:%d\n",pa);
*pa = "bb";
printf("pa的值:%d\n",pa);
}
int main(void)
{
char * p = 0;
printf("p的值:%d\n",p);
fun(&p);
if(p != 0)
{
printf("改变后输出*p = ");
puts(p);
}
else
{
printf("p值未改变!\n");
}
return 0;
}
OK,把指针p的地址作为参数传递给fun函数,pa=&p;*pa="bb";这样就可以p的值就变成"bb"在只读区的地址了。。。
高手勿喷。。。。有错欢迎指正!
高手勿喷。。。。有错欢迎指正!
高手勿喷。。。。有错欢迎指正!
- 双重指针做参数传递
- 双重指针做参数传递
- 用双重指针做参数传递
- 用双重指针做参数传递
- 双重指针做函数参数的意义
- 重构--使用双重指针做参数来写队列
- 二维指针做函数参数传递问题
- 数组和指针做函数参数传递
- C++一级指针和二级指针做参数传递讲解
- [指针五]指针做参数传递--使用详解
- 参数传递之指针传递
- 参数传递之指针传递
- 参数传递之指针传递
- 指针参数传递
- 利用指针传递参数
- 指针作为参数传递
- 函数参数传递->指针
- 函数参数传递指针
- STM32-通用定时器基本定时功能
- CSS3背景探讨
- OpenGL ES开发绘制2D图形
- PATbasic1001害死人不偿命的(3n+1)猜想
- Android Service完全解析,关于服务你所需知道的一切
- 双重指针做参数传递
- linux系统上FTP使用
- Softlockup分析
- mysql查询注释信息
- python signal
- 判断字符串中是否有重复字母
- 深入理解React(二) —— 数据流和事件原理
- 超人学院大数据8期
- red5连接MySQL时找不到JDBC驱动