指针
1. 表达式中,数组可以解读成“指向它的初始元素的指针”(有三个例外),和在后面加不加[]没有关系
2. 向一个函数传递数组时,实际上传递的是一个指向初始元素的指针
3. C中三种内存领域的寿命
静态变量和全局变量的寿命从程序运行时开始,到程序关闭时结束
自动变量的寿命到声明该变量的语句块执行结束为止
通过malloc()分配的领域的寿命到调用free()为止
利用malloc()来进行动态内存分配
1. Malloc()根据参数指定的大小来分配内存块,它返回指向内存块初始位置的指针,一旦内存分配失败,malloc()将返回NULL,利用malloc分配的内存结束使用时,通过free()来释放内存。
2. Malloc()返回值的类型为void *,malloc()不是系统调用,属于标准库函数
3. 调用free()后,对应的内存区域是不会立刻返还给操作系统的
C语言申明
1. 首先着眼于标识符(变量或者函数名)
2. 从距离标识符最近的地方开始,依照优先顺序解释派生类型(指针、数组和函数),优先顺序如下:
1) 用于整理声明内容的括弧
2) 用于表示数组的[],用于表示函数的()
3) 用于表示指针的*
3. 解释完派生类型,使用”of”、”to”、”returning”将他们连接起来
4. 最后,追加数据类型修饰符(在左边,如Int、double等)
C语言 | 英语表达 | 中文表达 |
Int hoge | Hoge is int | Hoge是int |
Int hoge[10] | Hoge is array(元素个数为10) of int | Hoge是int数组(..10) |
Int hoge[10][3] | Hoge is array(元素个数为10)of array(元素个数为3) of int | Hoge是int数组(元素个数3)的数组(元素个数为10) |
Int *hoge[10] | Hoge is array(元素个数为10)of pointer to int | Hoge是指向int的指针的数组(元素个数为10) |
Int (*hoge)[10] | Hoge is pointer to array(元素个数为10) of int | Hoge是指向int的数组(元素个数为3)的指针 |
Int func(int a) | Func is function(参数为Int a)returning int | Func是返回int的函数(参数为int a) |
Int (*func)(int a) | Func is a pointer to function(参数为int a) returning int | Func是指向返回int的函数(参数为int a)的指针 |
C的数据类型的模型
一、 基本类型和派生类型
派生类型
1) 结构体
2) 共用体
3) 指针
4) 数组
5) 函数
int (*func_table[10])(int a);
指向返回Int的函数(参数为int a)的指针的数组(元素个数为10)
基本类型:链的最后面的元素
二、 指向数组的指针
Int (*array_p)[3]
Int array[3]
Array_p = &array 不能写成 array_p= array因为array(指向Int的指针),array_p(指向int的数组(元素个数3)的指针)
三、 C语言中不存在多维数组
Int hoge[3][2]//int的数组(元素个数2)的数组(元素个数3)
Hoge[i]是指:int的数组(元素个数2)的数组(元素个数3)中的第i个元素,其类型为“int数组(元素个数2)”
作为参数传递时:函数原型:void func(int *hoge)
指向int 的数组(元素个数2)的指针
void func(int (*hoge)[2]) 即 void func(int hoge[3][2])
四、 函数类型派生
从函数类型是不能派生出除了指针类型之外的其他任何类型的。
从数组类型是不能派生出函数类型的。
五、 计算类型的大小
Sizeof(类型名)
Sizeof(int(*[5])(double))
指向返回Int的函数(double)的指针的数组(元素个数5)的大小
1) 指针:大部分情况下,指针的大小和派生源的大小没有关系,大小固定
2) 数组:派生源类型的大小乘以元素个数
Int *hoge[10]//4*10=40个字节
Double *hoge[10]//4*10=40个字节
Int hoge[3][2] //4*2*3=24个字节
六、 基本类型(派生类型的底层)
基本类型:char和int这样的整型以及float和double这样的浮点型
表达式
表达式和数据类型
基本表达式:
1) 标识符(变量名、函数名)
2) 常量(包括整数常量和浮点数常量)
3) 字符串常量(使用“”括起来的字符串)
4) 使用()括起来的表达式
“左值”——“右值”
左值:表达式代表某处的内存区域时
Hoge_p = &hoge; *hoge_p = 10;//*hoge_p指向Hoge的内存区域
右值:表达式只是表达值时
运算符*将指针作为操作数,返回指针所指向的对象或者函数,只要不是返回函数,运算符*的结果都是左值
运算符&将一个左值作为操作数,返回指向该左值的指针。对左值的类型加上一个指针,就是&运算符的返回类型
运算符优先级
运算符 | 连接规则 |
() [] -> . | 从左往右 |
! ~ ++ -- + - * & (type) sizeof | 从右往左 |
/ * % | 从左往右 |
+ - | 从左往右 |
<< >> | 从左往右 |
< <= > >= | 从左往右 |
== != | 从左往右 |
& | 从左往右 |
^ | 从左往右 |
| | 从左往右 |
&& | 从左往右 |
|| | 从左往右 |
?: | 从右往左 |
= += -= *= /= &= ^= |= <<= >>= | 从右往左 |
, | 从左往右 |
进行单目运算的+、-、*的优先级高于进行双目运算的。。
Const修饰符
Const修饰的是紧跟在它后面的单词
Char * const src//src is read-only pointerto char//src是指向char的只读的指针
Char const *src//src is pointer toread-only char//src是指向只读的char的指针
Charconst *src====const char *src意思完全相同
Typedef
Typedef char *String;//String:指向char的指针
String hoge[10];
Hoge is array(元素个数为10) ofString//hoge是String的数组(元素个数为10)
只有在声明函数形参的情况下,int a[]和int *a才具有相同的意义
函数指针
Void (*func_p)()//变量func_p声明为指向函数的指针,进行函数调用时,可写成(*func_p)()
Int atextit(void(*func)(void))
Atextit是返回Int的函数(参数是,指向返回void没有参数的函数的指针)
Void(*signal(int sig,void (*func)(int)))(int)
首先着眼于标识符signal
Signal isa function(int sig,func is pointer to function(int) returning void) returningpointer to function(int) returning void
Signal是返回“指向返回void参数为int的函数的指针”的函数,它有两个参数,一个是int,一个是“指向返回void参数为int的函数的指针”
数组和指针的常用方法
以函数返回值之外的方式来返回值
若需要通过函数返回值之外的方式返回值,将“指向T的指针”(如果想要返回的值的类型为T)作为参数传递给函数
可变长数组
使用malloc()在运行时为数组申请必要的内存区域
头文件的写法
写头文件是必须遵守的原则:
1. 所有的头文件中,必须要有防止重复#include的保护
2. 所有的头文件只#include自己直接依赖的头文件