本帖最后由 叮当 于 2015-12-12 21:29 编辑  
 
大家好,我是叮当,我给大家分享我学习C语言的笔记,如果有其他编程语言的基础,看我的笔记可以快速地掌握C语言,如果有错误的地方,不吝赐教。 
 
以下内容是一次性写出来,可能有错误之处,希望发现及时指正本人 
 
一、变量常量及宏 
C语言的变量,必须:在使用前定义,并且确定类型 
 
变量格式 ;数据类型 变量名=数据; 
 
宏定义格式;#define 常量名 数据; 
 
宏定义一般要大写,好区分变量和常量 
 
#define叫宏定义,不叫常量 
 
常量的定义: 
 
const 数据类型 变量名=数据; 
 
const 限定变量不允许改变 
 
二、数据类型 
C语言的类型 
 
整数型:short int ---- 2字节 
       int ---------- 4字节 
       long  
       long long ---- 8字节 
 
字符型;char ---- 1字节 
 
浮点型:float、double、long double 
 
逻辑型:bool 
 
指针型 
 
自定义类型 
 
C99新引入的有:long long、long double、bool 
 
sizeof是一个运算符,给出某个类型或变量在内存中所占据的字节数 
 
三、流程控制 
 
if(表达式) 
{ 
语句1;  
语句2; 
语句n; 
} 
 
 
if(表达式) 
{ 
语句1;  
语句2; 
语句n; 
}else 
{ 
语句1;  
语句2; 
语句n; 
} 
 
 
if(表达式) 
{ 
语句1;  
语句2; 
语句n; 
}else if 
{ 
语句1;  
语句2; 
语句n; 
} 
 
switch (表达式) 
{ 
   case 常量表达式:语句1; 
                 
   break; 
   default: 语句;          
} 
 
 
一、for 
for语句的格式为:  
 
for (初始化语句; 条件语句; 控制语句)  
{  
语句1 ;  
语句2 ;  
语句n ;  
}  
 
 
二、while 
 
while先判断后执行 
 
while语句的格式为: 
 
While(循环条件判断) 
{ 
   语句1 ;  
   语句2 ;  
   语句n ;  
 
} 
 
三、do while 
 
do while语句先执行后判断 
 
do while语句的格式为: 
 
do 
{ 
语句1 ;  
语句2 ;  
语句n ; 
 
}while(循环条件判断) 
 
break 
 
break如果用于循环是用来终止循环 
 
braak只能终止包裹最里面的那个循环语句 
 
break如果用于switch,则是用于终止switch 
 
braak只能终止最最近的那个switch 
 
break不能直接用于if,除非if循环内部的一个子句 
 
 
continue 
 
continue用于跳出循环余下的语句 
 
四、函数 
函数 
 
为什么需要函数 
 
避免重复性操作 
 
有利于程序模块化 
 
什么叫函数 
 
概念上:能够完成特点功能的独立代码块 
 
编程上:能接收数据[也可以不接收数据] 
        能够对接收的数据进行处理 
        能够将数据处理的结果返回[也可以不返回] 
        函数可以当作一个黑匣子 
 
如何定义函数 
 
   函数的返回值 函数名字(函数的形参) 
  { 
       函数的执行体    
   } 
 
return 表达式:含义 
 
1.终止被调函数,向主调函数返回表达式的值 
 
2.如何表达式为空,则只终止函数,不向函数返回任何值 
 
3.break是用来终止循环和switch的,return是用来终止函数的。 
 
4.函数的返回值必须以函数定义的函数返回值类型为准 
 
函数的分类 
 
1.有参函数和无参函数 
 
2.有返回值函数和无返回值函数 
 
3.库函数和用户自定函数 
 
4.普通函数和主函数(main) 
  一个程序必须有且只能有一个主函数,主函数可以调用普通函数,普通函数不能调用主函数,普通函数可以相互调用,主函数是程序的入口也是出口。 
 
函数注意的问题 
 
1.调用函数前要先声明,可以先声明,在写函数执行体 
 
2.库函数通过#include<库函数所在的名字.h> 
 
3.形式参数和实际参数 
  个数相同 位置一一对应  数据类型必须互相兼容 
 
五、数组 
定义数组:类型 变量名称[元素数量]; 
 
