微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C:指针混乱

如何解决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,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,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,5};
    int array2[20];
    int * p2 = (int *)memset(array2,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
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。