今天预习中对strlen,sizeof函数 “政权旗帜”static “外来的和尚”ertern“进行详细的阅读和理解,书中没有用像课本那样的枯燥的方式解读,用一种幽默诙谐的方式反问我们,让我学习又多了些兴趣哈哈。不说没用的啦,下面是我整理的一些今天学习的内容。
1.strlen的详解
strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从a首地址一直找下去,直到遇到'\0'停止。
char a[10];cout<<strlen(aa)<<endl; //结果是不定的
char a[10]={'\0'}; cout<<strlen(aa)<<endl; //结果为0
char a[10]="jun"; cout<<strlen(aa)<<endl; //结果为3(此处不完全正确,结果可能是不定的,如果编译器将其他的非零字符串放在a[10]的内存地址后,strlen结果还是不定的)
char a[5]="hello";cout<<strlen(a)<<endl; //结果5
2.什么是sizeof ?
sizeof()返回的是变量声明后所占的内存数,不是实际长度,并且sizeof不是函数,仅仅是一个取字节运算符,strlen是函数。sizeof操作符的结果类型是size t ,它在头文件中typedef为unsignedint类型。该类型保证能容纳实现所建立的最大对象的字节大小。
3.Strlen 与 sizeof 的区别
1)sizeof是取字节运算符(关键字),strlen是函数。
2)sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。
3)sizeof还可以用函数做参数,比如:
short f();
printf("%d\n",sizeof(f()));
输出的结果是sizeof(short),即2。
4)数组做sizeof的参数不退化,传递给strlen就退化为指针了。
5)大部分编译程序在编译的时候就把sizeof计算过了是类型或是变量的长度。这就是sizeof(x)可以用来定义数组维数的原因
例:
char str[20]="0123456789";
long a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;
6)strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。
7)sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
8)当适用了于一个结构类型时或变量, sizeof 返回实际的大小,
当适用一静态地空间数组, sizeof 归还全部数组的尺寸。
sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
如还有不懂详见百度.......
4.政权旗帜static
1)用static修饰局部变量,该变量便存放在静态数据区,其生命周期一般持续到整个程序执行结束为止。修饰过后只有作用域没有改变仍为局部变量。
2)修饰全局变量。在用static修饰全局变量后,该变量只在初次运行时进行初始化工作,且只进行一次。
3)修饰函数
就是改变了函数的作用域。
5.“外来的和尚”exten
Exten 是外部变量或外部函数,所以说是外来的和尚。
Exten 可以修饰变量和函数,表示该变量或者函数在其他地方被定义
在任何函数体外声明或定义变量时,不加Extern可能是定义也可能是声明,但加了extern肯定是声明;如果不想让其他源文件链接到,则需要使用static关键字。
在函数体内声明,在函数体内部不能定义外部变量,使用其他原文件定义变量时,必须使用extern关键字,因为在函数体内默认为局部变量。