为什么指针还要有类型区分?解决方案
为什么指针还要有类型区分?
根本意义是不是在于指针运算时的偏移?
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
根本意义是不是在于指针运算时的偏移?
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