函数传参时数组需传数组名与长度,字符串无需传长度,原因何在?
数组与字符串参数传递的差异原因
核心原因很简单:C语言中字符串自带结束标志\0,而普通数组没有,具体细节如下:
数组传参的本质:当你把数组名作为参数传给函数时,它会自动退化成指向数组首元素的指针。此时函数拿到的只是一个内存地址,无法通过这个指针直接获取数组的总长度——因为内存里的数组元素是连续存放的,但没有任何标记告诉函数“这是最后一个元素”。所以必须额外传入长度参数,才能让函数正确遍历数组,避免越界访问。
比如这个函数:void print_int_array(int arr[], int length) { for (int i = 0; i < length; i++) { printf("%d ", arr[i]); } }这里的
arr[]实际上等价于int *arr,如果不传length,函数根本不知道该循环多少次。字符串的特殊存储规则:字符串在C里被定义为以
\0(ASCII值为0的空字符)结尾的字符数组。所有标准字符串处理函数(比如计算长度的strlen、输出的printf("%s"))都是通过遍历字符,直到找到\0为止来确定字符串的边界。所以传递字符串时,只要传入指向首字符的指针(也就是字符串名),函数就能自己找到结束位置,不需要额外传递长度。
比如:void print_string(char str[]) { // 函数内部会自动遍历到'\0'停止 printf("%s", str); }哪怕你传入的是很长的字符串,只要末尾有
\0,函数就能正确处理。
另外要注意:如果是没有\0结尾的字符数组,那它就不是标准意义上的字符串,此时也需要传入长度才能正确处理,否则函数会一直遍历内存直到遇到某个\0,导致不可预期的结果。
内容的提问来源于stack exchange,提问作者xiaohan
相关产品推荐
相关产品推荐

