c语言双指针,深入理解双指针的两种用法

本文通过一道面试题深入探讨了C/C++中的二级指针。原始代码由于未正确传递指针导致无法达到预期效果,通过使用二级指针或返回指针变量的方式,可以解决这个问题。此外,文章还介绍了二级指针在动态申请二维数组中的应用,展示了如何利用二级指针动态分配内存并实现二维数组的创建。
摘要由CSDN通过智能技术生成

好久没有用过C/C++的二级指针了,总觉的它就是指针的指针,没什么大不了的,但是今天看到一道面试题,感觉自己对二级指针的理解还是不够深刻。于是,从网上找资料,学习了一番……

题目是这样的:

#include "stdafx.h"

#include

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

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

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];

}

这样就实现了二维数组的动态申请,因为一般数组声明时,不允许下标是变量,所以如果想动态决定数组各维的大小,最好这样做。

附:关于指针的一些定义

ed769f898c747e7dda5cb9115a85183d.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值