C++ 指针到底是什么玩意??

ShineShineRedStar 2010-03-19 11:25:40
哪位给我讲讲指针啊。
就我的理解,指针就是一个逻辑地址值,存储在程序栈中,指向堆中的一个逻辑块。那为什么会有类型的区别,这种区别是怎么实现的啊?
...全文
301 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
henujava 2010-03-20
  • 打赏
  • 举报
回复
对指针也很迷惑,不过不经常用,没管它了,呵呵
xianqingzh 2010-03-20
  • 打赏
  • 举报
回复
寻址方式原来就是寻找数据的方法。比如要除法,被除数在哪里,除数在哪里,商放哪里,余数放哪里,要么在寄存器要么在内存。就这么简单个道理,不如就叫“数据寻找方法”那让人一看就明白,多直观。非要叫个大家都不熟悉的“寻址”。就算叫“寻址”,也完全可以在旁边加以解释,或者写上句:“XXXX寻址方式类似于C语言中的数组。”在C语言指针那一节中加上句:“指针实际反映了CPU的XXXX寻址方式。”
可中国的教材就是这样,好像搞汇编的人和搞C语言的人有仇,大家各自为政,我专门出书讲汇编,可不能便宜了那些搞C语言的,更不能在书里给他们打免费广告。最后的结果就是:寻址是汇编中最难的,指针是C语言中最难的;学汇编不懂寻址,学C语言不懂指针。害的是真正来学习的人。
明白了这个道理,绝影觉得寻址那些东西就不过尔尔,!!!!!!!!!---->什么寄存器寻址,就当寄存器是个指针,里面放地址;什么基址变址,就相当于数组,放个首地址,加几就相当于访问后面几个字节。<----

楼主看这段。就知道指针的本质了


AlanBruce 2010-03-19
  • 打赏
  • 举报
回复
int *p —— 当程序需要取这个指针中的值时,因为是int型指针,就知道要读取4个字节空间
char *p —— 当取这个指针中的值时,因为是char型指针,只要读取1个字节的值就可以了
ShineShineRedStar 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lirg8405 的回复:]

难说的让人明白,多用用,自己理解了才明白,比较抽象
[/Quote]您的意思是只可意会不可言传?嘻嘻。
ShineShineRedStar 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 demon__hunter 的回复:]

指针是c/c++语言中一个重要的语言特性,但对于c/c++的初学者来说,却不是那么好理解。总起来说指针一个特殊的变量,这个变量能合法的使用*操作符对指针的变量内容进行提领(dereference)和成员访问。对于指针变量在它四个字节(32位平台)的内存里存储的数据是一个内存的地址值,也就是我们平时说的指向一个地址,而指针变量的类型则决定着对指针变量的所指向的地址里的数据的访问方式和从指向的地址开……
[/Quote]
这个好,还是第一次知道“提领(dereference)”,谢啦。
ShineShineRedStar 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 shihuaicheng 的回复:]

指针的类别可以在取值时告诉程序,读多大的一块内存,比如,int型指针会读取四个字节的连续内存,而char型的只会读取一个字节的内存。
[/Quote]
应该不会只是内存大小吧,下面的C和D内存大小应该是一样的,它们不能转换啊。
class C{int i; bool b;};
class D{int i; bool b;};
int _tmain(int argc, _TCHAR* argv[])
{
C *c = new C;
C *cc = c;
D *d = c; //error C2440: 'initializing' : cannot convert from 'C *' to 'D *'
}
greatsong 2010-03-19
  • 打赏
  • 举报
回复
int *pi; // pi的类型是(int *), pi指向的类型是(int)
float *pf; // pi的类型是(float *), pi指向的类型是(float)
lirg8405 2010-03-19
  • 打赏
  • 举报
回复
难说的让人明白,多用用,自己理解了才明白,比较抽象
tan870426 2010-03-19
  • 打赏
  • 举报
回复
指针就是指向一个变量,保存变量地址!
就这样!
ShineShineRedStar 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lirg8405 的回复:]

在类别是为了方便数据处理,和其他类型的数据应该是一样的
[/Quote]没听懂。
机智的呆呆 2010-03-19
  • 打赏
  • 举报
