C语言指针小问题,大家帮忙看下

leecyz 2010-03-02 08:36:05
float f;

int *p;

p = &f;

书上说,一个指针变量只能指向同一类型的变量,
只有整形变量的地址才能放到指向整形变量的指针变量中。
这是错误的。

但c中编译没有错,并不影响结果。如果改为C++后缀是会出现错误。
难道是C语言中一种严谨的写法?
...全文
189 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhenhua0831 2010-04-21
  • 打赏
  • 举报
回复
对于指针问题,我也没有注意过,呵呵,
我一直都是按照书上说的去做的,
,一般就用同类型种类的指针
[Quote=引用 1 楼 leecyz 的回复:]
#include<stdio.h>

main() //编译器不支持吧,,改成void main()
{
int a[] = {2};
int *p;
p=a;

while(*p != 0)
{

p++;
printf("%d\n",*p);
printf("%d\n",p-a);
}

//getch();
}

[/Quote]
1245120 1
4200169 2
1 3
4394624 4
4394432 5
2367460 6
1243068 7
2147323904 8
1 9
6 10
1245076 11
-2141054454 12
1245152 13
4216548 14
4321648 15
0 16
Press any key to continue

这个我也不清楚,嘿嘿……
浪客 2010-03-10
  • 打赏
  • 举报
回复
c++对类型的检查变得更严格
bobo364 2010-03-03
  • 打赏
  • 举报
回复
地址具体看目标机的汇编,目前大多是32位;
Cpp中指针转换提供了专门的函数,编译器增加了检查,是为了降低指针错误使用的机会;

c++对类型的检查变得更严格

你的代码使用的很普遍,没有啥问题

谭的书看来是老了,可能他的书辉煌的时候,或者说他写这书的时候。人们不用你的这样的写法吧
不知名小ITer 2010-03-03
  • 打赏
  • 举报
回复
引用 6 楼 albey_j 的回复:
地址具体看目标机的汇编,目前大多是32位;
Cpp中指针转换提供了专门的函数,编译器增加了检查,是为了降低指针错误使用的机会;

就是这个了...
leemeng0x61 2010-03-03
  • 打赏
  • 举报
回复
大家基本说完了,类型需要强制转换下,指针类型最好保持一致
pxxxd 2010-03-03
  • 打赏
  • 举报
回复
恩,也没注意过这个问题。学习下
leecyz 2010-03-02
  • 打赏
  • 举报
回复

不同类型的指针变量所对应的字节数不同
====================================
9楼说得有问题哦,指针变量只与所处的位数有关,在32位机中就是4个字节。
与所指向的对象类型无关。
icemoist 2010-03-02
  • 打赏
  • 举报
回复
引用楼主 leecyz 的回复:
书上说,一个指针变量只能指向同一类型的变量,
只有整形变量的地址才能放到指向整形变量的指针变量中。
这是错误的。

指针变量记录的是对应变量的存储的起始位置,不同类型的指针变量所对应的字节数不同
musiclee 2010-03-02
  • 打赏
  • 举报
回复
编译器帮你优化了而已
某某9 2010-03-02
  • 打赏
  • 举报
回复
引用 6 楼 albey_j 的回复:
地址具体看目标机的汇编,目前大多是32位;
Cpp中指针转换提供了专门的函数,编译器增加了检查,是为了降低指针错误使用的机会;
Albey_J 2010-03-02
  • 打赏
  • 举报
回复
地址具体看目标机的汇编,目前大多是32位;
Cpp中指针转换提供了专门的函数,编译器增加了检查,是为了降低指针错误使用的机会;
xhjn6 2010-03-02
  • 打赏
  • 举报
回复
c中编译不是没有错是因为你的编译器没报错
当你把p的值输出的时候就会出错
虽然int,float都只占4个字节(不同位的系统有不同)
但存储方式上不一样

可能是你的编译器的问题
我在vc试过没有不报错的
febbird1984 2010-03-02
  • 打赏
  • 举报
回复
引用楼主 leecyz 的回复:
float f;

int  *p;

p = &f;

书上说,一个指针变量只能指向同一类型的变量,
只有整形变量的地址才能放到指向整形变量的指针变量中。
这是错误的。

但c中编译没有错,并不影响结果。如果改为C++后缀是会出现错误。
难道是C语言中一种严谨的写法?

这么写是不安全的

float f;
int *p;
p = (int*)&f;//这么写语法上是安全的,语义上意义也很明显:就是想把float*转换成int*

内存中的同样的数据,按照不同的类型来解释,得出的结果可能是不同的

/*VS2008*/
int a=0x00000150;//某4个连续的字节中,存放的数据分别是0x00,0x00,0x01,0x50,组合起来就是0x00000150;
int *pa=&a;
char *pb=(char*)&a;
cout<<*pa<<endl//将这4个字节的数据按照int来解释,因为这里的int有4个字节,所以会将4个字节的内容组合起来合成一个int数据,结果是336
<<*pb<<endl;//将这4个字节的数据按照char来解释,因为char只有1个字节,所以这里取最后一个字节的数据来作为*pb的内容,也就是0x50,也就是字母P
return 0;
leecyz 2010-03-02
  • 打赏
  • 举报
回复
引用 2 楼 programmingisstory 的回复:
引用楼主 leecyz 的回复:float f; int  *p; p = &f; 书上说,一个指针变量只能指向同一类型的变量, 只有整形变量的地址才能放到指向整形变量的指针变量中。 这是错误的。 但c中编译没有错,并不影响结果。如果改为C++后缀是会出现错误。 难道是C语言中一种严谨的写法?

在有的编译器中会告警,有的会报成错误。
因为类型不匹配
一个是int*,一个float*


我用的老版本的vc++6.0和WIN-TC都没报错,不知道VS2008会不会。
ThinkInAI 2010-03-02
  • 打赏
  • 举报
回复
引用楼主 leecyz 的回复:
float f;

int  *p;

p = &f;

书上说,一个指针变量只能指向同一类型的变量,
只有整形变量的地址才能放到指向整形变量的指针变量中。
这是错误的。

但c中编译没有错,并不影响结果。如果改为C++后缀是会出现错误。
难道是C语言中一种严谨的写法?


在有的编译器中会告警,有的会报成错误。
因为类型不匹配
一个是int*,一个float*
leecyz 2010-03-02
  • 打赏
  • 举报
回复
#include<stdio.h>

main()
{
int a[] = {2};
int *p;
p=a;

while(*p != 0)
{

p++;
printf("%d\n",p-a);
}

getch();
}

谁知道怎么解得也说下。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