- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直认为,指针自增/自减是这样的操作:
new_ptr=old_ptr+sizeof(type)*count
所以对于 int * 它将是:
old_ptr=0 //int *ptr=0
count=1 //int count=1
new_ptr=old_ptr+sizeof(int)*count = 0+4*1 = 0x0004 //ptr+=count;
并且 void 的大小 = 0,因此使用 += 递增 void_ptr 不应改变它。但我可能错了。另一件事是++ 运算符,它会抛出错误。那么,如果++ 抛出错误,为什么 += 也不会抛出错误呢?示例代码:
#include <stdio.h>
void tell(const char *s,int *i,void *v){
printf("%s: \n int_ptr: %#x\n void_ptr: %#x\n",s,i,v);
}
int main(){
int *int_ptr=0;
void *void_ptr=0;
tell("Before",int_ptr,void_ptr);
int_ptr++; //int_ptr=int_ptr+sizeof(int); = 0x 0004
//void_ptr++; //error: ISO C++ forbids incrementing a pointer of type 'void*'
tell("After ++",int_ptr,void_ptr);
int_ptr+=1; //int_ptr=int_ptr+sizeof(int) = 0x0008
void_ptr+=1;//void_ptr=void_ptr+sizeof(void) WHY DOES THIS WORK AND ++ DOES NOT?! = 0x0001 ?! should be 0x0000, because sizeof void = 0
tell("After +=",int_ptr,void_ptr); //RESULT: void_ptr=0x1, so does that mean, that sizeof void is 1 and it is not 0
return 0;
}
输出:
Before:
int_ptr: 0
void_ptr: 0
After ++:
int_ptr: 0x4
void_ptr: 0
After +=:
int_ptr: 0x8
void_ptr: 0x1
有人能给我解释一下吗?
最佳答案
在 C 和 C++ 中,对 void 指针的运算都是非法的。一些编译器具有允许它的扩展。
在这种情况下,GCC 有一个 pointer arithmetic允许对 void 指针和函数指针进行算术运算的扩展,根据标准,这两者都是非法的。它将两者都视为指向大小为 1 的类型。
基本上,这是一种您应该在新代码中避免的兼容性问题。
为什么++ 运算符会抛出错误,而 += 不会,我不确定。++ 用于使用此扩展在 GCC 中工作。也许是这个版本的 GCC 中的错误,或者是对 C++ 的扩展应用不一致。
关于c++ - void_ptr++ 不起作用,但 void_ptr+= 起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19183434/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!