C中指针和变量之间的区别? #包括 int inc1(int x){返回x++;} int inc2(int*x){return(*x)++;} int 主(空) { INTA; a=3; printf(“%d\n”,inc1(a)+a); printf(“%d\n”,inc2(a)+a); 返回0; }

C中指针和变量之间的区别? #包括 int inc1(int x){返回x++;} int inc2(int*x){return(*x)++;} int 主(空) { INTA; a=3; printf(“%d\n”,inc1(a)+a); printf(“%d\n”,inc2(a)+a); 返回0; },c,pointers,C,Pointers,我正在阅读一篇过去的论文,其中一个问题是跟踪对第6行和第9行之间的a所做的更改。我有点理解指针(引用内存位置),但如果有人能告诉我在这段代码中对a所做的更改,那就太好了。我将解释这段几乎相同的代码,它在您的帖子中不包含错误: #include <stdio.h> int inc1(int x) { return x++; } int inc2(int *x) { return (*x)++; } int main(void) { int a; a = 3;

我正在阅读一篇过去的论文,其中一个问题是跟踪对第6行和第9行之间的a所做的更改。我有点理解指针(引用内存位置),但如果有人能告诉我在这段代码中对a所做的更改,那就太好了。

我将解释这段几乎相同的代码,它在您的帖子中不包含错误:

#include <stdio.h>
int inc1(int x)  { return x++;    }
int inc2(int *x) { return (*x)++; }

int
main(void)
{
    int a;
    a = 3;
    printf("%d\n", inc1(a) + a);
    printf("%d\n", inc2(a) + a);
    return 0;
}
#包括
int inc1(int x){返回x++;}
int inc2(int*x){return(*x)++;}
内部主(空){
INTA;
a=3;
printf(“%d\n”,inc1(a)+a);
printf(“%d\n”,inc2(&a)+a);
返回0;
} 
a
被初始化为3,然后a的值被传递到
inc1()
,后者返回该值并使用增量后添加1。这意味着返回的实际值仍然是3

接下来,a的地址被传递到
inc2()
。这意味着x中的值发生在a上。同样,使用了post increment,因此
inc2()
返回的是3,但调用后,
a
返回的是4

但是,编译器可以自由地以序列点之间的任何顺序计算表达式,例如
a
inc2(&a)
。这意味着
inc2(&a)+a
右侧的
a
可能是3或4(取决于
a
是在
int2(&a)
之前还是之后计算的),因此程序可以输出6766

调用inc1()的行将打印“6”(3+3)[前3是来自inc1(),由于使用后增量运算符,因此不会返回增量值。)。此外,由于值调用了inc1(),因此函数外部不影响“a”的值

现在,如果论文中调用inc2()的语句如下:

#include <stdio.h>

int inc1(int x)  { return x++;    }
int inc2(int *x) { return (*x)++; }

int main(void) {
    int a;
    a = 3;
    printf("%d\n", inc1(a) + a);
    printf("%d\n", inc2(&a) + a);
    return 0;
} 
printf("%d\n", inc2(a) + a);
然后,您的代码将被编译(希望您将内存位置存储在“a”中),但根据其中的值(在“a=3”的情况下),在运行时您将出现分段错误,因为您试图取消引用程序不应该访问的内存位置3

或者,如果声明如下所示:

#include <stdio.h>

int inc1(int x)  { return x++;    }
int inc2(int *x) { return (*x)++; }

int main(void) {
    int a;
    a = 3;
    printf("%d\n", inc1(a) + a);
    printf("%d\n", inc2(&a) + a);
    return 0;
} 
printf("%d\n", inc2(a) + a);
然后inc2()将通过指针(地址)递增“a”的值,但将返回“a”(3)的旧值仍然是因为它使用了后增量运算符,但无论如何它都会递增“a”,对“a”的任何后续访问都将获得新值。下一个“a”将具有值“4”,因为计算是从左到右进行的,因此它将打印7(3+4)


我希望它能澄清C中指针和变量之间的区别。

是不是应该是
inc2(&a)
main
的最后一行?不,我写的和论文中显示的一模一样。然后论文中的代码就不能编译了。请你发一个到这篇论文的链接好吗?你看到的代码中似乎有严重的错误,这让问题混淆了。Als和Zack是对的。它可能会编译,但会传递
a
inc2()
的值将seg fault。它与指针无关,但此程序可能合法地(即,两个选项都不表示编译器中存在错误)打印
6 7
6 8
(您知道为什么吗?)@Zack我可以看到
6
如果
a
inc2
之前进行了评估(这是允许的吗?),但我不确定
6 8
是如何发生的。解释?它可以打印67或66。表达式的评估顺序未定义。(只按顺序评估短路内容)@Goldilocks:但是'a'可能已经被计算过了。我对
inc2
返回的是什么感到困惑。是的,6 7或6 6。