C:指针混乱

| 我了解这是基本内容的一部分,但我被卡住了:-( 有人可以帮帮我吗? 程序1:
#include <stdio.h>
#include <stdlib.h> 

int main()
{
 int a=1,b=2,c;
 c=(a+b)++;
}
为什么输出错误?需要左值吗? 程式2:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
 char *p1=\"name\";
 char *p2;

 p2=(char*)malloc(20);
 memset(p2,0,20);

 while(*p2++=*p1++);
 printf(\"%s\\n\",p2);

}
为什么输出为空字符串?如果我颠倒递增顺序,即::2ѭ,为什么左值误差会出现?     
已邀请:
        对于第一个问题,
(a+b)++
表示“将“4ѭ的值增加1”。 但是,您不能递增
a+b
,因为它不是变量。您期望在以下代码中发生什么?
int a = 1, b = 2;
printf(\"a = %d, b = %d, a+b = %d\\n\", a, b, a+b);
(a+b)++;
printf(\"a = %d, b = %d, a+b = %d\\n\", a, b, a+b);
显然应该打印第一个“ 7”   a = 1,b = 2,a + b = 3 但是第二个呢?   a =?,b =?,a + b = 4 如果我们增加总和,不清楚a或b应该是什么。 至于第二个问题,请记住,复制数据时要更改ѭ8,所以当您要求打印出它指向的内容时,它指向的是字符串的末尾,而不是字符串的末尾。开始。 进行字符串复制的一种更简单的方法是使用
strcpy
,如下所示:
strcpy(p2, p1);
请注意,这仅是安全的,因为您知道
p1
中字符串的大小不大于
p2
中的大小。如果不确定字符串的大小(例如,如果从用户输入中获取字符串),则需要小心,如Wikipedia所述。 至于为什么
while(++*p2=++*p1);
不起作用,而
while(*p2++=*p1++);
却起作用: Postfix-
++
的优先级高于
*
。这表示,17ѭ表示
*(p2++)
。 所以
*(p2++) = something;
是相同的
*p2 = something;
p2 += 1;
同时,
++*p2
表示
++(*p2)
,或““8ѭ指向的任何数字,加一”。 同样,如果您说了话,您也会遇到问题:
 int a = 5, *p2 = &a;
 ++*p2 = 10;
 printf(\"a = %d\\n\", a);
您希望该打印什么?如果有的话,它应该显示9,因为您要告诉编译器“ 25”。 但是,您不能指望C编译器能够解决该方程式,因此,为了保持语言的简单高效,禁止这种事情。     
        
c=(a+b)++;
a+b
不是左值-您想如何向加法结果(右值)分配一些内容-++ /-运算符确实分配新值。
while(*p2++=*p1++);
您p2指向字符串末尾的
\\0
。您需要在循环之前存储指向p2的原始地址:
char *p3 = p2;
while(*p2++=*p1++)
    ;
printf(\"%s\\n\",p3);
    
        
c=(a+b)++;
++
运算符不适用于临时变量。
(a+b)
是临时的。
while(*p2++=*p1++);
您在这里增加
p2
。循环之后,“ 8”不再指向最后一次“ 37”调用返回的存储块的开头。     
        如果您查看while循环: while(* p2 ++ = * p1 ++); 请记住,如果表达式不为零,则在C中为\“ True \”,如果为零则为false。即使循环没有主体,控制流仍然是: 检查条件->正文中的执行语句->检查条件 在这里,“检查条件”表示“评估语句并查看其是否为非零”。 while循环继续运行,直到p1指向零为止,此时控制权传递给printf。 例如
int main() 
{
    int array1[] = {2, 3, 1, 0, 3, 5};
    int array2[20];
    int * p2 = (int *)memset(array2, 0, 20*sizeof(int));
    int * p1 = array1;

    while(*p2++ = *p1++) {
        printf(\"In while: p1 is %d\\n\", *p1);
    }
    printf(\"Out of while: %d\\n\",*p2);
    return 0;

}
产量:
In while: p1 is 3
In while: p1 is 1
In while: p1 is 0
Out of while: 0
    

要回复问题请先登录注册