源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

深入理解双指针的两种用法

  • 时间:2020-10-02 16:28 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:深入理解双指针的两种用法
好久没有用过C/C++的二级指针了,总觉的它就是指针的指针,没什么大不了的,但是今天看到一道面试题,感觉自己对二级指针的理解还是不够深刻。于是,从网上找资料,学习了一番…… [b]题目是这样的: [/b]
[u]复制代码[/u] 代码如下:
#include "stdafx.h" #include <iostream> using namespace std; void GetMemory(char *p, int num) {  p = (char *)malloc(sizeof(char) * num);  //p = new char[num];  //C++当中 } int _tmain(int argc, _TCHAR* argv[]) {          char *str = NULL;  GetMeory(str, 100);  strcpy(str,"Hello");  cout << str << endl;  return 0; }
问:程序能否达到目的:在GetMemory()中为main函数中的开辟空间,并将str指向这段空间? [b]分析:[/b]str是一个指针,指向NULL,形参p也是一个指针,初始也指向NULL,在GetMemory函数中,这个指针又指向了新开辟的空间。但是只是形参的指向改变了,实参str仍然指向NULL,并没有改变。因此,程序达不到题目的要求,而且运行时会出现错误,由于str一直指向NULL,执行strcop时,会出现错误,提示某某内存不能写入。 [b]正确的方法应该采用双指针,程序如下: [/b]
[u]复制代码[/u] 代码如下:
#include "stdafx.h" #include <iostream> using namespace std; void GetMeory(char **p, int num) {  *p = (char *)malloc(sizeof(char) * num);  //*p = new char[num];  //C++当中 } int _tmain(int argc, _TCHAR* argv[]) {  char *str = NULL;  GetMeory(&str, 100);  strcpy(str,"Hello");  cout << str << endl;  return 0; }
[b]分析:[/b]str是一个指针,指向NULL。而调用GetMemory函数时,传递的是str的地址,p是一个二级指针,*p是一个指针。因此,将str的地址赋给临时变量p,则*p就是指针str的值,改变*p的值就相当于改变str的值。因此这种方法能够得到题目要求的效果。另外还有一种方法,采用一级指针,让函数返回一个指针变量,指向新分配的内存,程序如下:
[u]复制代码[/u] 代码如下:
#include "stdafx.h" #include <iostream> using namespace std; char * GetMeory2(char *p, int num) {  p = (char *)malloc(sizeof(char) * num);  //p = new char[num];  //C++当中  return p; } int _tmain(int argc, _TCHAR* argv[]) {  char *str = NULL;  str = GetMeory2(str, 100);  strcpy(str,"Hello");  cout << str << endl;  return 0; }
2. 另外用二级指针还经常用在动态申请二维数组。
[u]复制代码[/u] 代码如下:
void main() { int m , n , **p; scanf("%d%d" , &m , &n); p = (int **)malloc(m * sizeof(int *)) //C++中建议使用:p = new int* [m]; for(i = 0 ; i < m ; i++) p[i] = (int *)malloc(n * sizeof(int)); //C++:p[i] = new int[n]; }
这样就实现了二维数组的动态申请,因为一般数组声明时,不允许下标是变量,所以如果想动态决定数组各维的大小,最好这样做。 [b]附:关于指针的一些定义 [/b] [img]http://files.jb51.net/file_images/article/201305/201305290859422.jpg[/img]
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部