请问,怎么理解指针的指针。请举一个例子。谢谢

victortao 2004-10-22 07:06:32
本来就糊涂,指针的指针到底有什么用?
...全文
372 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kangshao78 2004-10-26
  • 打赏
  • 举报
回复
void main()
{
int n=0x12345678; // n 是一个整型变量, 地址为0x0012FF7C, 值为0x12345678

int *pn=&n; // pn 被声明为指向整型变量 n 的指针变量
// pn 的值将是变量 n 的地址, 即0x0012FF7C
// 而 pn 这个指针变量的地址为 0x0012FF78.

int **ppn=&pn; // ppn 被声明为指向指针变量 pn 的指针变量, 所以称 ppn 是指针的指针,
// ppn 的值将是指针变量 pn 的地址, 即0x0012FF78.
// 而 ppn 这个指针的指针的自身地址为 0x0012FF74

assert(ppn == &pn); // 一定成功, 说明 ppn 的值是 pn 的地址
assert(pn == &n); // 同理, 也说明 pn 的值是 n 的地址

cout<<hex<<*ppn<<endl; // 将输出变量 n 的地址 - 0x0012ff7c
cout<<"0x"<<hex<<**ppn<<endl; // 将输出变量 n 的值 - 0x12345678
}
wxu2 2004-10-26
  • 打赏
  • 举报
回复
比如你的程序需要同时打开多个文件,假如你希望使用CFile类进行对文件的访问操作,那么同一时刻,你的程序中就必须存在多个CFILE类来操作多个文件,并且文件数量事先无法确定,那么就需要使用指针的指针来动态分配CFILE对象数组。

//建立CFile对象指针数组以及指向该指针数组的首地址的指针:pFile
CFile **pFile=(CFile **) malloc(sizeof(CFile *)*FileTotal);

这条语句的含义如下:
其中sizeof(CFile *)获得CFile对象指针的字节大小,
再将其乘与文件总数FileTotal,即sizeof(CFile *)*FileTotal,获得所要缓冲区字节总数
32位机器任何指针都是4个字节,因此每4个字节储存一个CFile对象指针,之所以用sizeof()宏检测一下,是为了确保程序在不同的机器上都能正确编译。

缓冲区字节大小确定后由malloc进行申请(分配)内存,malloc分配成功内存后返回一个指针,由于该指针指向一个存放CFile指针的内存块首地址,所以该指针就叫做指针的指针,又由于malloc返回的是一个void指针,即通用指针,所以必须对其进行强制转换,因此在malloc之前用(CFile **),请注意这里的两个*,就是代表指针的指针,然后把这个指针赋值给pFile。

内存分配好后最好把所有数组内的指针初始化一下,内存清除函数我忘了,自己查。

可以使用一个索引对指针数组进行访问
long Index;
....
//建立文件对象
pFile[Index]=new CFile;
new CFile建立一个文件对象并返回这个对象的指针,然后储存在pFile数组中,由Index决定数组下标
所以每个数组元素就储存一个指针,每个指针可以指向一个文件对象
而pFlie存放的是这些数组元素首地址,所以叫做指针的指针。

//通过指针数组打开指定的文件
pFile[Index]->Open(FilePath,CFile::modeReadWrite);
....
//关闭文件
pFile[Index]->Close();

...
//使用完后必须释放文件对象以及指针的指针:pFile
释放前检测一下指针是否为NULL,如果是的话就不要Delete了,否则程序会崩溃。
if (pFile[Index])
{
delete pFile[Index];//释放数组中一个文件对象
pFile[Index]=NULL;//删除对象指针
}
//释放内存块
if (pFile)
{
free(pFile);
pFile=NULL;
}

我在这里使用malloc和new 的混用,是因为文件数量会变,所以缓冲区不够的有时候需要重新分配(realloc)
当然也是为了说明如何运用指针的指针

//重新分配内存
FileTotal+=10;
pFile=(CFile **) realloc(pFile,sizeof(CFile *)*FileTotal);

混用的时候注意不要搞错了,
凡是用malloc和realloc分配的内存必须用free释放 ,用new的就用delete

当然如果程序中文件数量可以预计,可以用new来建立文件对象数组,但是也就用不到指针的指针了
CFile *pFile=new CFile[100];
新建文件对象数组,产生的指针是文件对象的数组的首地址,而不是对象指针数组的首地址
也就是说一个数组元素就是对象本身,而不是一个指向一个对象的指针,
pFile[Index].Open(....);//所以直接用点操作符访问对象
...
delete []pFile;

具体怎么用要看你程序的设计框架。

末点水 2004-10-26
  • 打赏
  • 举报
回复
那如何用好指针的指针呢?
dick4610 2004-10-23
  • 打赏
  • 举报
回复
还是不明白,有了一个地址,为什么还要一个地址
----------------------------------------------------------
和寻址方式有关吧
Squall1009 2004-10-23
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

int main()
{
int a =5;
int * p = &a;
int ** pp = &p;
cout << a << endl;
cout << * p << endl;
cout << **pp << endl;
cout << &a << endl;
cout << p << endl;
cout << &p << endl;
cout << pp << endl;
return 0;
}

上面a是一个int型的变量,值为5,p是一个int的指针,p的值是a的地址,
pp是一个指向一个int指针的指针,pp的值是p的地址
carylin 2004-10-23
  • 打赏
  • 举报
回复
主要是用在二维数组上。比如矩阵的应用
gentlelover 2004-10-22
  • 打赏
  • 举报
回复
1、指针的指针其实和指针本质上都一样,在32位平台都是一个32位整数;
2、区别是他们的类型不一样,即编译器把他们当作不一样的类型,赋值时要注意;
3、指针的指针的作用,是为了间接引用数据(这个数据通过访问指针再访问指针得到)。
ftkghost 2004-10-22
  • 打赏
  • 举报
回复
指向指针的指针可以用来处理指针数组

例如
#include<iostream>

char* Names[]={
"Bill",
"Sam",
"Jim",
"Paul",
"Charles",
"Donald",
0 //Null pointer to terminate array.
};

int main()
{
//A pointer to a pointer.
char** nm=Names;
//Display the names.
while(*nm!=0)
std::cout<<*nm++<<std::endl;
system("Pause");
return 0;
}
victortao 2004-10-22
  • 打赏
  • 举报
回复
还是不明白,有了一个地址,为什么还要一个地址
jp1984 2004-10-22
  • 打赏
  • 举报
回复
地址的地址

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