首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

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

为什么指针还要有类型区分?
根本意义是不是在于指针运算时的偏移?
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_()说的正确.

热点排行