简单C指针澄清

简单C指针澄清,c,pointers,C,Pointers,我刚开始使用C语言中的指针,我对一些简单的东西很感兴趣。我想确保我理解正确 假设我有这样的东西: int*buff 从我读到的 *buff指的是buff当前指向的值 &buff指的是地址 但我坚持的是: “buff”指的是什么?它是否指内存中&buff的位置,该位置指向值*buff的位置 非常感谢三, -jtsan您是正确的,*buff指的是buff指向的位置,而&buff指的是buff本身的地址。buff指向(*)的数据的地址(&)是*&buff,或者更常见的是buff 祝你好运。指针是相当棘

我刚开始使用C语言中的指针,我对一些简单的东西很感兴趣。我想确保我理解正确

假设我有这样的东西:

int*buff

从我读到的

*buff指的是buff当前指向的值

&buff指的是地址

但我坚持的是:

“buff”指的是什么?它是否指内存中&buff的位置,该位置指向值*buff的位置

非常感谢三,


-jtsan

您是正确的,
*buff
指的是buff
指向的位置,而
&buff
指的是buff本身的地址。
buff
指向(
*
)的数据的地址(
&
)是
*&buff
,或者更常见的是
buff

祝你好运。指针是相当棘手的,但你看起来好像在正确的轨道上

*buff指的是buff当前指向的值

&buff指的是地址

。如果你想的和我想的一样,至少不会
&buff
不是指它当前指向的地址,
&buff
是指
buff
本身所在的内存地址

“buff”指的是什么

buff
指您认为的
&buff
是什么,即
buff
指向的地址。指针的值是指针指向的地址

以下是一些帮助您解决问题的示例:

  • int*buff--声明指针
    到int,而当前没有
    指向任何地方
  • intfoo;buff=&foo--将buff指向
    富的地址
  • *buff=5--更改
    buff指向的内容(foo)到5
  • int**buff\u ptr=&buff--声明
    指向int的指针
    并指向
    浅黄色

  • 鉴于声明:

    int value = 13;
    int *buff = &value;
    
    你说得对:

    *buff == 13
    
    因为
    buff
    指向
    value
    并且包含13

    您可能误解了
    &buff
    所指的内容;它是变量
    buff
    的地址,因此
    &buff
    的类型是
    int**
    ,一个指向整数指针的指针。相反,
    &value
    是变量
    value
    的地址;它的类型为
    int*
    (因此初始化不需要任何强制转换-它的类型正确,可以存储在
    buff

    普通
    buff
    是一个
    int*
    或指向整数的指针。它包含变量

    的地址。buff被声明为“指向int的指针”。使用*buff就像说“buff指向什么”,即int值。使用&buff就像说“buff的地址”,这是指向int(另一个间接层次)的指针的地址。

    int*
    意味着“指向int的指针”。因此,在这里,
    buff
    是指向int的指针。为了使事情更简单,我们还可以说:

    int x = 5; 
    int *buff = &x;
    
    x
    ,一个整数,被设置为5。
    &x
    表示“x的地址”。因此
    buff
    包含
    x
    的地址。为了便于讨论,假设
    x
    存储在内存地址0x1000处。所以
    buff
    本身也是一个数字:0x1000

    *buff
    表示“buff指向的对象”,在本例中为5

    &buff
    表示“buff地址”:数字
    buff
    本身存储在内存中的地址

    我想和大家分享一个我刚开始学习指针如何工作的一般技巧

    拿一大张图表纸,纵向地放在你面前的桌子上。这是你电脑的内存。每个框代表一个字节。选择一行,并将数字“100”放在最左侧框的下方。这是内存的“最低地址”。(我选择100作为不是0的任意数字,您可以选择另一个。)按从左到右的升序为方框编号

    +---+---+---+---+---+-- | | | | | | ... +---+---+---+---+---+-- 100 101 102 103 104 ... a a b +---+---+---+---+---+-- | 0 | 0 | 0 | 5 | 2 | ... +---+---+---+---+---+-- 100 101 102 103 104 ...
    一元
    *
    &
    运算符是彼此相反的。对于所有
    x
    *(&x)=x
    总是正确的,对于所有有效指针
    x
    &(*x)==x
    总是正确的(如果
    x
    不是指针,则
    *x
    没有任何意义,是语法错误;如果
    x
    是无效指针,则
    *x
    在语法上有效,但在运行时会导致未定义的行为).你能试着用更多的单词和更少的符号来表达你想说的吗?你是在暗示
    *
    &
    相互否定吗?我担心当前的答案会让人困惑。谢谢你,这非常有帮助。:]
    int  a = 5;
    int *b = &a;
    
    a b +---+---+---+---+---+-- | 5 | |100| | | ... +---+---+---+---+---+-- 100 101 102 103 104 ...
    int a = 5;
    char b = 2;
    
    a a a a b +---+---+---+---+---+-- | 0 | 0 | 0 | 5 | 2 | ... +---+---+---+---+---+-- 100 101 102 103 104 ...