一、C/C++ static关键字
- 局部静态变量
- 只初始化一次 —– 具有‘记忆性’
- static具有全局唯一性,每次调用时, 都指向同一块内存(注意线程不安全) —– 作用域相同,提高‘生存期’
- 全局静态变量/函数:
- 对于全局变量, 不论是否有static限制, 它的存储区域都是在静态存储区, static起到修饰作用域
- static变量/函数的作用域仅局限于本文件(内部函数)
- 静态数据成员/成员函数(C++特有)
- 属于一个类而不是属于此类的任何特定对象的变量和函数(不用声明类对象可以直接调用)
- 博客
二、C/C++ extren关键字
- 可置于变量或者函数前,以表示变量或者函数的定义在别的文件中。提示编译器遇到此变量或函数时,在其它模块中寻找其定义。
- 博客
三、C/C++指针
- 指针就是内存地址
- 指针本身可以运算(改变内存地址)*(a++)
-
指针所指的值可以运算(加减内存地址值的内容)(*a)++
- 函数指针:
返回值类型 (*指针变量名)([形参列表]);
- int func(int x); //声明一个函数
- int (*f)(int x); //声明函数指针
- f = func; //func函数的首地址赋值给指针f
- C++引用变量:
- 类似于指针常量: int* const ptr = &a;
- 必须在申明引用变量的时候初始化: int &b = a;
- C语言只能传递值
int *a;
a = (int*)malloc(sizeof(int));
*a = 1;
printf("add of a:%p,%p,%d\n",&a,a,*a);
&a:变量a本身所在的地址
a:变量a存放的内存地址(1的内存地址)
*a:变量a存放的内存地址的值 1
四、C函数返回值
-
函数可以返回局部变量的值,不能返回局部变量的地址;局部变量地址存放在栈中,函数返回,局部变量的内存也被清空了
-
函数可以返回指向堆内存的指针(malloc自己申请的内存都存放在堆中)
-
函数的返回值非要是一个局部变量的地址,那么该局部变量一定要申明为static类型
-
数组是不能作为函数的返回值;但可以返回一个指向静态局部数组的指针,因为静态存储期是从对象定义到程序结束的
char p[]="hello world"; //p不能用作函数返回
char *p="hello world"; //p可以用作函数返回
1. "hello world"是一个字符串常量,存放在静态数据区
2. char p[]="hello world";这条语句让"hello world"在内存中有两份拷贝,一份在动态分布的栈中,一份在静态存储区,当函数退出时,局部变量p的内存是要被清空的。
3. char *p="hello world";变量p是指向静态存储区的指针,此变量指向的内存在程序运行过程中不会被清空。
linux C 调试器
- gdb test(可执行程序)
设置断点:b
运行程序:r
单步执行:n
跳入函数:s
跳出函数:finish
打印内容:p
查看设置的断点:break list
查看源码:l
.h和.cpp头文件引用原则
- 如果可以不包含头文件,那就不要包含,这时候前置声明可以解决问题,如果使用的仅仅是一个类的指针,没有使用这个类的具体对象(非指针),也没有访问到类的具体成员,那么前置声明就可以了,因为指针这一数据类型的大小是特定的,编译器可以获知
- 尽量在CPP文件中包含头文件,而不要在头文件中包含。假设类A的一个成员是一个指向类B的指针,在类A的头文件中使用了类B的前置声明,那么在A的实现中我们需要访问B的具体成员,因此需要包含头文件,那么我们应该在类A的实现部分(CPP文件)包含类B的头文件而非声明部分(H文件)