你能解释一下
之间的区别&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;
以上示例意味着什么?
答案 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;
}