关键字的秘密

来源:互联网 发布:linux 打印内核 编辑:程序博客网 时间:2024/04/30 17:30
基于唐老师   "C语言专题" 总结

数据类型

数据类型可以理解为固定内存大小的别名
数据类型是创建变量的模子

类型本质

bool类型     C99

#include<stdbool.h>
< 零表示false   1表示true >
 
变量本质

变量是一段实际连续存储空间的别名
程序中通过变量来申请并命名存储空间
通过变量的名字可以使用存储空间

C中32个关键字: auto、int、double、long、char、short、float、unsigned、signed、sizeofexternstaticgotoifelse、struct、typedefunionenumswitchcase、    break、defaultdowhileconstregistervolatile、return、voidforcontinue.    defineinclude带#是于处理指令.

定义与声明:

定义:创建对象并为其分配内存
声明:仅仅告诉编译器在程序中有这么一个对象

auto

auto即C语言中局部变量的默认属性
编译器默认所有的局部变量都是auto

static 

static修饰的局部变量存储在程序的静态区
static修饰的全局变量作用域只在声明的文件中
static修饰的函数作用域只在声明的文件中

register

register关键字指明将变量存储于寄存器中
register只是请求寄存器变量,但不一定请求成功

register只可修饰局部变量、函数形参
不能用&运算符获取register变量的地址

if

if语句用于根据条件选择执行语句
else不能独立存在且总是与它最近的if相匹配



if语句 零值比较

1.bool型变量直接出现在条件中,不用比较

2.float型变量0值比较,需要定义精度



Tips:普通变量和0值比较,0值应该出现在变量左边.  < 安全机制 >

switch

switch语句对应单个条件,多个分值
每个case语句分支必须要有break,否则会导致分支重叠
default语句必须加上,以处理特殊情况



case语句值只能是整型字符型

case语句排列顺序分析.
     按字母或数字顺序排列语句.
     正常情况放在前面,异常情况放在后面.
     defalut语句只用于处理真正的默认情况.



 do while  for

循环语句基本工作方式.
     通过条件表达式判定是否执行循环体.

do、while、for区别.
     do语句先执行后判断,循环体至少执行一次.
     while语句先判断后执行,循环体可能不执行.
     for语句先判断后执行,相比while更简洁.

break  终止循环执行<do、while、for、switch>
continue  终止本次循环体,进入下次循环体<do、while、for>

do while(0) 和break的妙用



使用do while(0) 和break 可以避免造成内存泄漏 和程序简洁

高手潜规则:禁用goto.

void

void修饰函数返回值和参数
     如果函数没有返回值,那么应该将其声明为void
     如果函数没有参数,应该声明其参数为void
void修饰函数返回值和参数仅表示无

不存在void变量
C语言没有定义void究竟是多大内存的别名

void指针意义
     C语言规定只有相同类型的指针才可以相互赋值
     void * 指针作为左值用于接受任意类型的指针
     void * 指针作为右值赋值给其他指针时需要强制类型转换
   


extern

声明外部定义的变量和函数
告诉编译器用C方式编译





C++编译器和一些变种C编译器默认会按“自己”的方式编译函数和变量,通过extern关键字可以命令编译器“以标准C方式进行编译”



sizeof

sizeof是编译器的内置指示符,不是函数
sizeof用于计算相应实体所占内存大小
sizeof的值在编译期就已经确定
 
strlen 

strlen是函数,在运行时才能确定
strlen用于计算相应实体实际长度大小
字符串计算:返回字符串所包括的字符数目,不包括结束标志的空字符

const

C中const修饰的变量是只读的,本质还是变量
只读变量:不可以直接修改它,但可以通过指针间接修改

const修饰的变量会占用内存空间
const只对编译器有用,在运行时无用

const修饰指针 

const  int* p; 
int const  * p;    //p可变,p指向的内容不可变.

int * const p;     //p不可变,p指向的内容可变.

const int * const p; //p和p指向的内容都不可以变.

左数右指
     当const出现在*的左边时指针指向的数据不可变
     当const出现在*的右边时指针本身不可变


const 修饰函数参数返回值

const 修饰函数参数表示在函数体内不希望改变参数的值
const修饰函数返回值表示返回值不可改变,多用于返回指针的情形



volatile

volatile可理解为“编译器警告指示”
volatile用于告诉编译器必须每次去内存中读取变量值
应用:
1.并行设备的硬件寄存器
2.一个中断服务子程序中会访问到的非自动变量
3.多线程应用中被几个任务共享的变量




union

union只配置一个足够大的空间来容纳最大长度的数据成员

所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员

所有的数据成员具有相同的起始地址

union的使用受系统大小端影响





大端模式:数据的高位,保存在内存的低地址中;数据的低位,保存在内存的高地址中
小端模式:数据的高位,保存在内存的高地址中;数据的低位,保存在内存的低地址中

小同大异

enum

枚举类型,真正的常量
enum都唯一定义一个类型,元素值不唯一
枚举成员的初始化只能通过同一枚举成员进行
enum默认常量在前一个值的基础上依次加一
enum类型的变量只能取定义时的离散值



枚举类型和#define区别
#define宏变量只是简单的进行值的替换,枚举常量是真正意义上的常量.
#define宏常量无法被调试,枚举常量可以
#define宏常量无类型信息,枚举常量是一种特定类型的常量.

typedef

typedef用于给一个已经存在的数据类型取别名
typedef并没有产生新的类型
typedef重定义的类型不能进行unsigned和signed扩展


用途

1.定义别名,用作同时声明指针型的多个对象



p1、p2都是指针

p3是指针,p4 没有定义数据类型


2.简易结构体

typedef struct  _tag_POINT{
     int x;
     int y;
}POINT;

POINT *p;

3.定义与平台无关的类型,易于移植
    
typedef long double REAL

陷阱
typedef char* PSTR;
const PSTR 相当于 char* const, const给予了整个指针常量性

typedef在语法上是一个存储类的关键字,不可与static、extern、register同时使用
存储类关键字只能指定一个


0 0
原创粉丝点击