Chinaunix首页 | 论坛 | 博客
  • 博客访问: 848623
  • 博文数量: 143
  • 博客积分: 455
  • 博客等级: 一等列兵
  • 技术积分: 861
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-03 00:11
文章分类

全部博文(143)

文章存档

2018年(10)

2017年(6)

2016年(28)

2015年(14)

2014年(67)

2013年(1)

2012年(17)

我的朋友

分类: Android平台

2016-03-23 23:39:00

好久没有用过C/C++的二级指针了,总觉的它就是指针的指针,没什么大不了的,但是今天看到一道面试题,感觉自己对二级指针的理解还是不够深刻。于是,从网上找资料,学习了一番……
题目是这样的:
  1. #include "stdafx.h"
  2. #include <iostream>
  3. using namespace std;
  4. void GetMemory(char *p, int num)
  5. {
  6.  p = (char *)malloc(sizeof(char) * num);
  7.  //p = new char[num];  //C++当中
  8. }
  9. int _tmain(int argc, _TCHAR* argv[])
  10. {
  11.          char *str = NULL;
  12.  GetMeory(str, 100);
  13.  strcpy(str,"Hello");
  14.  cout << str << endl;
  15.  return 0;
  16. }
问:程序能否达到目的:在GetMemory()中为main函数中的开辟空间,并将str指向这段空间?
分析:str是一个指针,指向NULL,形参p也是一个指针,初始也指向NULL,在GetMemory函数中,这个指针又指向了新开辟的空间。但是只是形参的指向改变了,实参str仍然指向NULL,并没有改变。因此,程序达不到题目的要求,而且运行时会出现错误,由于str一直指向NULL,执行strcop时,会出现错误,提示某某内存不能写入。

正确的方法应该采用双指针,程序如下:
  1. #include "stdafx.h"
  2. #include <iostream>
  3. using namespace std;
  4. void GetMeory(char **p, int num)
  5. {
  6.  *p = (char *)malloc(sizeof(char) * num);
  7.  //*p = new char[num];  //C++当中
  8. }
  9. int _tmain(int argc, _TCHAR* argv[])
  10. {
  11.  char *str = NULL;
  12.  GetMeory(&str, 100);
  13.  strcpy(str,"Hello");
  14.  cout << str << endl;
  15.  return 0;
  16. }

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

  1. #include "stdafx.h"
  2. #include <iostream>
  3. using namespace std;
  4. char * GetMeory2(char *p, int num)
  5. {
  6.  p = (char *)malloc(sizeof(char) * num);
  7.  //p = new char[num];  //C++当中
  8.  return p;
  9. }
  10. int _tmain(int argc, _TCHAR* argv[])
  11. {
  12.  char *str = NULL;
  13.  str = GetMeory2(str, 100);
  14.  strcpy(str,"Hello");
  15.  cout << str << endl;
  16.  return 0;
  17. }
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. }
这样就实现了二维数组的动态申请,因为一般数组声明时,不允许下标是变量,所以如果想动态决定数组各维的大小,最好这样做。

附:关于指针的一些定义




阅读(1067) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~