回复
指针总结起来有3点:
1 指针的值是一个地址值
2 指针的类型决定着对这个地址值的访问方式和从这个地址值开始访问所涵盖的范围
3 指针类型影响着指针运算的跨度。

了解以上3点,指针算是入门了~~~~
ShineShineRedStar 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 taodm 的回复:]

楼主啊,这个,你还是直接请个家教吧。看起来你用的教材是不适合你的了。
[/Quote]囧,发的第一帖就被bs了。您愿意就请您算了。
机智的呆呆 2010-03-19
  • 打赏
  • 举报
回复
指针是c/c++语言中一个重要的语言特性,但对于c/c++的初学者来说,却不是那么好理解。总起来说指针一个特殊的变量,这个变量能合法的使用*操作符对指针的变量内容进行提领(dereference)和成员访问。对于指针变量在它四个字节(32位平台)的内存里存储的数据是一个内存的地址值,也就是我们平时说的指向一个地址,而指针变量的类型则决定着对指针变量的所指向的地址里的数据的访问方式和从指向的地址开始往下所涵盖的范围。举例来说:

#include<iostream>
using namespace std;

int main()
{
int i[2]={1073741824,-1073741824};
int *p1=&i[0];
char *p2=(char*)&i[0];
float *p3=(float*)&i[0];
printf("%d->%d\n",p1,*p1);
printf("%d->%d\n",p2,*p2);
printf("%d->%f\n",p3,*p3);
p1++;
p2++;
p3++;
printf("%d->%d\n",p1,*p1);
printf("%d->%d\n",p2,*p2);
printf("%d->%f\n",p3,*p3);

system("pause");

}

上述代码中指针变量p1,p2,p3指向相同的地址值,都是i[0]所标识的内存的地址值,但由于指针的类型不同,导致用*运算符进行提领时,*p1,*p2,*p3的值不一样。当p1用*提领p1所指向的内存里的数据时,由于p1是int*型的,所以会从地址值为&i[0]开始,往下涵盖四个字节(sizeof(int))的内存,然后把里面的数据安照int变量的存储方式解析成一个int型数值。1073741824在内存&i[0]~&i[0]+3中存储是0x00,0x00,0x00,0x40,(小段机 补码存储),所以*p1的值是1073741824。而p2是char*型的,所以仅从地址值为&i[0](sizeof(char))的内存把里面的数据按照char变量的存储方式解析成一个char型数值,由于地址值为&[i]的内存里是0x00,所以*p2为0.同样由于p3是 float*型的,所以会从地址值为&i[0]开始,往下涵盖四个字节(sizeof(float))的内存,然后把里面的数据安照float变量的存储方式解析成一个float型数值。由于float型变量的存储方式不同于整型,c/c++浮点数存储遵循ieee标准,按照标准*p3的值为 2.0(具体请参见本博客里一篇关于float内存布局的博文,不再赘述)。另外从上述代码我们可以看到,指针变量的类型还影响着指针变量算术运算时的跨度,即指针变量+1时,指针变量的值会增加sizeof(指针所指向变量的类型)。
嘎文 2010-03-19
  • 打赏
  • 举报
回复
还有在对指针变量做加、减操作时,偏移量要根据类型来定的,比如int型的指针p,p++操作执行后,p本身的值增加的是4
昵称很不好取 2010-03-19
  • 打赏
  • 举报
回复
int *p —— 当程序需要取这个指针中的值时,因为是int型指针,就知道要读取4个字节空间
char *p —— 当取这个指针中的值时,因为是char型指针,只要读取1个字节的值就可以了
嘎文 2010-03-19
  • 打赏
  • 举报
回复
指针的类别可以在取值时告诉程序,读多大的一块内存,比如,int型指针会读取四个字节的连续内存,而char型的只会读取一个字节的内存。
lirg8405 2010-03-19
  • 打赏
  • 举报
回复
在类别是为了方便数据处理,和其他类型的数据应该是一样的
taodm 2010-03-19
  • 打赏
  • 举报
回复
楼主啊,这个,你还是直接请个家教吧。看起来你用的教材是不适合你的了。
shhpoo_827124 2010-03-19
  • 打赏
  • 举报
回复
恩,新手,同样有此困扰
ypb362148418 2010-03-19
  • 打赏
  • 举报
回复
找本好点的教材看看吧
加载更多回复(23)

64,639

社区成员

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

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