[C语言] C语言的基本认识(一)

learn for c

Posted by wulameng on 2017-12-29

为什么我要学习C语言,因为在以后的Android反编译和开发的学习中,对于SO文件的解析以及NDK的开发,都离不开C语言,C语言对比其他语言来说他更加趋于底层,适用大量计算,高效率的需求。对于任何编程语言的学习者来说都更加有帮助,好了废话说到这,来开始我们的C语言学习。


1.定义与声明的区别:

定义声明最重要的区别:定义创建了对象并为对象分配了内存,声明没有分配内存(函数的参数)。

2.C中的关键字和数据类型:

在C语言中一共有32个关键字以及6钟数据类型;再次声明sizeof是关键字而不是函数,各个类型所占的内存大小分别为short是2字节,int是4字节,long是4字节,char是1字节,double是8字节,float是4字节。以下是C语言中所有32个关键字:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
关键字                                                            意 义
auto 声明自动变量,缺省时编译器一般默认为 auto
int 声明整型变量
double 声明双精度变量
long 声明长整型变量
char 声明字符型变量
float 声明浮点型变量
short 声明短整型变量
signed 声明有符号类型变量
unsigned 声明无符号类型变量
struct 声明结构体变量
union 声明联合数据类型
enum 声明枚举类型
static 声明静态变量
switch 用于开关语句
case 开关语句分支
default 开关语句中的“其他”分支
break 跳出当前循环
register 声明寄存器变量
const 声明只读变量
volatile 说明变量在程序执行中可被隐含地改变
typedef 用以给数据类型取别名(当然还有其他作用)
extern 声明变量是在其他文件正声明(也可以看做是引用变量)
return 子程序返回语句(可以带参数,也可不带参数)
void 声明函数无返回值或无参数,声明空类型指针
continue 结束当前循环,开始下一轮循环
do 循环语句的循环体
while 循环语句的循环条件
if 条件语句
else 条件语句否定分支(与 if 连用)
for 一种循环语句(可意会不可言传)
goto 无条件跳转语句
sizeof 计算对象所占内存空间大小

3.C中空语句的写法:

在C中判断里的空语句使用NULL; ,而不是使用类似if(NULL!=p);这种方式。

4.if 、else语句的处理流程:

在使用if语句时应该先处理正常的情况在处理异常情况。因为正常情况的发生概率往往更大,如果将异常情况先进行处理,会造成多次的无谓判断,似的性能变低,这种方式也适用于其他任何编程语言。

5.switch语句的处理流程和特点:

如果需要进行的判断较多,建议使用switch语句,case分支后只能是整型或者是字符型的常量和常量表达式,语句精炼,阅读性高,且必须使用defult分支,即使程序不需要defult处理。case分支的排列顺序应该按照字母顺序或者数字顺序来进行排序,与if、else语句一样的是,我们需要将正常情况放在前面,异常情况放在后面。

6.C语言中循环语句:

在C中的循环语句有 while、do-while、for,while()语句先判断括号内的值,为真则执行大括号内的逻辑代码,否则不会执行,如果括号内是一个1,那就表示这是个死循环。

7.break和continue的区别:

break关键字表示终止本层的循环,而continue代表终止本次循环。并且switch、case语句中并不能使用continue关键字,除非其外套有一层循环。在有嵌套的循环中应将长循环套在端循环的内部以提高性能。不能再循环体内修改循环变量,防止循环失控,一般来说循环体内的代码不应该超过20行,且循环嵌套应控制在3层以内。

8.VOID类型:

void*的意思是空指针,他可以指向任何类型的数据,如果指针p1和p2的类型相同,我们可以直接在p1和p2之间互相赋值,但是如果p1和p2指向不同的数据类型,那就必须将运算符右侧的指针类型转换为左边的指针类型,for example:

1
2
3
float *p1;
int *p2;
p1=(float*)p2;

而void类型则不同,任何类型的指针都可以直接赋值给他,无需强制类型转换,for example:

1
2
3
void *p1;
int *p2;
p1=p2;

但是,任何指针类型并不能直接赋值给void*。另外,C语言中,如果函数没有写返回值,则默认为int。C语言中可以向无参函数传递任意类型的参数,但是在C++中的无参函数不接受任何参数。按照ANSI标准,不能对任何void指针进行算法操作,但是GUN则不同,他允许void指针进行算法操作。如果函数的参数可以是任意类型的指针那就可以声明其参数为void*

return关键字是用来终止一个函数并返回其后面跟着的值。

9.const关键字

const是 constant 的缩写,是恒定不变的意思,也翻译为常量、常数等。很多人都认为被 const 修饰的值是常量。这是不精确的,精确的说应该是只读的变量,其值在编译时不能被使用,因为编译器在编译时不知道其存储的内容。这也就说明了为什么用const修饰的变量必须在定义的同时进行初始化操作,如果不对const修饰的变量进行初始化,那么这个变量在程序运行时也不会改变,使得const变得没有意义。(在C语言中使用const修饰的变量永远是变量)。编译器一般不会给const变量分配内存空间,他只是给出了对应的内存地址,在程序运行过程中他只有一个,即地址。const在修饰指针时,离谁近const就修饰谁(先忽略类型名),for example:

1
2
3
4
const int *p; //const 修饰*p,p 是指针,*p 是指针指向的对象,不可变 
int const *p; //const 修饰*p,p 是指针,*p 是指针指向的对象,不可变
int *const p; //const 修饰 p,p 不可变, p 指向的对象可变
const int *const p; //前一个 const 修饰*p,后一个 const 修饰p,指针p和p指向的对象 都不可变

const也可以修饰参数和函数返回值,情况:当一个函数的参数和一个函数的返回值在不希望被改变的情况下,可以用const修饰。在连接文件中引用const,举个例子:

extern const int i;//正确的声明

extern const int j=10;//错误!只读变量的值不能改变。

extern关键字只是声明,不是定义,不会开辟内存空间。