gpt4 book ai didi

c - 需要帮助澄清 C 中的一些内存引用/指针

转载 作者:行者123 更新时间:2023-11-30 21:44:02 25 4
gpt4 key购买 nike

你能解释一下它们之间的区别吗

  1. &var -> a[var -> count]

var -> a[var -> count]
  • p = &x[i]

    p = a[i]

    &p = &a[i]`
  • 我们可以执行以下操作吗

    var -> *mem

  • *var -> mem

    *var -> mem

    *(*var) -> mem

    var -> *(mem) = 2;

    上面的例子是什么意思?

    最佳答案

    让我们看看我是否可以尝试一下。首先,我建议使用一个简单的免费 C 编译器来尝试这些示例。大多数示例都可以通过这种方式进行测试。

      1.   var -> a[var -> count]     vs   &var -> a[var -> count]

    请注意“var”是指向数据结构的指针。我们可以假设该结构至少有两个元素:一个“a”数组和一个值“count”。考虑到这一点,“var->a[var->count]”表示 var 指向的结构中“a”数组的“count”(加 1)元素的 VALUE。我说“计数”(+1) 值是因为数组的第一个元素是 [0],如您所知。术语“&var->a[var->count]”表示 var 指向的结构中“a”数组的“count”(加 1)元素的地址。

      2.  p = &x[i]

    这将 p 设置为“x”数组的第 i 个值的地址。 '&varname' 应解释为(varname 的地址)。

          p = a[i]   

    此处“p”设置为“a”数组的第 i 个值的 VALUE。

          &p = &a[i]` 

    这不起作用。首先,反勾号没有任何意义。此外,尝试将预定义变量“p”的地址设置为新值。 'p' 本身是一个可以保存许多不同值的变量,但 p 的地址不是变量。如果你是想知道,该表达式应该读作“p 的地址等于 a[i] 的地址”。

      3.   var->*mem     

    看起来非常错误。我想说这是一次尝试……

           *var->mem      

    这是“var->mem”指向的某个变量的值。在本例中,“var”是指向结构的指针,其中包含指针“mem”。在代码中它可能看起来像这样:

                   int j;

    struct example
    {
    int *mem; // mem is an integer pointer.
    } x;

    struct example *var;

    j = 3; // some value.

    x.mem = &j; // mem is set to point to j mem=ADDRESS of j;

    var = &x; // var is pointing to the structure 'x'

    printf("%d\n",*var->mem); // should print "3"

    下一个示例与第一个示例存在相同的错误。

           var -> *(mem) = 2;  

    括号对你没有任何作用。祝你编译顺利。也就是说,没有什么可以阻止您这样做:

           *var->mem = 2;

    但在上面的代码示例中,它与“j=2”相同

        *(*var)->mem     

    这个例子确实很棘手。它读取为 var 指向的值的值,var 本身是指向包含“mem”的结构的指针。这意味着 var 将被声明为

                    struct ***var; 
    因此

    var 是一个指向指针的指针。我创建了一个代码片段,它编译并说明了如何使用它,但我不建议在您自己的代码中实际使用这种间接级别,特别是如果有人有机会阅读它。如果你这样做了,就准备好像女巫一样被追捕并烧死在火刑柱上。

    #include <stdio.h>

    struct lkj
    {
    int *mem;
    };

    int main(void)
    {
    int j;

    struct lkj bob;

    struct lkj ***var,**floyd,*sam;

    j = 3;
    bob.mem = &j;
    sam = &bob;
    floyd = &sam;
    var = &floyd;

    printf("bob.mem = 0x08%lX *bob.mem=%d j=%d\n",
    (unsigned int)bob.mem,
    *bob.mem,j);

    printf("&bob = 0x08%lX\n",(unsigned int)&bob);

    printf("sam = 0x08%lX &sam=0x%08lX\n",
    (unsigned int)sam,(unsigned int)&sam);
    printf("floyd = 0x08%lX &floyd=0x%08lX\n",
    (unsigned int)floyd,(unsigned int)&floyd);

    printf("var = 0x%08lX *(*var) = 0x%08lX\n",
    (unsigned int)var,(unsigned int)*(*var));

    printf("(*(*var))->mem = 0x%08lX *(*(*var))->mem=%d\n",
    (unsigned int)(*(*var))->mem,
    *(*(*var))->mem);

    printf("(**var)->mem = 0x%08lX *(**var)->mem=%d\n",
    (unsigned int)(**var)->mem,
    *(**var)->mem);

    return 0;
    }

    关于c - 需要帮助澄清 C 中的一些内存引用/指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26538662/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com