双指针的两种用法

原创 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

双指针的两种用法

转载于http://blog.csdn.net/yushuai007008/article/details/7653935#comments,转载请注明。 题目是这样的: #inclu...
  • zhoujunlintianxia
  • zhoujunlintianxia
  • 2015年02月06日 10:03
  • 322

双指针的两种用法

http://blog.csdn.net/yushuai007008/article/details/7653935     好久没有用过C/C++的二级指针了,总觉的它就是指针的指...
  • Fybon
  • Fybon
  • 2015年07月24日 10:16
  • 459

C语言双指针的常见用法

鉴于工作经验有限,目前遇到的双指针的用法有如下几种情况,后续工作中如发现有其他的用法,会更新上去。 1、用作函数的返回值,比较常见的是返回分配的堆内存地址。 2、用于申请动态一维数组,只是这个一维数组...
  • CeeLo_Atom
  • CeeLo_Atom
  • 2015年10月30日 10:19
  • 4700

如何使用双重指针

双重指针的使用 单重指针已经够蛋疼了,c语言中还引入了双重指针,甚至若干重指针。使得这个情况变得更加复杂。虽然以前一直觉得双重指针也不过如此,指针的指针嘛,还不是照样理解,但是上一次重删代码...
  • a18852867035
  • a18852867035
  • 2016年03月28日 10:12
  • 2102

C中双重指针的使用的易错点

写blog之前,看了很多CSDN的文章,都表示坚持写blog对一个程序员来说是很好的习惯,我以前也觉得写blog也只是浪费时间和精力,觉得自己弄懂了就好,然而事实上过一段时间后碰到相同的问题却还是需要...
  • in_aday
  • in_aday
  • 2015年07月23日 10:38
  • 1828

深入理解双指针

转载:http://blog.csdn.net/feiyinzilgd/archive/2010/02/09/5302369.aspx 对于C语言的参数传递都是值传递,当传传递一个指针给函数...
  • h_wlyfw
  • h_wlyfw
  • 2014年03月12日 10:32
  • 1099

算法入门:双指针法

一、双指针法【例子1】 :求一个有序数组中和=8的下标。=====================================设置两个不同的指针 ,或者头,或者尾。在一个递增的序列中,。根据结果分...
  • qq_29475553
  • qq_29475553
  • 2016年09月08日 10:22
  • 624

数组双指针法汇总

指针移动方向:相向夹逼,同向移动 维护的是一个区间还是只是关心指针指向的两个元素 同向移动的、维护一个区间的双指针法即滑动窗口法, 2Sum 两头往中间夹逼的双指针法。指针为什么可以不回退?即为什么可...
  • binling
  • binling
  • 2014年12月14日 17:12
  • 692

【VS开发】【C/C++开发】传递双重指针申请内存,典型用法

传递双重指针申请内存,典型用法 指针参数是如何传递内存的? 如果函数的参数是一个指针,不要指望用该指针去申请动态内存。如下示例中,Test函数的语句GetMemory(str, 1...
  • LG1259156776
  • LG1259156776
  • 2016年10月26日 16:51
  • 520

LeetCode 之K-Sum 问题(个人理解) 双指针大法(总结)

做过leetcode的人都知道, 里面有2sum, 3sum(closest), 4sum等问题, 这些也是面试里面经典的问题, 考察是否能够合理利用排序这个性质, 一步一步得到高效的算法. 经过总结...
  • liutianshx2012
  • liutianshx2012
  • 2015年06月17日 10:29
  • 735
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:双指针的两种用法
举报原因:
原因补充:

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