C++指针可能的取值

wandaoyongshi 2011-02-09 09:54:48
c++ primer第四版 4.2.2,被第二种状态(指向某个对象后面的另一对象)搞迷糊了、求大大来帮忙解释一下。
以下是相应章节的中英对照:

Possible Pointer Values
指针可能的取值
A valid pointer has one of three states: It can hold the address of a specific object, it can point one past the end of an object, or it can be zero. A zero-valued pointer points to no object. An uninitialized pointer is invalid until it is assigned a value. The following definitions and assignments are all legal:
一个有效的指针必然是以下三种状态之一:保存一个特定对象的地址;指向某个对象后面的另一对象;或者是0值。若指针保存0值,表明它不指向任何对象。未初始化的指针是无效的,直到给该指针赋值后,才可使用它。下列定义和赋值都是合法的:
int ival = 1024;
int *pi = 0; // pi initialized to address no object
int *pi2 = & ival; // pi2 initialized to address of ival
int *pi3; // ok, but dangerous, pi3 is uninitialized
pi = pi2; // pi and pi2 address the same object, e.g. ival
pi2 = 0; // pi2 now addresses no object
...全文
367 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wandaoyongshi 2011-02-10
  • 打赏
  • 举报
回复
不是我翻译的、引用的是C++PRIMER英文版和中文版的原文,亏我花100大元买了中文特别版、就这翻译质量T_T。
wandaoyongshi 2011-02-10
  • 打赏
  • 举报
回复
明白了,和iterator的end函数差不多。
arong1234 2011-02-09
  • 打赏
  • 举报
回复
同意,我想这个end iterator是不能直接用来访问数据的,只是一个标志[Quote=引用 9 楼 pengzhixi 的回复:]
当然用STL中的end iterator也是另一种很好的解释
[/Quote]
pengzhixi 2011-02-09
  • 打赏
  • 举报
回复
当然用STL中的end iterator也是另一种很好的解释
arong1234 2011-02-09
  • 打赏
  • 举报
回复
个人认为:pass the end of the object是一种可能但是不合法的值,他和0值一样只是表示状态,不再具有指针自己本来的含义,也就是说,你不能用这个指针来访问对象。楼主引用的这段话有误导的意义在里面
欣客 2011-02-09
  • 打赏
  • 举报
回复
for(ptr = start_ptr; ptr <= end_ptr; ptr++) /* do something */

When the loop above breaks, ptr points to one past the end of the array

理解是指向对象的结尾。。(不知最后一个值,而是标志结束)

char arr[100];
> char *pend = &arr[99];
> char *pa = pend+1; //past the end of the object
> char *pb = pend+1;


end of the object //对象的最后
past 越过
past end of the object . //越过对象的最后值。
wandaoyongshi 2011-02-09
  • 打赏
  • 举报
回复
我在别处问,有人说就是链表、也有人认为是末端迭代器的意思、指针本身指向一个无效的位置,但可以用它来做哨兵。
第三个说法是我在一篇博文里看到的解释;
http://blog.csdn.net/hispania/archive/2010/12/20/6087108.aspx
int *pa=0;
int ival=1024;
int *pi=&ival;
pa=pi;
bluesky12312388 2011-02-09
  • 打赏
  • 举报
回复
  class A{};
A a;
A *p = &a;
A *p1 = p + 1;
是否可以这样理解,指向一对象后面的地址。也就是上面的p1,这样可以用来求A的大小。
Binlorima 2011-02-09
  • 打赏
  • 举报
回复
我理解是指针越界...
比如一个数组只有5个长度,但是你指向了第6个位置,就出错了
kongzhitai 2011-02-09
  • 打赏
  • 举报
回复
超出末端吧。
liangcb 2011-02-09
  • 打赏
  • 举报
回复
1:保存一个特定对象的地址,就是一级指针,直接指向某个已分配内存空间的变量
2:指向某个对象后面的另一对象,鄙人理解就是指向指针的指针,他是否有效取决于他指向的那个指针其所指向的变量的内存空间是否已经释放了或者该变量是否有效。
3:0,就是空指针,表明它不指向任何对象,必须指定特定的内存地址给他后才能够使用
xjz19901211 2011-02-09
  • 打赏
  • 举报
回复
**p?呵呵,我也是菜鸟一个

int a = 1;
int *p1 = &a;//p1指向a的地址
int **p2 = &p1;//p2指向p1的地址

*(*p2) == a;

我的理解,如有不对还请指正
pengzhixi 2011-02-09
  • 打赏
  • 举报
回复
我的理解是,指向一个过时的对象。
luo193 2011-02-09
  • 打赏
  • 举报
回复
我感觉9楼和10楼说的是对的。第一种情况It can hold the address of a specific object, 然后是第二种情况it can point one past the end of an object。此处的one就是对应着上一句的address . one 就是address.那么这个地址是怎样的呢,然后修饰one是past the end of an object,所以应该是超过对象末端的地址,比如容器的迭代器就是一指针,可以指向超过容器范围的下一地址,即为end iterator。
hengshan 2011-02-09
  • 打赏
  • 举报
回复
it can point one past the end of an object
兄弟,你这句翻译的有误。
应该翻译成“它也可以指向一个生命周期结束的对象地址”
比如:
int *p = new int;
*p = 3;

delete p;
注意,这个时候p的值并不是0,还是一个内存地址,只不过这时候这个内存地址已经非法了。
这是上面这句话表达一种情况。这也是为什么释放完内存后,指针需要赋值为NULL的原因。
雪人2015 2011-02-09
  • 打赏
  • 举报
回复
楼上这么一说。确实和STL的尾迭代器很像。但是那个对象后面的那个对象这个说法太飘了。

64,282

社区成员

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

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