如题所述
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;
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
偏移跑了是不是?
请具体说说可以吗
原代码
#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即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);
}