a =&b vs*a =&b - 指针赋值

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指向有效的内存位置.然而,解除无效指针的无效指针会调用未定义的行为.

  • @SunQingyao - 你错了.如果标准使用实现定义的结果定义值更改,则除了值更改之外,它不会给予实现余地来执行任何操作.就像我说的,UB对实现的严格程度要低得多. (2认同)

Pav*_*vel 7

注意左侧和右侧的类型=.

&bint *,aint *不过*aint.


这有点令人困惑,*有不同的含义:

int *a;- 这*意味着a它将是一个指针;

*a = ...;- 这*意味着我们不会更改存储在地址中的地址,a而是更改位于地址的值.


因此,a = &b意思是"写的地址ba",

*a = &b意味着"写的地址b*a,即,其被存储在地址a".


我们建议我们有这种情况:

   Address  Value
 a 0x0001   0x0004
 b 0x0002   70
   0x0003   80
   0x0004   90
Run Code Online (Sandbox Code Playgroud)

目前a0x0004*a90.

如果你这样做a = &b,a0x0002*a70.

但是,如果你这样做*a = &b,一个不会改变,但是*a,即地址的价值0x0004将变为0x0002.