您的位置:首页 > 编程语言 > C语言/C++

C语言基础知识总结

2016-07-03 11:41 176 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/lightTank/article/details/51814574

1.UNIX指令
UNIX命令行的一些常用指令:
个人目录:/User/apple
1).pwd 显示终端操作的(当前)文件夹
2).ls 或者 ls -l 列出当前文件夹下的文件及目录
3).cd 切换工作路径 eg:cd /Users/apple/Desktop
4).cd ../ 返回上一个目录
5).cd / 返回根目录
6).mkdir 新建文件夹/目录
7).touch 新建文件夹
8).rm 删除文件
9).rmdir 删除文件夹
10).clear 清楚屏幕上信息
11).say 调用语音功能,将接下来输入的文字阅读出来

2.编译链接运行
1).cc -c 编译 eg:cc -c main.c
2).cc 链接 eg:cc main.o
3).编译链接一起 eg:cc main.c
4)../a.out 运行(或者直接把a.out文件直接拖进终端再按enter键执行)
5)cc a.0 b.o 将a.o和b.o链接为a.out可执行文件

编译:首先检查源程序(.c)是否有语法错误,如无则将源程序编译成二进制目标文件(.o),有则报错
链接:将目标文件添加启动代码生成a.out二进制可执行文件(即将项目中所有相关链的.o的目标文件以及C语言函数库合并在一起,生成可执行文件)

没有主函数:
Undefined symbols for architecture X86_64”_main”,referenced

如果程序出现警告,程序仍然可以编译成功

注:如果test函数写在main的下面,c99编译会警告,可以链接成功!

3.关键字 标识符
关键字:C语言提供的有特殊含义的符号,也叫做”保留字”,C语言共提供了32个关键字
32个关键字:
基本数据类型:(共5个)
char:用于定义字符型常量或函数返回值类型
int:用于定义整型变量或函数
float:用于定义浮点型(实型)变量或函数返回值类型
double:用于idngyi双精度浮点型的变量或函数返回值类型
void:空类型,用于什么函数无返回值或者无参数,声明无类型指针
类型修饰关键字:(共4个)
short:什么一个短整型的变量或函数返回值类型
long:声明长整型的变量或函数返回值类型
signed:声明有符号型变量(默认)或函数返回值类型
unsigned:声明为无符号型变量或者或函数返回值类型
(注意:区分有无符号是看最高位是否为符号位)
流程控制关键字:(共12个)
条件判断:(共6个)
if:条件语句,后面不需要加分号
else:条件语句否定分支(与if连用)
switch:开关语句(多重分支语句)
case:开关语句中的分支标记
default:开关语句中的”其它”分支,可选
goto:无条件跳转语句
循环结构:(共5个):
do:do循环结构 do 1 while (2),
while:while循环结构 while (1) 2,
for:for循环结构 for(1;2;3)4,
continue:结束当前循环,开始下一轮循环
break:跳出当前循环或switch结构
返回语句:(共1个)
return:用在函数体中,返回特定值(或者是void值,即不返回值)
构造类型关键字:(共3个)
enum:声明枚举变量
struct:声明结构体类型
union:定义共用体类型
存储类型关键字:(共4个)
auto:自动变量
static:静态变量
register:寄存器变量
extern:声明对应变量为外部变量(声明变量或函数是在其它文件或者本文件的其它位置)
其它关键字:(共4个)
sizeof:计算数据类型长度
typedef:类型别名
const:声明只读变量
volatile:强制编译器每次从内存中取得该变量的值(说明程序执行中可隐含的改变)

标识符:程序中自定义的一些符号和名称

关键字与标识符的区别:关键字是C语言默认提供的符号,标识符是程序员自定义的

命名规范:1.见名知意.
2.多个单词命名采用驼峰命名法

4.数据
静态数据:永久性的数据,一般存储在硬盘中,以文件的形式存在

动态数据:程序运行时产生的临时数据,一般存储在内存中
基本类型:char int float double……
指针类型:void *………
空 类型:void
构造类型:数组 struct union enum………

5.常量与变量:
常量:程序执行过程中,其值不会改变的量
变量:程序执行过程中,其值会改变的量
const修饰变量:表示只读,只能在定义变量的同时赋值 eg:const int a = 0;

6.数据类型所占用字节数
编译器
数据类型 16位 32位 64位
short 2 2 2
int 2 4 4
long 4 4 8
long long 8 8 8
char 1 1 1
float 4 4 4
double 8 8 8

sizeof可计算数据类型所占用字节数

