# C语言学习
作者:互联网
数据类型
-
基本类型
-
整数类型
类型 存储大小(bytes) char 1 unsigned char 1 signed char 1 int 2 or 4 unsigned int 2 or 4 short 2 unsigned short 2 long 4 unsigned long 4 -
浮点类型
类型 存储大小(bytes) 精度(有效位数) float 4 6 double 8 15 long double 16 19
-
-
枚举类型
-
void类型: 指变量占用的内存大小为零,
void *pointer_name
只指明地址, 而不声明内存大小(不知道对象大小). -
派生类型
- 指针类型
- 数组类型
- 结构体类型
- 共用体类型
- 位域类型
- 函数类型
变量
声明: 向编译器保证变量会以指定的名称和类型存在, 令编译器能够在不知道具体细节时也能够进一步编译.
定义: 为声明的变量建立存储空间(预留内存, 方便存放待输入的变量).
除非使用
extern
关键字, 否则在声明时都将直接完成变量的定义.
声明变量时, 通过如下结构:
// 声明&定义
type var_name;
type var_name1, ..., var_nameN;
// 赋值
type var_name = var_value;
// 使用extern关键字, 只声明, 不定义.
extern type var_name
其中, type
主要功能为声明变量类型, 就是为变量分配内存空间, 通过指定具体的类型, 编译器可以得知需预留的内存大小.
变量的变化范围超出指定的内存空间后, 会出现内存溢出, 可能返回预期之外的结果.
声明指针变量时, 稍有不同:
// 声明&定义
type *pointer_name;
// 指向指针的指针, 可继续外推
type **pointer_name;
// 赋值
type *pointer_name = mem_addr;
其中, 星号*
即表示该变量为一个指针变量(告诉编译器这只是个地址), type表示该变量指向对象的类型(告诉编译器在到达地址后, 往后多大范围内是要找的对象).
存储类
存储类定义了程序中变量的可见性和生命周期, C语言中可用的存储类有:
auto
: 所有局部变量默认的存储类register
: 存储在寄存器(而非RAM)中的局部变量, 没有内存地址, 最大尺寸等于寄存器的大小(通常为一个字).static
:- 修饰局部变量时, 可以在程序生命周期内持续保持变量, 而不用每次进入/离开作用域时就创建/销毁.
- 修饰全局变量时, 会使变量的作用域限制在声明它的文件内.
extern
: 提供对全局变量的引用, 用以告知编译器该变量将在其他文件内完成定义.
函数
定义方法:
reture_type func_name(params_list) {
function_body;
}
函数指针的定义方法:
return_type (*func_pointer)(param1_type, ..., paramN_type);
// 赋值
return_type (*pointer_name)(param1_type, ..., paramN_type) = & some_func;
枚举
批量完成名称到整数的映射, 若不显示赋值, 则首位元素默认为0, 非首位元素为前一元素+1.
若元素对应的整数不连续, 则该枚举无法遍历.
定义方法:
enum tag {
element_name1 = some_int;
...
element_name2 = some_int;
} var_name;
结构体
一种用于存储多个不同类型数据的结构, 占用内存大小为所有成员之和.
定义方法:
struct tag {
type member1;
...
type memberN;
} var_name;
// 声明&定义
struct tag var_name;
// 赋值
struct tag var_name = {member1, ..., memberN};
// 对成员赋值
var_name.memberX = member_value;
共用体
指定一块可以存储多种类型数据的内存空间, 空间大小由占用内存最大的成员决定.
同一时间只能使用一个成员(存储某一成员时, 会由于共用内存而影响其他成员)
定义方法:
union tag {
type member1;
...
type memberN;
} var_name;
// 声明&定义
union tag var_name;
// 赋值
var_name.memberX = member_value;
位域
指定成员将使用的位数(需不大于其依附的类型)从而节约内存占用. 原内存空间不足存放新成员时, 会另起一块新的内存空间(大小取决于新成员依附类型)开始存放.
定义方法:
struct tag {
type member1 : bits;
...
type memberN : bits;
} var_name;
typedef
关键字
用于定义数据类型的别名, 也可以通过该方法简化结构体数据的声明.
定义方法:
typedef struct tag {
type member1;
...
type memberN;
} struct_name;
// 声明&定义
struct tag var_name;
struct_name var_name;
const
关键字
用于指明某变量不可重新赋值, 令其成为常量. 若尝试对const
修饰的变量赋值则会引发错误(故通常需要在声明时就完成赋值), 观察const
本身的行为, 类似对变量"写保护".
对于定义的常量, 编码规范要求其名称首字母应大写, 以提醒程序员"此为常量".
使用方法:
// 对常规变量使用
type const var_name = var_value;
// 对指针使用:
// 保护指针指向的变量(住在该地址的住户)不变, 但指针(地址)本身可变
type const *pointer_name = var_value;
// 保护指针(地址)不变, 但指向的变量(地址的住户)可变
type * const pointer_name = var_value;
// 同时保护指针及其指向的变量不变
type const * const pointer_name = var_value;
更常用的使用场景并非直接定义常量, 而是用于修饰函数的形参, 避免函数对传入的参数做不期望的改动:
return_type func_name(type const *pointer_param) {
function body;
}
标签:name,pointer,C语言,学习,类型,var,type,变量 来源: https://www.cnblogs.com/travonD/p/15979835.html