双指针的两种用法
来源:互联网 发布:sql清除表中所有数据 编辑:程序博客网 时间:2024/05/24 15:41
好久没有用过C/C++的二级指针了,总觉的它就是指针的指针,没什么大不了的,但是今天看到一道面试题,感觉自己对二级指针的理解还是不够深刻。于是,从网上找资料,学习了一番……
题目是这样的:
- #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指向这段空间?
分析:str是一个指针,指向NULL,形参p也是一个指针,初始也指向NULL,在GetMemory函数中,这个指针又指向了新开辟的空间。但是只是形参的指向改变了,实参str仍然指向NULL,并没有改变。因此,程序达不到题目的要求,而且运行时会出现错误,由于str一直指向NULL,执行strcop时,会出现错误,提示某某内存不能写入。
正确的方法应该采用双指针,程序如下:
- #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;
- }
分析:str是一个指针,指向NULL。而调用GetMemory函数时,传递的是str的地址,p是一个二级指针,*p是一个指针。因此,将str的地址赋给临时变量p,则*p就是指针str的值,改变*p的值就相当于改变str的值。因此这种方法能够得到题目要求的效果。另外还有一种方法,采用一级指针,让函数返回一个指针变量,指向新分配的内存,程序如下:
- #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. 另外用二级指针还经常用在动态申请二维数组。
- 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];
- }
这样就实现了二维数组的动态申请,因为一般数组声明时,不允许下标是变量,所以如果想动态决定数组各维的大小,最好这样做。
附:关于指针的一些定义
- 双指针的两种用法
- 双指针的两种用法
- 双指针的两种用法
- 双指针的两种用法
- 二级指针的两种用法
- 双指针的用法
- typedef 的两种用法
- assert 的两种用法
- DBLookupCombox的两种用法
- log4J的两种用法
- WaitableTimer的两种用法
- #include的两种用法
- TabHost的两种用法
- typename 的两种用法
- popToViewController的两种用法
- Notification的两种用法
- TabHost的两种用法
- Continue的两种用法
- 信号量sem_t,互斥锁pthread_mutex_t的使用
- 递归详解
- [AndEngine学习教程] 第6节 模拟手柄控制器
- 渐渐失去了曾经所拥有的,曾经的人,都渐渐离开了
- 英语字母的搞笑故事
- 双指针的两种用法
- android硬件加速
- Android中Toast的用法简介(转)
- 最奇特的编程语言和语句,绝对亮瞎了
- Linux睡眠唤醒机制--Kernel态
- Qt UI布局
- AsyncQueryHandler学习
- hash
- Android中Button的用法