这种情况下指针为什么可以直接常量赋值?

晒月亮的幽灵 2013-09-17 11:13:19

struct S
{
int i;
int *p;
};
int main()
{
S s;
int *p=&s.i;
p[0]=4;//我的理解是 p[0]就是s.i,p[1]就是s.p
p[1]=3;//这里就是给s.p直接赋值了!!s.p是0x00000003

return 0;
}

不理解呀不理解
...全文
474 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
青蛙工作室 2013-09-18
  • 打赏
  • 举报
回复
因为p[1]越界了,所以编译器报错。
赵4老师 2013-09-17
  • 打赏
  • 举报
回复
引用 18 楼 max_min_ 的回复:
[quote=引用 17 楼 zhao4zhong1 的回复:] 不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!
ps:好久不见呢!甚是挂念啊! 楼主看看 c和指针![/quote] 挂念是这个表情吗?
max_min_ 2013-09-17
  • 打赏
  • 举报
回复
引用 17 楼 zhao4zhong1 的回复:
不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!
ps:好久不见呢!甚是挂念啊! 楼主看看 c和指针!
赵4老师 2013-09-17
  • 打赏
  • 举报
回复
不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!
xiaohuh421 2013-09-17
  • 打赏
  • 举报
回复
这也是指针的神奇之处, 你还可以通过这样的转换, 改变一个常量的值. p[1]=3; 编译器在编译这句的时候,就只认为是对于个int类型数组在赋值, 并不知道它原来代表是指针. 因为已经在自动类型转换后, 以前的信息都丢失了.
神农氏 2013-09-17
  • 打赏
  • 举报
回复
http://www.douban.com/group/topic/30597081/
lin5161678 2013-09-17
  • 打赏
  • 举报
回复
算了 回归正题 这里 p[1]=3;//这里就是给s.p直接赋值了!!s.p是0x00000003 p的数据类型是 int* 那么 p[]的数据类型就毫无疑问的是一个int 给一个int 赋值为3 当然是完全没有问题的 这段代码雷同于 *(int*)&s.p = 3; 这么说明白吗?? /////////////////////////////////////////////// 现在另外说说这代码的错误 说到结构体 常常会提到1个说法 内存对齐[需要清楚明白的内存对齐绝不仅仅出现在结构体] 这里没有明确各种数据类型的大小 还有按照多少字节做内存对齐 实现上 完全可以是 int 4字节 int* 8字节 内存对齐 8字节 那么 这个结构体的内存布局 可能就是 int 4字节 填充字节 4字节 int* 8字节 这里做 p[1]=3 把填充字节设置为3 指针s.p 什么事都没发生 未必就是你预期把指针设置为3 PS 以上描述的只是某一种可能的实现
神农氏 2013-09-17
  • 打赏
  • 举报
回复
要求加转换是编译器对你的代码检查更严格了。不是说不能把常数付给指针。
晒月亮的幽灵 2013-09-17
  • 打赏
  • 举报
回复
引用 10 楼 mmns 的回复:
加个强制转换的目的:告诉编译器你知道自己在做什么。
int*p=2 在VC6.0下编译失败 我不知道还有什么编译器能通过了
晒月亮的幽灵 2013-09-17
  • 打赏
  • 举报
回复
引用 9 楼 mmns 的回复:
[quote=引用 4 楼 snb10086 的回复:] [quote=引用 3 楼 mmns 的回复:] 这么用对于编译器来说没啥错,关键你自己知道你在做啥就行。
指针直接用常量赋值在C语言中是不合法的 跟编译器一点关系都没有[/quote] 哥哥,这个真是合法的。C++也一样。只需要加个强制转换; 比如:int*p = (int*)2;[/quote] 我知道加强制转换没问题 问题就是没加强制转换
神农氏 2013-09-17
  • 打赏
  • 举报
回复
加个强制转换的目的:告诉编译器你知道自己在做什么。
神农氏 2013-09-17
  • 打赏
  • 举报
回复
引用 4 楼 snb10086 的回复:
[quote=引用 3 楼 mmns 的回复:] 这么用对于编译器来说没啥错,关键你自己知道你在做啥就行。
指针直接用常量赋值在C语言中是不合法的 跟编译器一点关系都没有[/quote] 哥哥,这个真是合法的。C++也一样。只需要加个强制转换; 比如:int*p = (int*)2;
晒月亮的幽灵 2013-09-17
  • 打赏
  • 举报
回复
引用 6 楼 lin5161678 的回复:
[quote=引用 4 楼 snb10086 的回复:] 指针直接用常量赋值在C语言中是不合法的 跟编译器一点关系都没有
不了解的情况不要随便下定语哦 C允许 把一个整数转换为任意类型的指针 同时允许吧任何类型的指针转换为一个整数 [/quote]我的源程序 定义结构体对象的时候 没有加关键字struct 所有应该是C++代码 在VS2008下 int*p=2;就是错的
晒月亮的幽灵 2013-09-17
  • 打赏
  • 举报
回复
引用 6 楼 lin5161678 的回复:
[quote=引用 4 楼 snb10086 的回复:] 指针直接用常量赋值在C语言中是不合法的 跟编译器一点关系都没有
不了解的情况不要随便下定语哦 C允许 把一个整数转换为任意类型的指针 同时允许吧任何类型的指针转换为一个整数 [/quote]好吧 即便是C允许 C++中允许吗?
lin5161678 2013-09-17
  • 打赏
  • 举报
回复
引用 4 楼 snb10086 的回复:
指针直接用常量赋值在C语言中是不合法的 跟编译器一点关系都没有
不了解的情况不要随便下定语哦 C允许 把一个整数转换为任意类型的指针 同时允许吧任何类型的指针转换为一个整数
lin5161678 2013-09-17
  • 打赏
  • 举报
回复
引用 2 楼 snb10086 的回复:
int*p=2;
绝对是错的
你弄错了 int* p = 2; 在C语言里面是绝对可以 安全的做法 当然 你这样做之后 一般是不可以做 * 或 [] 操作的 但是对于赋值[或者初始化] 来说 一丁点问题都没有
晒月亮的幽灵 2013-09-17
  • 打赏
  • 举报
回复
引用 3 楼 mmns 的回复:
这么用对于编译器来说没啥错,关键你自己知道你在做啥就行。
指针直接用常量赋值在C语言中是不合法的 跟编译器一点关系都没有
神农氏 2013-09-17
  • 打赏
  • 举报
回复
这么用对于编译器来说没啥错,关键你自己知道你在做啥就行。
晒月亮的幽灵 2013-09-17
  • 打赏
  • 举报
回复
引用 1 楼 lin5161678 的回复:
为什么不能??
int*p=2;
绝对是错的
lin5161678 2013-09-17
  • 打赏
  • 举报
回复
为什么不能??
加载更多回复(5)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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