林金锡和吕全亚:C语言指针与数组问题,不明白。

来源:百度文库 编辑:高考问答 时间:2024/04/28 14:21:42
这个是计算字符串长度程序。
main()
{
char s[20];
char *p;
scanf("%s",s);
p=s;
while(*p!='\0') p++;
printf("The string length is %d\n",p-s);
}
疑问:p=s;s[20]定义为数组变量,但一个s是什么意思?s赋值给p。*p才是指针变量啊,为什么只写个p上去?p依我理解没有定义吧?请老前辈们指点指点!

这个简单啊
S是数组,P就是指向S首地址的指针
这时就代表S了
不懂就多去看看书了
我看书至少10次才弄懂了这个意思

当一个数组名出现在一个表达式中时,它会被转换为一个指向该数组第一个元素的指针。这里p=s;s就代表s[20]这个数组的第一个元素的地址。
还有就是s[i],其实就是代表*(s+i);这样理解的话,s[i]中的s也是代表数组第一个元素的地址。

*p=s是把str字符串的首地址传给指针p
while(*p)p++;是在p地址存放的字符在有效时指针指向下一个地址
例如,s=welcome....中
w的地址为000000 e的地址为000001(假设字符只占一个地址)
刚开始p=000000,p++之后p=000001....,当p=最后一个字符地址之后,p地址存放的字符就不是正常值了,此时while(*p)正好判断跳出循环,
p-s:此时的p是字符串"welcome..."的最后一个地址, 而str是第一个地址,相减就是该字符串所用的长度

在c中
数组名代表这个数组的首地址
s就代表s[20]的首地址

你可以这样式一下.printf("%c",*s) 就会输出s[0]
printf("%c",*(s+1)) 就会输出s[0]

p是一个内存地址 而*p是p指向的内存地址里面存的数值