C基础及注意点概要

********** C ************

参考:
https://wenku.baidu.com/view/b6d1a6d784254b35eefd34e3.html?mark_pay_doc=0&mark_rec_page=1&mark_rec_position=2&clear_uda_param=1###

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 指针”得到的是指针本身的大小;

●指针和引用的自增(++)运算意义不一样;

●引用是类型安全的,而指针不是 (引用比指针多了类型检查)

原文地址:https://www.cnblogs.com/stellar/p/8466522.html