元素数量必须是整数 
 
使用数组时放在[]中的数字叫做下标或索引,下标从0开始计数 
 
数组是一种容器,特点是:其中所有的元素具有相同的数据类型;一旦创建,不能改变大小 
 
数组中的元素在内存中是连续依次排列的 
 
二维数组,通常理解为是个平面,例如 int a[3][4],[3]表示列也就是坐标轴的x,[4]表示行也就是坐标轴的Y 
 
6指针与动态内存分配 
 
 
指针的定义:数据类型 * 变量名; 
 
指针 
 
指针就是地址,地址就是指针。 
 
指针变量存放的就是内存单元编号的变量,也可以说指针变量是存放地址的变量。 
 
指针和指针变量不一样,指针是地址,指针地址是存储地址的变量。 
 
 
基本类型指针 
 
int a=5; 
int * p; 
p=&a 
printf("%d",*p) 
int * p是指针变量,指针是地址,int a中的a就是地址,&a就是取a的地址也就是取a的指针。 
*p是取指针变量的存储的地址的值。 
指针和指针变量是不一样的。指针就是地址,地址是内存单元的编号。 
 
*的含义 
 
1.乘法 2.定义指针变量 int * p;int *是变量的数据类型,表示p只能存放int类型变量的地址 
3.指针运算符:该运算符放在定义好的指针变量前面,如果p是一个已经定义好的指针变量,那么*p,是取出指针p指向的地址的值。 
 
 
基本类型指针实现两个变量的值互换 
#include<stdio.h> 
void huhang(int * p,int * q) 
{ 
        int c; 
        c=*p; 
        *p=*q; 
        *q=c; 
} 
int main(void) 
{ 
        int a=1,b=2; 
        huhang(&a,&b); 
        printf("%d %d",a,b); 
        return 0; 
} 
 
2.指针和数组 
 
指针和一维数组 
    一维数组名 
          一维数组名是个指针常量,它存放的是一维数组的第一个元素的地址 
 
下标和指针的关系 
 
int a[5]={0,1,2,3,4}; 
        int * p; 
        p=a; 
        int i=1; 
        printf("%d\n",p); 
        printf("%d",*(p+i)); 
 
如果p是个指针变量,则p等价于*(p+i) 
 
int i=5; 
        int * p=&i; 
        int ** q=&p; 
        int *** m=&q; 
        ***m=10; 
 
        printf("%d",***m); 
 
动态内存分配函数malloc需要malloc.h 
 
int * p =(int *)malloc(int len) 
 
本语句分配两块内存,int * p是静态内存,占4个字节,另外一块是动态分配的,总共len个字节。 
malloc:  int * p = (int *)malloc(4) 
 
    1. 要使用malloc函数,必须添加malloc.h这个头文件 
    2. malloc函数只有一个形参,并且形参是整型 
    3. 4表示请求系统为本程序分配4个字节 
    4. malloc函数只能返回第一个字节的地址 
    5. 分配了8个字节, p变量占4个字节, p所指向的内存也占4个字节 
    6. p本身所占的内存是静态分配的, p所指向的内存是动态分配的    
 
 
int i =5; 
int * p=&i; 
 
free(p)把p指向的地址释放掉 
 
free():含义--->释放动态内存。freep(p)表示把p所指向的内存给释放掉。p本身的内存是静态的,不能由程序员手动释放。 
 
 
静态内存和动态内存的区别 
 
静态内存是由系统自动分配的,由系统自动释放,静态内存是在栈分配的。 
 
动态内存是由程序员手动分配,手动释放的,动态内存是在堆分配的。 
 
七、结构体 
声明结构体的形式 
 
struct 结构体名 
{ 
 
结构体成员 
 
}; 
 
 
 
结构体初始化的三种方式 
 
1.定义并初始化:struct 新数据类型的名字 结构体名字 = {结构体成员}; 
 
2.struct.新数据类型的名字 结构体名字; 
新数据类型的名字.成员1=数据 
新数据类型的名字.成员2=数据 
新数据类型的名字.成员n=数据 
 
3.struct.新数据类型的名字 结构体名字; 
 
  struct.新数据类型的名字 * 结构体名字=&结构体名字; 
 
  结构体名字->结构体成员=数据 
 
 
 |