双指针的两种用法

原创 2015年07月09日 14:57:01

好久没有用过C/C++的二级指针了,总觉的它就是指针的指针,没什么大不了的,但是今天看到一道面试题,感觉自己对二级指针的理解还是不够深刻。于是,从网上找资料,学习了一番……

       题目是这样的:

  1. #include "stdafx.h"  
  2. #include <iostream>  
  3.   
  4. using namespace std;  
  5.   
  6. void GetMemory(char *p, int num)  
  7. {  
  8.     p = (char *)malloc(sizeof(char) * num);  
  9.     //p = new char[num];  //C++当中  
  10. }  
  11.   
  12. int _tmain(int argc, _TCHAR* argv[])  
  13. {  
  14.          char *str = NULL;  
  15.     GetMeory(str, 100);  
  16.     strcpy(str,"Hello");  
  17.     cout << str << endl;  
  18.     return 0;  
  19. }  


        问:程序能否达到目的:在GetMemory()中为main函数中的开辟空间,并将str指向这段空间?

         分析:str是一个指针,指向NULL,形参p也是一个指针,初始也指向NULL,在GetMemory函数中,这个指针又指向了新开辟的空间。但是只是形参的指向改变了,实参str仍然指向NULL,并没有改变。因此,程序达不到题目的要求,而且运行时会出现错误,由于str一直指向NULL,执行strcop时,会出现错误,提示某某内存不能写入。

 

       正确的方法应该采用双指针,程序如下:

 

  1. #include "stdafx.h"  
  2. #include <iostream>  
  3.   
  4. using namespace std;  
  5.   
  6. void GetMeory(char **p, int num)  
  7. {  
  8.     *p = (char *)malloc(sizeof(char) * num);  
  9.     //*p = new char[num];  //C++当中  
  10. }  
  11.   
  12. int _tmain(int argc, _TCHAR* argv[])  
  13. {  
  14.     char *str = NULL;  
  15.     GetMeory(&str, 100);  
  16.     strcpy(str,"Hello");  
  17.     cout << str << endl;  
  18.     return 0;  
  19. }  


         分析:str是一个指针,指向NULL。而调用GetMemory函数时,传递的是str的地址,p是一个二级指针,*p是一个指针。因此,将str的地址赋给临时变量p,则*p就是指针str的值,改变*p的值就相当于改变str的值。因此这种方法能够得到题目要求的效果。另外还有一种方法,采用一级指针,让函数返回一个指针变量,指向新分配的内存,程序如下:

  1. #include "stdafx.h"  
  2. #include <iostream>  
  3.   
  4. using namespace std;  
  5.   
  6. char * GetMeory2(char *p, int num)  
  7. {  
  8.     p = (char *)malloc(sizeof(char) * num);  
  9.     //p = new char[num];  //C++当中  
  10.     return p;  
  11. }  
  12.   
  13. int _tmain(int argc, _TCHAR* argv[])  
  14. {  
  15.     char *str = NULL;  
  16.     str = GetMeory2(str, 100);  
  17.     strcpy(str,"Hello");  
  18.     cout << str << endl;  
  19.     return 0;  
  20. }  

        

      2. 另外用二级指针还经常用在动态申请二维数组。

  1. void main()   
  2. {   
  3. int m , n , **p;   
  4. scanf("%d%d" , &m , &n);   
  5. p = (int **)malloc(m * sizeof(int *))   
  6. //C++中建议使用:p = new int* [m];   
  7. for(i = 0 ; i < m ; i++)   
  8. p[i] = (int *)malloc(n * sizeof(int));   
  9. //C++:p[i] = new int[n];   
  10. }   


 

这样就实现了二维数组的动态申请,因为一般数组声明时,不允许下标是变量,所以如果想动态决定数组各维的大小,最好这样做。

 

附:关于指针的一些定义,参考谭浩强 P177,P191

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

c语言指针用法详解

  • 2016-01-01 15:55
  • 204KB
  • 下载

C语言指针用法详解

  • 2012-11-13 22:05
  • 204KB
  • 下载

<c:set>的两种用法——来源百度百科

编辑 标签是用于保存数据的语法。 中文名 用    于 保存数据 属    性 语法 类    型 数据 目录 1 作用 2 ...

c语言中指针用法总结

  • 2010-09-19 12:23
  • 214KB
  • 下载

两种AIDL用法分析(原)

我们在前面介绍了关于AIDL的两种用法,第一种用法主要用在应用层中(应用层的AIDL调用),第二种用法主要用在framework中(Framework中的AIDL调用)。但是这两种用法中都提到了Stu...

c语言指针用法详解

  • 2014-02-28 17:16
  • 204KB
  • 下载

C语言指针用法深入解析

  • 2010-07-08 19:15
  • 59KB
  • 下载

TabHost的两种用法-Android学习笔记

TabHost的两种用法 在项目实践过程中要用到tabhost控件,与winform中的tabcontrol控件功能类似,但是感觉tabcontrol简单,每个tab页都可以打开页面布局相对简单一些。...

C语言指针用法总结+ 解析

  • 2012-03-03 17:14
  • 738KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)