(1)内存中存储区域不同。
全局和静态存在静态区中,局部存储在堆栈中。
(2)作用域不同
全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误;局部变量也称为内部变量,局部变量是在函数内作定义说明的,其作用域仅限于函数内, 离开该函数后再使用这种变量是非法的。
(3)其他
static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。 -----所以常用的公共函数最好定义为static
程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。extern全局变量、static全局变量和static局部变量的生存期都是“永久”,区别只是可见域不同,extern全局变量可见区域是工程,static全局变量可见区域是文件,而static局部变量的可见区域是块。 从代码维护角度来看,对extern变量的修改可能会影响所有代码,对static全局变量的修改可能影响一个文件中的代码,而对static变量的修改可能影响一个块的代码;因此在选择变量类型时,优先级是static局部>static全局>extern全局。但它们有着共同的缺点:使用了这些类型变量的函数将是不可重入的,不是线程安全的。在C/C++标准库中有很多函数都使用了static局部变量,目前的实现中都为它们提供了两套代码,单线程版本使用static变量而多线程版本使用“线程全局变量”,比如rand,strtok等。一个进程可用内存空间为4G,可分在存放静态数据,代码,系统内存,堆,栈等。.活动记录一般存放调用参数、返回地址等内容。堆和栈最大的区别在于堆是由低地址向高地址分配内存,而栈是由高向低。全局和静态数据存放在全局数据区,其余的在栈中,用malloc 或 new 分配的内存位于堆中。一般来说栈在低地址,堆位于高地址。
#ifdef __cplusplus
extern "C" {
#endif
//函数声明
#ifdef __cplusplus
}
#endif
为什么要加extern "C" :解决编译器编译后库中函数的名字匹配问题,如void foo(int x,int y),C编译器_foo,c++编译器_foo_int_int。
详见:http://www.cnblogs.com/sunnyjones/archive/2008/10/31/1323438.html
char * const p : 定义一个指向字符的指针常数,即const指针;
const char* p : 定义一个指向字符常数的指针;
const char*p或者char const *p(因为没有const*p运算,因此const修饰的还是前面的char):可以对任意位置(非系统敏感区域)进行“只读” 操作。(“只读”是相对于char *p来说所限定的内容)
char *const p(const 修饰的是p):只能对“某个固定的位置” 进行读写操作,并且在定义p时就必须初始化(因为在后面不能执行“p=..”的操作,因此就不能在后面初始化,因此只能在定义时初始化)。(“某个固定的位 置”是相对于char *p来说所限定的内容)
char const* p : 等同于const char* p
const char* const p:只能对“某个固定的位置” 进行读操作,指针const,指针内容const。
参考:http://www.cnblogs.com/rushuizhijing/archive/2011/08/26/2154737.html
4.1sizeof
sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。
它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。
具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
数组——编译时分配的数组空间大小;
指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);
类型——该类型所占的空间大小;
对象——对象的实际占用空间大小;
函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。
4.2strlen
strlen(...)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。
它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。
4.3区别联系
(1)sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。
(2)性质不同:sizeof是运算符,strlen是函数。
(3)参数不同:sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。
sizeof还可以用函数做参数,比如: short f(); printf("%d\n", sizeof(f())); 输出的结果是sizeof(short),即2。 数组做sizeof的参数不退化,传递给strlen就退化为指针了。
(4)计算阶段不同:大部分编译程序在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因
char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;
strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。
(5)格式不同:sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
(6)适用范围不同:当适用了于一个结构类型时或变量, sizeof 返回实际的大小, 当适用一静态地空间数组, sizeof 归还全部数组的尺寸。 sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸。
参考:http://www.cnblogs.com/carekee/articles/1630789.html
(1)默认继承权限。如果不明确指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理;
(2)成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。
除了这两点,class和struct基本就是一个东西。语法上没有任何其它区别。