读书人

为什么指针还要有类型区分?解决方案

发布时间: 2012-02-10 21:27:41 作者: rapoo

为什么指针还要有类型区分?
根本意义是不是在于指针运算时的偏移?
type*类型指针会偏移sizeof(type)

既然是这样为什么gcc会允许void*类型指针进行++之类的运算?
void*类型指针在进行++运算时偏移多少呢?

以下这段代码gcc编译通过,但结果不是所期望的

#include <stdio.h>

int
main()
{
int* ip = (int*)calloc(sizeof(int), 9);
int i;
void* vp = ip;

for(i = 0; i < 9; ++i)
{
ip[i] = i;
}

for(i = 0; i < 9; ++i)
{
printf( "%d\n ", *(int*)vp);
++vp;
}

free(ip);
}




[解决办法]
VC8 无法编译过去
[解决办法]
g++编译
error: ISO C++ forbids incrementing a pointer of type `void* '
[解决办法]
int *p;
p++的时候
是不应该知道偏移量
字符形和整形所要移动的大小是不一样的
[解决办法]
void*不能参加加法运算。
[解决办法]
C好像可以的。
[解决办法]
C好像也不行,但是GCC下确实编译通过了。
[解决办法]
vc6.0
error C2036: 'void * ' : unknown size
[解决办法]
类型才能知道怎么解释数据
[解决办法]
gcc可以,不过g++不行。。。
[解决办法]

9---00000000 000000000 00000000 00001001
8---00000000 000000000 00000000 00001000
7---00000000 000000000 00000000 00000111
6---00000000 000000000 00000000 00000110
5---00000000 000000000 00000000 00000101
4---00000000 000000000 00000000 00000100
3---00000000 000000000 00000000 00000011
2---00000000 000000000 00000000 00000010
1---00000000 000000000 00000000 00000001
/|\second
0---00000000 000000000 00000000 00000000
低 /|\ start


开始时指针指向1的右边,所以输出0,使用%d输出时就从指针开始处往右找4个字节输出.
接着,你用vp++,指针往左移一个字节second位置,再输出4个字节.依此类推.
输出
0
16777216
65536
256
1
33554432
131072
512
2
因此你的的vp++改成vp+=sizeof(int)就可以了
再linux中,内存的分配是从低往高处增长的.


[解决办法]
怎么不对行呀,second应该在00000001的最左边
[解决办法]

9---00000000 000000000 00000000 00001001
8---00000000 000000000 00000000 00001000


7---00000000 000000000 00000000 00000111
6---00000000 000000000 00000000 00000110
5---00000000 000000000 00000000 00000101
4---00000000 000000000 00000000 00000100
3---00000000 000000000 00000000 00000011
2---00000000 000000000 00000000 00000010
1---00000000 000000000 00000000 00000001
/|\second
0---00000000 000000000 00000000 00000000
低 /|\ start


开始时指针指向1的右边,所以输出0,使用%d输出时就从指针开始处往右找4个字节输出.
接着,你用vp++,指针往左移一个字节second位置,再输出4个字节.依此类推.
输出
0
16777216
65536
256
1
33554432
131072
512
2
因此你的的vp++改成vp+=sizeof(int)就可以了
再linux中,内存的分配是从低往高处增长的.

[解决办法]
指针的不同类型表明了取内容时不同的方式
void *是百变指针,只记录地址没有访问模式,所有的指针都可以转换成void *,同样void *可以转换成所有指针
[解决办法]
因为要知道指针指向的内容的 单位
类型就是区别指针的单位的, 比如int*的单位是4字节 char*的单位是1字节
[解决办法]
知道指针指向的类型,才能对其进行正确的处理与运算.

int* p,char *p它们都进行p++,那第一个偏移了4个字节,第二个偏移1个字节,所以可见指针类型

是指针运算的基础
[解决办法]
上面两位没看楼主的问题,不过帮助人的热情可嘉。
[解决办法]


1 GNU, 是允使用void * , 它和char *一,指加1

2.ANSI, 是不允使用void *加, 因不能定是慎型

所以, 看你的器了
[解决办法]
偶ANSI比GNU大些, 是它的 ^_^
[解决办法]
void的指针进行++运算肯定是有问题的,不用就是了
[解决办法]
Arthur_()说的正确.

读书人网 >C语言

热点推荐