while(*p!='\0')循环中a[i]=*p为啥不能直接写成等于*(p+i)?

如题所述

while(*p!='\0')循环中a[i]=*p不能直接写成等于*(p+i),这是因为两者表示的意义是不相同的。
a[i]=*p,是可以写成*(a+i)=*p的,它与*(p+i)是两个完全不同的内容。所以不能混淆。追问

不同的内容,能具体说说吗?大神求教
原代码
#include
void main()
{
int i=0,j=0;
char *p="you are good";
char a[12];
while(*p!='\0')
{
*(a+i)=*p;
p++;
i++;}

printf("%s",a);
}

追答

这里*(a+i)就是a[i],这个程序复制p指向的字符串到a数组中(少复制了串结束符'\0',有可能会多输出乱码),应该在输出语句前增加一句*(a+i)=*p;

温馨提示:答案为网友推荐,仅供参考
第1个回答  2022-01-09
int a[];
int i=0;
int *p=a;
while(*p!=0){
a[i]=*p;
printf("%c",a[i]);
i++;}
不知道完整的代码是不是这样的 ,用来输出字符数组的每一个元素,
如果是:
首先int *p=a,即把字符数组的首位地址赋值给指针变量p,那么就初始化*p的值为a[0];
然后进行循环,因为i++,所以a[i]的值每循环一次就偏移一次,直到遍历数组遇到\0结束;
ps:*(p+i)其中i为偏移量,i为0表示第一个元素,i为1则表示第二个元素,i为2表示第三个元素……追问

原代码
#include
void main()
{
int i=0,j=0;
char *p="you are good";
char a[12];
while(*p!='\0')
{
*(a+i)=*p;
p++;
i++;}

printf("%s",a);
}

追答

*(a+i)与*(p+i)的i都是偏移量的意思。
当p=a时二者表示的意义一样
你的这串代码的意义是把字符串赋值给*p,然后通循环依次赋值给字符数组a中。
p++是p=p+1,结合前面的,就是*(p+1)

追问

如果把循环中的*(a+i)=*p改为*(a+i)=*(p+i)再把p++删掉,我原本以为这样可以,编译器不会报错但打印的结果是错误的,所以我就想知道为啥不能直接用*(p+i)。是不是要跟循环条件里的必须保持一致?如果条件是*(p+i)循环里写成*p也会打印错误

追答

因为你的循环条件是*p!=0,而不是*(p+i!=0)

*(p+i)!=0

第2个回答  2022-01-09
指针算术运算,与类型相关。如果p是整数型指针(4字节),p+i,则指向数据的第4位,而不是第2位追问

偏移跑了是不是?

请具体说说可以吗
原代码
#include
void main()
{
int i=0,j=0;
char *p="you are good";
char a[12];
while(*p!='\0')
{
*(a+i)=*p;
p++;
i++;}

printf("%s",a);
}

第3个回答  2022-01-09

a[i]=*p即a[i]=p[0]

a[i]=*(p+i)即a[i]=p[i]

显然不一样

除非指针p不移动,改为下标i不断自增,同时while循环的判断改为p[i]!='\0'

追问

p+i偏移走了是不是,即便i为0 ,它和p不一样了

p+i偏移走了是不是,即便i为0 ,它和p不一样了

大神能再具体一些吗
原代码
#include
void main()
{
int i=0,j=0;
char *p="you are good";
char a[12];
while(*p!='\0')
{
*(a+i)=*p;
p++;
i++;}

printf("%s",a);
}

追答

#include <stdio.h>

void main()

{

    int i = 0, j = 0;

    char* p = "you are good";

    char a[12];

    while (*(p+i) != '\0')

    {

        *(a+i) = *(p+i);

        i++;

    }

    *(a+i) = *(p+i);

    printf("%s", a);

}

本回答被网友采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网