Sum*_*eke 7 c pointers variable-assignment
我有一个指针和一个变量:
int *a;
int b;
Run Code Online (Sandbox Code Playgroud)
作业之间是否有任何区别
a = &b;
Run Code Online (Sandbox Code Playgroud)
和
*a = &b;
Run Code Online (Sandbox Code Playgroud)
他们叫什么(像指针声明或什么)?
Sou*_*osh 19
类型很重要.
如果是a=&b,则分配有效.您将整数(类型:)的地址分配int *给另一个类型的变量int *,因此这是合法的.
在*a=&b这种情况下,这是一个约束违规(对于分配操作符,请参见章节§6.5.16.1/ p1,约束,对于简单赋值),因此不是有效的 C语法,因此不需要由任何符合的编译器编译.为了使一个有效的C语法,我们需要执行一个类型转换,像
*a= (int) &b;
Run Code Online (Sandbox Code Playgroud)
会使它成为符合所需约束的语法上有效的 C语句.
甚至,在那之后,结果是实现定义的.#note在这里,您基本上试图将整数(type :)的地址分配int *给另一个类型的变量int(*a类型int).从指针到整数的转换是实现定义的行为.
引用C11,章节§6.3.2.3,指针
任何指针类型都可以转换为整数类型.除非先前指定,否则结果是实现定义的.如果结果无法以整数类型表示,则行为未定义.[....]
[....]他们叫什么?
它们都是赋值语句.
注意:
考虑a指向有效的内存位置.然而,解除无效指针的无效指针会调用未定义的行为.
注意左侧和右侧的类型=.
&b是int *,a也int *不过*a是int.
这有点令人困惑,*有不同的含义:
int *a;- 这*意味着a它将是一个指针;
*a = ...;- 这*意味着我们不会更改存储在地址中的地址,a而是更改位于地址的值.
因此,a = &b意思是"写的地址b来a",
但*a = &b意味着"写的地址b到*a,即,其被存储在地址a".
我们建议我们有这种情况:
Address Value
a 0x0001 0x0004
b 0x0002 70
0x0003 80
0x0004 90
Run Code Online (Sandbox Code Playgroud)
目前a是0x0004和*a是90.
如果你这样做a = &b,a会0x0002和*a会70.
但是,如果你这样做*a = &b,一个不会改变,但是*a,即地址的价值0x0004将变为0x0002.