代码之家  ›  专栏  ›  技术社区  ›  Alexander Rafferty

指向指针的指针和运算符地址如何工作?

  •  6
  • Alexander Rafferty  · 技术社区  · 14 年前

    拿着这段代码:

    int a;
    int *pointer = &a;
    
    int **b = &(&(*pointer));
    

    上面写的可以吗 b 地址: pointer 或不是?

    我问的原因是 *pointer 给出的值 a ,其参考地址为 . 这只是地址吗 或者它也被当作 指针 .

    这有道理吗?我能做什么:

    &(*pointer) = a;
    
    6 回复  |  直到 10 年前
        1
  •  7
  •   zneak    14 年前

    不可以。在C语言中,只能得到指向存储区域的指针(即变量、数组元素或其他指针;它们称为“L值”),而不能指向任何表达式。无法获取指向没有定义存储区的表达式的指针(如加法或函数调用的结果)。然而,应该注意C++将这些规则与引用混淆,但为了清楚起见,我将把它排除在外。

    指针并不神奇:最后,它们只是整数。因此,当你得到一个指针的指针时,就像你得到一个整数的指针一样。它没有更多的影响。

    例如,如果您将指针指向 a 在代码中,您只是在另一个变量中复制这个地址。没有什么能阻止你改变所说的变量:

    int a;
    int* p = &a;
    p = NULL;
    

    做这个,你 将保持不变。你所能改变的一切 是它的价值。它的地址是不可变的。任何其他的事情都意味着 &a = NULL (或任何其他指针值)会起作用,但不会。

        2
  •  3
  •   Brian R. Bondy    14 年前

    int**b=&(&(*指针));

    这不会,也不应该编译。

    只能获取L值的地址。(请参见下面的说明)

    C++ 03 S5.3.1-2:

    一元运算符的结果是 指向其操作数的指针。操作数 应为左值或限定值。 在第一种情况下,如果 表达式是 结果是指向t. 特定对象的地址 __cv t_157;is__指针指向cv t,_157; 具有相同的CV限定符。对于一个 如果成员是 __t__类型的静态构件,类型为 结果是指向t. 成员是的非静态成员 类型T的C类,类型 结果是指向类成员的指针 类型C


    …这是一个…

    另外,您在这里使用的“引用”一词是错误的。&是用于不同事物的符号。其中之一就是声明引用,一元运算符的地址是不相关的。后者不称为引用。


    这有道理吗?我能做什么: &(*pointer) = a;

    变量的地址,因此 &(*pointer) 或等价地 &a 是r值。

    你不能给一个r-avlue分配任何东西。忽略常量之类的东西,你可以考虑R值,它必须出现在右手边。L值有点像左手边,但实际上它意味着它可以存储在存储位置(区别在于常量对象不能出现在左手边,但仍被视为L值)。

        3
  •  1
  •   Greg Hewgill    14 年前

    你不能把某个东西的地址取两次,所以上面的代码可能都不会编译(你试过吗?发生了什么事?).

        4
  •  0
  •   Chubsdad    14 年前

    在你的表达中:

    *ptr是左值 &(*ptr)是右值

    &(&,(*PTR))是一个不正确的表达式,因为您试图获取C++中不允许的rAuto的地址。

    此外,

    &(*指针)=a;

    格式错误,因为lhs表达式的类型为“int*”,其中rhs表达式的类型为“int”。C++不允许将“int”转换为“int *”。

        5
  •  0
  •   casablanca    14 年前

    上面是否将b设置为指针的地址?

    不,不会的。 &(*pointer) 是的地址 a ,它只是一个数字(R值),不能获取R值的地址或分配给R值。所以两者 &(&(*pointer)) &(*pointer) = a 不会编译。

    地址 pointer 仅仅是 &pointer 那又怎样 工作是 int **b = &pointer; .

        6
  •  0
  •   pinichi    14 年前

    1.不,这会导致编译错误 int **b = &(&(*pointer));
    2.将b设置为指针地址: int **b = &pointer;
    三。 &(*pointer) = a; -&不,你不能。 &something 常量不能更改,必须 *pointer = a; pointer = &a;