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

时间:2014-10-23 22:37:35

标签: c

你能解释一下

之间的区别
  1. &var -> a[var -> count]
  2. var -> a[var -> count]
    
    1. p = &x[i]

      p = a[i]
      
      &p = &a[i]`
      
    2. 我们可以做以下

      var - > * MEM

    3. *var -> mem
      

      *var -> mem
      

      *(*var) -> mem
      

      var -> *(mem) = 2;
      

      以上示例意味着什么?

1 个答案:

答案 0 :(得分:1)

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

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

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

  2.  p = &x[i]

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

      p = a[i]   

这里'p'设置为'a'数组的第i个值的VALUE。

      &p = &a[i]` 

这不起作用。首先,背蜱意味着什么。此外,尝试将预定义变量“p”的地址设置为新值。 'p'本身是一个可以包含许多不同值的变量,但p的ADDRESS是不可变的。万一你是 想知道,表达式应该被解读为“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指向的值的值,它本身是指向包含'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;
}