C基础及注意点概要
********** C ************
1.static
1) 如果加了static,就会对其它源文件隐藏(变量和函数)
利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突
2) 保持变量内容的持久
存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化
3) 修饰变量,变量未初始化,默认值为0
#include <stdio.h>
int fun(void)
{
static int count = 10; //事实上此赋值语句只执行过 1次
return count--;
}
int count = 1;
int main(void)
{
printf("global local static
");
for(; count <= 10; ++count)
printf("%d %d
", count, fun());
return 0;
}
2.静态存储区、栈、堆
静态存储区:静态数据、全局数据、常量
栈:变量
堆:动态内存分配,用malloc或new申请任意大小的内存
3. 虚函数
定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。
constructor执行的时候对象都还没有,如何virtual?
构造函数不能为虚函数,而析构函数可以且常常是虚函数。
4.extern
修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。
5. const
const 只读
const int a=100
6. 频繁使用的短小函数 -> 宏定义
#define MAX(a, b) ((a)>(b)?(a):(b))
注:括号需要添加,参考https://zhidao.baidu.com/question/462248346.html
3/15
1. 宏定义
1) 条件编译: #ifdef #else #endif
当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2
#ifdef 标识符
程序段1
#else
程序段2
#endif
2) 头文件重复定义:#ifndef #define #endif
#ifndef GRAPHICS_H // 防止graphics.h被重复引用
#define GRAPHICS_H
#include <math.h> // 引用标准库的头文件
…
#include “header.h” // 引用非标准库的头文件
…
#endif
2. 值传递、引用传递、指针传递
值传递:
形参是实参的拷贝,改变形参的值并不会影响外部实参的值
指针传递:
形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作
引用传递:
被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址,
被调函数对形参做的任何操作都影响了主调函数中的实参变量。
3. 指针和引用
★相同点:
●都是地址的概念;
指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。
★不同点:
●指针是一个实体,而引用仅是个别名;
●引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;
●引用没有const,指针有const,const的指针不可变;(具体指没有int& const a这种形式,而const int& a是有 的, 前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可以改变)
●引用不能为空,指针可以为空;
●“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;
●指针和引用的自增(++)运算意义不一样;
●引用是类型安全的,而指针不是 (引用比指针多了类型检查)