c语言基础知识总结

计算机语言发展进程:

机器语言----汇编语言----高级语言

c语言的程序结构:

(1)一个程序由一个或多个源程序文件组成
<1>预处理指令
<2>全局声明
<3>函数定义
(2)函数是c语言的主要组成部分
(3)一个函数包括两个部分
<1>函数的头部
<2>函数体(声明部分和执行部分)
(4)程序总是从main函数开始执行到main函数结束
(5)指令计算机完成操作是由c语句完成的
(6)每个数据声明和语句的最后要有分号
(7)c语言本身不提供输入输出语句
(8)程序应当有注释

程序=算法+数据结构

(1)三种基本结构:循环结构,顺序结构,选择结构
(2)常量分为:整型常量,实型常量,字符常量
(3)数据类型:基本类型,枚举类型,空类型,派生类型
(4) 基本类型:整型类型和浮点类型
<1>整形类型:基本整型,短整型,长整型,字符型,布尔型,双长整型
<2>浮点类型:单精度浮点类型,双精度浮点类型,复数浮点型
(5)派生类型:指针类型,数组类型,结构体类型,共用体类型,函数类型
(6)强制类型转换在数据前面加(里面放要转换的类型)
(7)赋值运算符的优先级最低
(8)格式字符:%s(输出字符串),%c(输出单个字符),%d(输出整型),%f(输出浮点类型),%o(输出八进制数),%x(输出十六进制数),%i(同%d),%e(指数形式输出)
注意:(如果利用键盘外部输入字符串句子,系统会将空格当作结束标志,不再输出后面的句子,所以需要循环,如果在程序内部存在字符串句子,不用输入,那么,句子就会被完整输出)
(9)字符输入输出函数:getchar(),putchar()
(10) 逻辑运算符:||(或),&&(且),!(非)
(11)switch选择语句(缺点是选择过多的话,比较麻烦),if选择语句
(12)do while循环结构,while循环结构,for循环结构(两种都可以,灵活运用)
(13)for(;;)和 while(1)为无限循环体
(14)break终止该循环过程(若为多层循环,只终止一次内循环进程)continue终止当前循环,不终止总进程
(15)判断素数n:只要让n分别除2到sqrt(n)中每个数,如果都不能整除,则n为素数
(16)求最大公约数:先选两数中最小的数,让两数依次除它,若都无法整除,则让其减一,直到求出
(17)求最小公倍数:先选两数中最大的数,让它依次除两数,若都无法整除,则让其加一,直到求出
(18)倒序输出:依次除10,再除余
(19)水仙花数:分别输出各个位数,如何让其三的立方相加
(20)二分法:先确定零点在哪个大范围附近,然后将最大数赋给max,最小数赋给min,mid为其中间数,然后确定零点与mid的大小,若大,则将min=mid,反之亦然,然后循环往复,直到小于e-6
(21)打印图形:循环打印,控制量的变化,找出规律
(21)求出最大数或最小数:让第一个数最大,然后采用打擂台方法求出

数组

(1)一维数组
(2)二维数组
二维数组的行列互换:a[ i ][ j ]=b[ j ][ i ]
冒泡排序法:让第一个数与后面的数依次继续比较,若大于后面的数,则交换,然后让下一个第一个数与后面的数依次比较,比较次数依次减一
选择排序法:让相邻的两个数进行比较,然后选择性的换位
(3)字符数组
(4)字符串函数:strlen()(计算字符串长度),strcmp( , )(比较两字符串的大小),strcpy()和strncpy( , )(复制字符串),strcat( , )(字符串的连接),gets(填入起始地址)(输入字符串),puts(填入起始地址)(输出字符串),strlwr()(转换为小写函数),strupr(转换为大写函数)
(5)字符数组的应用举例:判断输出的单词数:利用‘\n’判断循环是否终止,然后判断‘ ’空格是否存在,如果存在word = 0,否则,word = 1,并计数

函数调用

(1)函数定义类型:void,int,float,double,long ,stort,long long等等
(2)函数的声明:计算机是从上到下检索的,所以要将调用的函数放在函数前面,如果未这样做,那么就需要声明函数,注意声明部分要有分号
(3)头文件:有些函数的调用需要有相应的库函数信息才能调用,因此需要在程序的开头写入相应头文件
(4)两个经典调用方式:1,递归调用 2,嵌套调用
<1>嵌套调用就是在调用的函数中再次调用另一个函数
<2>递归调用就是在调用的函数中再次调用本函数,直到不满足条件而终止
递归调用的两个用法:
<1>在调用本函数过程中对自己本身进行处理
<2>在调用本函数过程中不对本身进行处理,另设函数处理

计算n的阶层:实现一可以计算n的阶层函数,在主函数中调用其函数,其函数体为如果n为1 ,则终止循环,否则,例,fab(n)=fab(n-1) n


(5)局部变量和全局变量:
变量和函数有两个属性:数据类型和数据存储类别


<1>作用域:内部定义的函数只在本函数内部有效,而外部定义的函数可以在其他函数内部有效,同时主函数不能使用其他函数定义的变量
<2>局部变量存储类别:auto 变量,static 变量,register 寄存器变量
<3>全局变量存储类别:extern(拓展外部变量的作用域,小心使用)
<4>生存期:即变量存在的时间,有的变量一直存在,有的变量是在调用其所在函数时才被临时分配存储单元的,调用结束后该存储单元马上释放了


