C++编程失乐园

致力于解决论坛的不足,探讨C++的原理

C++随笔 之 指针分析

在C++里面,指针是一种比较麻烦的操作,但是我们又不得不用.因为他给我们编程以很大的灵活性
下面我讲以下指针作为函数参数时的问题
在函数参数中,编译器总是要为函数的每个参数制作临时副本,指针
参数p 的副本是 _p,编译器使 _p = p 。如果函数体内的程序修改了_p 的内容,就导致
参数p 的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p 申请
了新的内存,只是把_p 所指的内存地址改变了,但是p 丝毫未变。
以上是林锐博士在高质量C++编程中的描述
下面我们结合描述给出调试CODE
 Example Code:
void GetMemory(char *p,int num)
{
 p = (char*)malloc(sizeof(char)*num);
// return
}

void main()
{
 char *str = NULL;
 GetMemory(str,100);
 strcpy(str,"Hello World");//出错
}
首先我们先看看asm
004010B8   mov         dword ptr [ebp-4],0
004010BF   push        64h
004010C1   mov         eax,dword ptr [ebp-4]
004010C4   push        eax
004010C5   call        @ILT+50(GetMemory) (00401037)
str 地址:12FF7C
其副本地址:12FF28
在存入参数的时候,同时都指向00 00 00 00
在执行p = (char*)malloc(sizeof(char)*num);之后
12FF28指向的内容变成了20 1C 43 00了.
林锐博士在这边的意思是只用指向指针的指针,这种方法我们在第二种方法种介绍,
下面给出我的一种看法,大家觉得好不好
我的方法:
char *GetMemory(char *p,int num)
{
 p = (char*)malloc(sizeof(char)*num);
 return p;
}

void main()
{
 char *str = NULL;
 str = GetMemory(str,100);
 strcpy(str,"Hello World");
 cout<<str<<endl;
}
可以简化为:
char *GetMemory(int num)
{
 char *p = (char*)malloc(sizeof(char)*num);
 return p;
}

void main()
{
 char *str = NULL;
 str = GetMemory(100);
 strcpy(str,"Hello World");
 cout<<str<<endl;
}

林锐博士的看法:
void GetMemory(char **p,int num)
{
   *p = (char*)malloc(sizeof(char)*num);
}
void main()
{
   char *str = NULL;
   GetMemory(&str,100);
   strcpy(str,"Hello,World");
   cout <<str<<endl;
}



posted on 2006-12-28 10:22 木木头 阅读(187) 评论(0)  编辑 收藏 引用 所属分类: C++特性


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2007年8月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

统计

常用链接

留言簿(3)

随笔分类(29)

搜索

最新随笔

最新评论