这种情况下指针为什么可以直接常量赋值?
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;
}
不理解呀不理解
[解决办法]
算了
回归正题
这里
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 以上描述的只是某一种可能的实现
[解决办法]
这也是指针的神奇之处, 你还可以通过这样的转换, 改变一个常量的值.
p[1]=3; 编译器在编译这句的时候,就只认为是对于个int类型数组在赋值, 并不知道它原来代表是指针. 因为已经在自动类型转换后, 以前的信息都丢失了.