指针

地址指向变量单元,地址被称为指针
(1)指针变量:将变量地址存放在另一变量的地址
(2)指针变量必须指定基类型(因为不同类型的数据在内存中存储的字节数和存放方式是不同的
(3)指针变量作为函数参数:在函数调用时只要将函数的首地址带入,然后参数为指针变量
(4)通过指针引用数组:数组元素的指针就是数组元素的地址


a[ i ] = *(a+i)
方式有以下几种:

<1>直接将数组首部地址存放

int *p;
int a[2] = {0,1};
p = &a[0];

或者

int *p;
p = a;

<2>指针法引用

int *p;
int a[2] = {0,1}
*(p+0) = a[0];

<3>通过运算符提高效率

int *p;
int a[2] = {0,1};
for(p = a; p < (a+1); p++)

(5)多维数组元素的地址
a[ i ][ j ]
a代表是二维数组首元素的地址;
a[1]代表是二维元素第二行的元素地址
a[1][2]代表是二维元素第二行第三列的元素地址

 a[i][j] = *(a+i)+j
而*(*(a+i)+j)为数组的值

(6)通过指针引用字符串
以下情况

char str[] = "I am a student ";
char *string = "I am student";

注意以下是把第一个字符地址赋给指针变量string

char *string;
string = "I am student";

系统自动输出第一个字符,然后string加一
,指向下个字符,直到’\n’, 输出形式为

printf("%s",string);

字符数组与字符指针变量的区别:
1)字符数组本身就是存放多个字符,而字符指针变量只是取了字符串第1个字符的地址
2)可以对指针变量赋值,但不能对数组名赋值

例如

char *p;
p = "asa";//合法
char a[14];
a[0] = 'j';//合法
a = "sdaskd";//不合法,不能够对数组名进行赋值

3)对初始化的含义不同
例如

char *a="I am student"--->char *a; a = I am student";

而对于数组

char a[14];
a[] = "I am student";//不合法的

不能够把字符串全部赋给字符数组,
但是,可以单个赋给字符数组//
4)编译时为字符数组分配若干个存储单元,而对字符指针变量只分配一个存储单元
5)指针变量的值是可以改变的,而字符数组名代表的是一个固定的值

char *a = "I am student" ;
a = a + 7;///改变指针变量的值,即改变了指针变量的指向
printf("%s",a);//从指针变量所指向的值开始输出
return 0;

6)字符数组中的值是可以改变的,而字符指针变量指向的字符串常量是不可改变的,因为指针变量单单是指向地址,无法改变其地址本身的数据
7)如果定义了字符指针变量,并且使它指向数组,那么它就可以用带下标的形式引用数组
8)用指针变量指向一个格式字符串,可以用他来代替printf

char *f;
f = "sss";
printf("%s", f);

代替

char *f;
f = "a = %s,b = %f\n";
printf(f ,a ,b );

这种printf被称为可变式格式输入
(7)指向函数的指针
<1>函数名是该函数的起始地址
<2>指向函数的指针变量只能指向函数的起始地址,所以不能用*(p+1)表示下一地址

c=(*p)(a,b)===== c=max(a,b);

<3>指向函数的指针变量是无法进行算术运算的

  • 类型名(指针变量名)(参数表列);
  • 总结:运用时先声明,然后将函数首地址给它,最后调用指针变量指向函数即可
void fun(int (*q)(int ,int), int (*p)(int ,int))
{
    int a,b,i=3,j=5;
    a = (*q)(i,j);
    b = (*p)(i,j);
}

(7)返回指针值的函数
//注意被调用函数的开头应该有指针,返回指针
(8)指针数组和多重指针
一个数组,若其他元素均为指针类型数据,则称为指针数组
如 int *p[4]
指向指针数据的指针变量,称为指向指针的指针
指针数组中的每个元素都是指针.
而指针数组为指针变量;
指向指针数组的指针为指向指针数据的指针变量
(9)动态内存分配与指向它的指针变量
<1>非静态的局部变量都是分配在内存的动态存储区,区被称为栈区//
有些数据不必在程序声明的部分定义,也不必等到程序结束后释放,随时开辟,随时释放,这些特别的自由的存储区,被称为堆区//
<2>建立内存的动态分配:void *malloc(unsigned int size);
void *calloc(unsigned n, unsigned size);
void realloc(void p,unsigned int size);
void free(void *p);

int n[10];
int c = sizeof(n)/sizeof(n[0]);//数组长度
a =(int*) malloc(c * sizeof( int ));//开辟动态存储区

建立数据类型

<1>结构体:结构体是由一批数据组合而成的一种新的数据类型。组成结构型数据的每个数据称为结构型数据的“成员”。
<2>共用体:共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型,您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值,共用体提供了一种使用相同的内存位置的有效方式。

union [union tag]
{
   member definition;
   member definition;
   ...
   member definition;
} [one or more union variables];

<3>枚举类型:如enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };
Mon、Tues、Wed 等都是常量,不能对它们赋值,只能将它们的值赋给其他的变量。
枚举列表中的 Mon、Tues、Wed 这些标识符的作用范围是全局的(严格来说是 main() 函数内部),不能再定义与它们名字相同的变量。
文件
在实际的情况下,常常要把一些数据输出到磁盘上保存起来,在需要时送入内存之中这就需要我们用到磁盘文件。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值