C中void指针的指针运算

By simon at 2018-02-28 • 0人收藏 • 35人看过

当指向特定类型的指针(例如int,char, float,..)递增,其值增加那大小 数据类型。如果一个void指针指向数据的大小 x递增,它是如何得到的指向x字节 先?编译器如何知道将x添加到的值 指针?

6 个回复 | 最后更新于 2018-02-28
2018-02-28   #1

void*指针不允许指针运算。

2018-02-28   #2

正因为如此,你不能在void *类型上做指针算术!

2018-02-28   #3

将其转换为char指针,将指针向前增加x个字节。

2018-02-28   #4

在做指针之前,你必须将它转换为另一种类型的指针 算术。

2018-02-28   #5

最终结论:在C和C中,void*上的算术是非法 C ++。 GCC允许它作为扩展,参见[Arithmetic on void-和Function- 指针(http://gcc.gnu.org/onlinedocs/gcc-4.8.0/gcc/Pointer-Arith.html) (注意这一节是手册“C扩展”一章的一部分)。 Clang和ICC可能允许void*算术用于 合作与GCC兼容。其他编译器(如MSVC)禁止运算 void*,如果999999999 GCC不允许9534标志被指定,或 如果void8标志被指定(如果你的代码库是这个标志是有用的 还必须编译MSVC)。

C标准讲话

行情摘自n1256草案。 标准对添加操作统计的描述ES:

6.5.6-2:另外,两个操作数都应该有算术类型,或者 一个操作数应该是一个指向对象类型的指针e和另一个应该有 整数类型。 所以,这里的问题是void*是否是一个指向“对象”的指针 键入“,或equ无论如何,void是否是“对象类型”。该 “对象类型”的定义是: 6.2.5.1:类型是分区into object types(完全类型 描述对象),function types(描述函数的类型)和 不完全类型(描述对象的类型,但缺乏需要的信息 确定它们的大小)。 该标准将void定义为:> 6.2.5-19:void类型包含一组空值;它是 不完整的不完整类型。 以来void是一个不完整的类型,它不是一个对象类型。 因此它不是加法操作的有效操作数。 Ť因此,您不能在void指针上执行指针运算。

注释

最初,它被认为是void*算术被允许, 由于C标准的这些部分:

6.2.5-27:指向void的指针应该有相同的r表示和 对齐要求作为指向字符类型的指针。 然而, 相同​​的表示和对齐要求旨在暗示 互换性作为函数的参数,函数的返回值, 和uni的成员附件。 所以这意味着printf("%s", x)与x具有相同的含义 有char*或void*,bu这并不意味着你可以 在void*上做算术运算。 编者按:此答案已被编辑以反映最后 结论。

2018-02-28   #6

空指针可以指向任何内存块。因此编译器不知道 当我们参加时增加/减少多少字节mpt指针运算 void指针。因此,void指针必须首先转换为已知类型 在他们可以invo之前在任何指针算术中。

void *p = malloc(sizeof(char)*10);
p++; //compiler does how many where to pint the pointer after this increment operation

char * c = (char *)p;
c++;  // compiler will increment the c by 1, since size of char is 1 byte.

登录后方可回帖

Loading...