7.流程控制
选择结构:
1).if语句:
特点:1.在同一时间,只有一个大括号的代码会被执行
2.如果已经判断到某个else if的条件来,说明前面的所有条件都不成立
使用建议:不要省略大括号
2)switch语句:
特点:1.如果每个case后面都有break,那么同一时间只有一个case后面的语句被执行
2.如果某个case后面没有break,那么就好继续顺序执行,直到遇到break或者函数体执行完毕
3.如需在case后面定义新变量,必须加上大括号{}
if 和 switch 对比:
1).switch能实现的功能,if读能实现
2).if能实现的功能,switch不一定能够实现
3).if更灵活,实用性更大

循环结构:
for循环:
特点:1.如果在循环体里定义变量,不能省略大括号,且这边变量的作用域仅限于这个大括号内
2.初始化语句只会执行一次,在执行完一次循环后可以忽略
while循环:
特点:如果条件一开始就不成立,循环体就永远不会执行
do while循环:
特点:不管条件是否成立,都会先执行一次
三种循环对比:
1).for循环等价于while循环,建议次数确定时用for循环,次数不确定时用while循环
2).for循环开发中使用最多

continue:结束当前循环,开始下一轮循环
break:跳出当前循环或switch结构

8.函数
函数:实现特定功能的代码块,从定义来看分为库函数(编译系统提供)和用户自定义函数两种
函数声明:声明函数的存在
#include:(文件包含指令,编译前执行)拷贝文件内容到当前位置,一般只用来包含.h文件

9.构造类型:由一种或者多种数据类型组成的类型

10.数组与函数
1).当数组作为函数形参时,数组元素个数可以省略
2).当数组作为函数形参时,传递的是数组的地址,array和ages共用一块存储空间
3).在函数内部结束形参数组所占的字节数时,永远是8(64bit),因为系统会将形参数组转为指针类型,指针类型永远只占8个字节

11.字符串
‘\0’作为字符串的结束标记,也用来计算字符串的长度

12.指针与数组
指针:
定义:用来存储其它变量地址的变量
作用:只要给指针一个地址,就能根据地址找到对应的存储空间
注意:指针变量建议初始化后再使用
指针用来存储地址,不要随便赋值
指针类型只能存储同类型的变量地址
任何指针变量读占用8个字节的存储空间

数组名与指针的区别:
1).如果p指向数组的一个元素,则p+1指向该元素的下一个元素
2).不同类型的数组元素,p的改变是不同的
p+1加来多少取决于指针的类型 char * 1
int * 4
4000 double * 8
long * 8
3).p+i和a+i都能表示元素a[i]的地址,(p+i)和(a+i)都能表示元素a[i]
4).p可以改变自身的值,p++,但是a不可以,a是一个代表数组首地址的常量

13.指针与字符串
字符串即字符数组,故指针也可以操作字符串
直接指向字符串的指针是不可变的 eg:char *name=”apple”
指向字符串数组的指针是可变的 eg:char name[]=”apple”
需掌握的知识点:
1).指针变量的定义
2).利用指针间接操作其它变量的数据
3).掌握p+1的含义
4).区别两张字符串的存储方式
清空指针分两种:
p = 0;
p = NULL;

14.指针与函数
返回指针的函数:返回值为指针类型的函数
指向函数的指针:指针指向函数

15.局部变量与全局变量
相同点:都是变量,都是在内存中开辟一块空间来存储数据
不同点:
1).声明位置不同:局部变量声明在函数内部,而全局变量声明在外部
2).作用域不同:局部变量仅作用于声明后的函数内部,全局变量从书写指令的那一行开始到文件结束
3).默认值不同:局部变量不初始化就是个随机数,全局变量初始默认为0,char默认为’\0’
4).创造和回收时间不同:局部变量是CPU执行到局部变量的代码时才会在内存中声明,当作用域结束后,自动回收;全局变量在程序启动时就会在内存中创建全局变量,程序结束时才会被回收

16.结构体(属于构造类型)
1).结构的基本使用
struct Student
{
char *name;
int age;
char *sex;
int height;
}

struct Student s = {“tom”,12,”男”,1.66f}
struct Student s1 = {.name = “sandy”,age = 32,.sex = “女”,.height = 1.22f}
2).结构的补齐算法:sizeof计算结构体所占用的存储空间时,返回值必须是最大成员的倍数
3).结构体不能重复定义,结构体的名称不能重复
4).作用域:全局变量和局部变量
5).初始化后不能再一次赋值
struct Student s = {“tom”,12,”男”,1.66f}
s = {“sandy”,23,”女”,1.66f} //错误
struct Student s1 = {{“sandy”,23,”女”,1.66f}} //正确

17.结构体和函数,指针的关系
1).结构体作为函数参数时,只是成员的值传递,修改函数内部的函数体并不影响外面的结构体
2)指向结构体的指针

