读书人

void* *(void*) 值是不是一样区

发布时间: 2013-11-19 22:55:29 作者: rapoo

void* *(void**) 值是否一样,区别。
看到这么一段代码
这段代码这么理解。


void* nvptr = *(void**)_vptr;
if (nvptr != _vptr)
{
.....
}

[解决办法]
检查是不是指向自己
[解决办法]
void* nvptr = *(void**)_vptr;
分解一下


void** p = (void**)_vptr;
二级指针的转换,_vptr保存的是指针的地址
void* nvptr = *p;

*p表示根据指针的地址,去取指针,取到的还是一个地址
[解决办法]
引用:
Quote: 引用:

void* nvptr = *(void**)_vptr;
分解一下


void** p = (void**)_vptr;
二级指针的转换,_vptr保存的是指针的地址
void* nvptr = *p;

*p表示根据指针的地址,去取指针,取到的还是一个地址


但是确实会出现 判断条件成立的时候。 理解不了。


比较的就是两个地址值呢
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

看到这么一段代码
这段代码这么理解。

void* nvptr = *(void**)_vptr;
if (nvptr != _vptr)
{
.....
}

_vptr是一个 (void **)指针,取_vptr指向的内容,这个内容是一个 void *的指针,
if(这个内容和 内容的地址不是一个值)
则....


我没描述清楚。_vptr类型是void*


_vptr 就算是 int * 依然可以这么用 ( *(void **) _vptr)

为什么会有不一样的情况?
答:某个地址 存放了 一个 1001 的值,你取 地址 1001 的内容 1002
你现在比较1001 和 1002 怎么就不可以不一样了
[解决办法]
引用:
看到这么一段代码
这段代码这么理解。

void* nvptr = *(void**)_vptr;
if (nvptr != _vptr)
{
.....
}

void* nvptr = *(void**)_vptr;
1.这是一个赋值语句,左值nvptr是一个指向void型的指针变量,里面存放地址。
2.再看右值,_vptr为一个二级指针变量(可以理解为存放的是一个指针变量的地址,通过它可以找到一级指针变量),然后将其(void **)强转为指向void型的二级指针,然后取引用,即*(void **)_v,将这个二级指针存放的地址赋值给左值。也就是说,nvptr这个指针变量的地址就是_vptr这个二级指针变量里存的内容。即此时*_vptr == nvptr(都是地址)。
3.然后就是下面的if语句了if (nvptr != _vptr)
通过上面的分析,*_vptr == nvptr,代换以下,可知,判断的是
if(*_vptr != vptr),即vptr指向的地址不等于它本身自己的地址,好了,over收工!

掌握一点,指针变量是一个地址,这个地址存放了一个指向另一个地址的数据。

[解决办法]
补充以下,指针变量是一个地址,这个地址存放了一个数据,这个数据可以是地址数据,此时为多级指针,也可以为数据内容,此时为一级指针。不知道说清楚了没有,唉,感觉好罗嗦!
[解决办法]
地址相同不代表类型相同,比如数组a[5][5]中:

a表示整个数组的地址,&a[0],表示第一维(行)的地址,&a[0][0]则表示第一行第一列的地址。但这几个地址都是相同的。但是你用i++之类的语句取下一个地址时就会不一样,比如&a[0]会变成&a[1],&a[0][0]会变成&a[0][1]

这里也是这样,具体是否有相同的地址还要具体判断,但指针类型肯定是不同的。
[解决办法]
把这个指针看作链表,指向自己,表示只有一个空节点的循环链表。
如果看做广义表,指向自己,表示自环。

[解决办法]
_vptr本身是void* 现在强转成void** 然后解引用

等于说是把_vptr所指向地址之后的四个字节 当做void*赋值给nvptr
[解决办法]
void* 指向【不知道是什么类型】的指针。
void** 指向【void*】的指针。
所以 void* 可能是 void**, 所以 void* 的变量可能指向自己所在的地址,当然也可能指向别的地址。

所以当 void* 变量指向自己的地址时, 其值与自己的地址相等, 否则不等


读书人网 >C++

热点推荐