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

 更新时间:2013年05月29日 09:05:21   作者:  
本篇文章是对双指针的两种用法进行了详细的分析介绍,需要的朋友参考下
好久没有用过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];
}

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

附:关于指针的一些定义

相关文章

  • 利用Qt实现仿QQ设置面板功能

    利用Qt实现仿QQ设置面板功能

    这篇文章主要为大家详细介绍了如何利用Qt实现仿QQ设置面板功能,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解一下
    2022-12-12
  • C语言文件操作大全

    C语言文件操作大全

    这篇文章主要介绍了C语言文件操作大全的相关资料,需要的朋友可以参考下
    2018-03-03
  • C++中函数指针详解及代码分享

    C++中函数指针详解及代码分享

    这篇文章主要介绍了C++中函数指针详解及代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • C语言 90后怀旧游戏超级玛丽的实现流程

    C语言 90后怀旧游戏超级玛丽的实现流程

    90后最风靡的游戏是什么?第一个联想到的肯定是插卡游戏机或者VCD加光盘运行在电视机上的超级玛丽了,它的经典绝对可以排在第一位,长大后的我们今天来用C语言重温一下
    2021-11-11
  • C语言实现求最大公约数的三种方法

    C语言实现求最大公约数的三种方法

    最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。本文将为大家介绍三种方法来实现求解两个正整数的最大公约数,需要的可以参考一下
    2021-12-12
  • C++算法与泛型算法(algorithm、numeric)

    C++算法与泛型算法(algorithm、numeric)

    这篇文章主要介绍了C++算法与泛型算法(algorithm、numeric),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • C++中简单读写文本文件的实现方法

    C++中简单读写文本文件的实现方法

    本篇文章是对C++中简单读写文本文件的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++如何解决rand()函数生成的随机数每次都一样的问题

    C++如何解决rand()函数生成的随机数每次都一样的问题

    这篇文章主要介绍了C++如何解决rand()函数生成的随机数每次都一样的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C语言通讯录管理系统完整版

    C语言通讯录管理系统完整版

    这篇文章主要为大家详细介绍了C语言通讯录管理系统的完整版本,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • 关于函数调用方式__stdcall和__cdecl详解

    关于函数调用方式__stdcall和__cdecl详解

    下面小编就为大家带来一篇关于函数调用方式__stdcall和__cdecl详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09

最新评论