关于C语言中二级指针的理解
来源:互联网 发布:点播软件哪个好 编辑:程序博客网 时间:2024/05/29 08:59
二级指针早在学校的时候就学习过并且略加研究过,但总觉得就是自己理解的那么一回事吧,而且感觉也确实不是一定要用它。但是今天在研究平衡二叉树的时候发现别人写的代码里面用到了二级指针,自己感觉不是很理解,认为这用一级指针也可以解决啊,事实是不是这样呢?未必,先看一道面试题:
题目是这样的:
代码如下:
#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指向这段空间?
这道题目一看就知道问题出就出在使用了一级指针上了,所以需要用二级指针:
正确的方法应该采用二级指针,程序如下:
代码如下:
#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;
}
这时候看到二级指针的用处了吧?或者上面的面试题用一级指针也行,将函数的返回值改成返回一个指针变量即可。
代码如下:
#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;
}
另外用二级指针还经常用在动态申请二维数组。
代码如下:
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];
}
这样就实现了二维数组的动态申请,因为一般数组声明时,不允许下标是变量,所以如果想动态决定数组各维的大小,最好这样做。
0 0
- 关于C语言中二级指针的理解
- C/C++中二级指针的理解
- C/C++中二级指针的理解
- C/C++中二级指针的理解
- C语言中二级指针的用处
- C语言中二级指针的作用
- 关于二级指针的理解
- C语言的二维数组和二级指针的理解
- C语言中关于const与指针结合的理解
- c语言中二级指针空间的分配
- C语言中,二级指针的三种内存模型
- 关于C语言指针的理解
- C语言中二级指针使用
- C语言二级指针
- C语言二级指针
- C语言 二级指针
- C语言二级指针
- C语言中数组指针的理解
- SQL 已更新或删除的行值要么不能使该行成为唯一行(sqlserver中有多行所有的列重复的数据,无法更新或删除问题)
- iOS中的文件管理操作
- Viewpager和fragment和自定义的底部Tab实现切换效果
- Javascript模块化编程(二):AMD规范
- Linux守护进程
- 关于C语言中二级指针的理解
- js中获取 <%=request.getContextPath()%>
- 清除android程序中的多余资源
- 使用filter2D创建自定义线性滤波器
- JAVA NIO 简介
- 【从头开始写操作系统系列】环境搭建以及第一个Hello World
- 360网盘资料如何存放到隐形云中
- g++的编译及调试
- EL表达式里面fn的用法