社区
C++ 语言
帖子详情
请问,怎么理解指针的指针。请举一个例子。谢谢
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
打赏
举报
回复
地址的地址
指针
的深度
理解
若是要区分这两种概念,首先要明确变量的两个属性:变量有两个属性,
一个
是左值(空间,存放内容的空间),另
一个
则是右值(数据,占具体内存的数据)。那么对于
指针
,既然是地址,那么则可
理解
为右值。但对于
指针
...
C知识点:
指针
函数【本质是
一个
函数,返回值是
一个
指针
;ret *func(args, ...);】、函数
指针
【本质是
一个
指针
,该
指针
的地址指向
一个
函数(指向代码段中函数入口地址的
指针
);用于回调函数】
上例就是
一个
指针
函数的
例子
,其中,就是
一个
指针
函数, 其功能十分简单,是根据传入的参数n,来计算从0到n的所有自然数的和,其结果通过
指针
的形式返回给调用方。本案例中,func_sum2函数的功能与
指针
函数所实现的...
c语言
指针
详解(概念示例)
学习
指针
是学习C语言中最重要的一环, 能否正确
理解
和使用
指针
是我们是否掌握C语言的
一个
标志。同时,
指针
也是C语言中最为困难的一部分,在学习中除了要正确
理解
基本概念,还必须要多编程,上机调试。只要作到...
一个
指针
占几个字节?原理是什么呢?
一个
指针
占几个字节的问题,感觉会C语言的同学都知道。但是在面试过程中,面了几个同学,不是答忘记了,就是两个、四个的瞎蒙。。。 那么,
一个
指针
到底占几个字节呢? 其实,这个问题很简单,稍微上网一搜,你就...
C语言
指针
详解(经典,非常详细)
要了解
指针
,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全
理解
一个
复杂类型,要
理解
复杂类型其实很简单,
一个
类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,...
C++ 语言
65,208
社区成员
250,517
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章