今天听课的时候,发现了一个问题:
将数组名传给函数,函数这边接受的是数组首元素的地址。sizeof不会通过传过来的数组名而求得它的大小。但是strlen却可以用这个形参求出数组中的字符串长度!
Tips:
1.sizeof是关键字也是操作符 ; 其操作数可以是 类型、变量、表达式
2.strlen -->求字符串长度的库函数 ,头文件 <string.h>
我是这样理解sizeof的:类型所占空间*数量。而在函数中,ch不再是数组,而仅仅是一个指针,是ch数组首元素的地址。对于指针,sizeof想要求指针的大小就得取决于电脑的位数: 32位(X86)--> 4 Byte ; 64位 -- > 8 Byte
strlen () 可以求出字符串长度,可是为什么在函数中可以利用字符串数组首元素的地址,而求出这个字符数组的长度呢?
代码如下: 输出为"ghedcba"
#include<stdio.h>
void reverse(char ch[])
{
int left = 0;
int right = strlen(ch) -1 ; //为什么可以使用strlen?
while(left<right)
{
char tmp = ch [left];
ch[left] = ch [left];
ch[left] = tmp ;
left ++ ;
right --;
}
}
int main()
{
char ch[] = "abcdefg";
reverse(ch);
printf("%s\n",ch);
return 0;
}
上面这个代码中,strlen给人的感觉就是 ,它顺着数组首元素地址找到了在函数外面的数组并且完成了它的任务;
对此,就产生了一个疑问:strlen工作的原理到底是什么?为什么在函数中,ch作为一个数组首元素指针,而strlen(ch); 还可以求出这个数组中字符串的长度?
strlen求字符串长度:
int ret = strlen("abcd"): //ret=4
也可以:
char ch = "abcd";
int ret = strlen(ch); //ret=4
然后......
也就是说,strlen通过这个ch指针去找到了这个原本的数组,也就是说strlen 执行的参数是指针!
然后我去msdn 上查了一下strlen
emmm... 看来是指针了
再看一下msdn 给的例子:
又去尝试了一下...
看来!字符串传参和数组传参有点相似!都是传首元素地址过去;
那么,就可以说得通了,
strlen就是通过这个指针摸到原本的字符串数组(字符串)然后再去执行它的工作。
(PS.仅仅为初学者的思考,如若有误,请各位大佬一定要给小弟指出来!感谢)