18.枚举
1).定义枚举类型
enum season{spring,summer,autumn,winter}
2).利用定义好的枚举类型定义一个枚举类型变量
enum season s = summer;
C语言会将枚举元素(spring,summer等)作为整型常量处理,称为枚举常量

19.数据类型总结
1).基本类型:int short long….
2).构造类型:
a.数组:
1.所有元素都是同一种类型
2.每个元素都是有顺序的
3.通过下标来表示元素的位置,下表从0开始

b.结构体:
1.可以有不同类型的数据类型组成
2.利用"."运算符来访问成员
c.枚举类型:当一个变量只有几个固定的取值时,就可以使用枚举类型来定义变量

3).指针类型:
1.使用场合:如果需要间接修改某个变量的值
2.掌握:
a.定义指针的类型的变量
b.利用正在变量间接修改其它变量的值
c.看懂返回指针函数和指向函数的指针
d.利用指针变量来存储字符串 eg:char *name = “apple”

20.预处理指令:在编译之前执行的指令
种类:宏定义,条件编译,文件包含
特点:
1).都是以”#”开头
2).指令后面不加分号
3).作用域:从书写指令的那一行开始到文件结束
4).速写位置随意
宏定义:#define
a.不带参的宏定义
#define COUNT 4
宏替换
b.带参数的宏定义
#define PING_FANG(x) ((x)*(x))
c.#undef取消定义
#undef COUNT

条件编译:让程序中的某一段代码,在满足一定的条件时才进行编译,不满足条件则不参与编译
a.条件的小括号可以省略
#if(COUNT = 1)
printf(“COUNT == 1”);
#elif(COUNT = 2)
printf(“COUNT == 2”);
#else
printf(“COUNT为其它值”);
#endif
注意:#endif必须写,不然后果严重
b.ifdef和#ifndef
#ifdef COUNT (#if define(COUNT))
printf(“COUNT这个宏存在”);
#endif

#ifndef
#ifdef COUNT (#if !define(COUNT))
printf("COUNT这个宏存在");
#endif

文件包含:#include
1).不能递归包含:自己包含自己
2).不能交叉包含:你包含我,我包含你
3).防止重复包含
#ifndef TUDIO _H(文件名)
#define STUDIO_H
int summer(int,int);
…其它声明……
#endif

21.typedef的使用与#define的区别
typedef用法:
1).可以给各种数据类型起一个兴的名字,就是区别名,通俗的说就是”外号”
2).可以给基本类型取别名:指针类型(指向函数的指针),枚举类型
3).每次定义结构类型的变量,前面毒药加struct很麻烦,typedef可以简化
4).#define也可以取别名,但两者有区别

typedef int Mylnt // 给int类型取来一个别名

typedef和#define的区别:
都能给类型取别名
typedef char *String1;
#define String2 char*;

1).如果只定义一个变量,没什么区别
2).如果定义多个变量,如果是宏定义,则第一个变量的类型与后面的变量不同

string1 name1,name2;
相当于char* name1 char* name2

string2 name1,name2;
相当于char* name1 char name2

//Student可以省略
typedef struct Student
{
int age;
int no;
}stu;
//seasonke可以省略
typedef enum season{spring,summer,autumn,winter} myseason

22.冒泡排序
void sortArray()
{
int arr[] = {1,3,8,2,45,12,1,65,88,23};
int len = sizeof(arr) / sizeof(int);

//每趟排序都会确定一个数,所以需要再循环len-i吃,但因为每次都是相邻的两个数进行对比,为了a[j+1]不越界,让j循环到len-i-1时停止
for(int i = 0;i < len - 1;i++)
{
for(int j = 0;j < len - i -1;j++)
{
int temp;
//如果条件满足,交换a[j]和a[j+1]两个相邻数的值
if(arr[j] > arr[j + 1])
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}

}

23.选择排序
//每一趟都是拿着一个元素与后面的其它元素进行比较,找出最小值
void selectSort(int array[],int len)
{
//确定需排序趟数
for(int i = 0;i < len - 1;i++)
{
//每一趟怎么处理
for(int j = i + 1;j < len;j++)
{
if(array[i] > array[j])
{
int temp = array[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}

24.static和extern
1).函数:函数默认是外部函数,extern可以不写,不同文件都可以访问。static修饰函数是内部函数,默认只可以在本文件内访问
2).全局变量:它可以分为外部变量和内部变量,extern声明一个外部变量,其他文件可以访问,static声明一个内部变量,只允许本文件访问
3).局部变量:extern不可以修饰局部变量,static修饰的局部变量,只会初始化一次,延长变量的生命周期

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: