写在前面
sizeof、strlen、字符串、数组,提到这些概念,相信学过C语言的人都能耳熟能详,也能谈得头头是道,但是,在实际运用中,当这些内容交织在一起时,大家却不一定能搞地清清楚楚,本文的目的正是帮助大家将相关知识总结清楚。
正文
先看一段代码
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void testchar(char str[]) 5 { 6 printf("%d %d ", sizeof(str), strlen(str)); 7 } 8 9 void testint(int arr[]) 10 { 11 printf("%d ", sizeof(arr)); 12 } 13 14 int main() 15 { 16 char str[] = "abc"; 17 printf("%d %d ", sizeof(str), strlen(str)); //4 3 18 19 char str1[10] = "abc"; 20 printf("%d %d ", sizeof(str1), strlen(str1)); //10 3 21 22 char dog[] = "wangwang miao"; 23 printf("%d %d ", sizeof(dog), strlen(dog)); //14 8 24 testchar(dog); //4 8 25 26 char *cat = "wangwang miaomiao"; 27 printf("%d %d ", sizeof(cat), strlen(cat)); //4 8 28 29 int arr[10] = { 0 }; 30 printf("%d %d ", sizeof(arr), sizeof(arr[11])); //40 4 31 testint(arr); //4 32 33 return 0; 34 }
结果
在解释上面的例子之前,我们先来说一说sizeof和strlen。
语法上的本质不同:
sizeof是运算符,strlen是函数。
适用范围不一样:
对sizeof(name)而言,name可以是变量名也可以是类型名,对strlen而言,参数必须是char*类型的,即strlen仅用于字符串。
重中之重——从底层看本质
strlen(ptr)的执行机理是:从参数ptr所指向的内存开始向下计数,直到内存中的内容是全0(即’