C语言笔记

C语言的学习
C的令牌:关键字,标识符,常量,字符串值或者是一个符号
sizeof(type)得到对象或者类型的存储字节大小
FLT_MIN float类型的最小值
FLT_MAX float类型的最大值
FLT_DIG float类型的精度值
void *malloc(size_t size) 返回指向void的指针,可以转换为任何数据类型
C语言变量的基本类型:char int float double void
C语言对字母的大小写是敏感的
变量的声明和定义
变量的初始化(用一个等号完成的)
变量的声明和定义是不一样的
int i; 声明,也是定义   建立了存储空间
extern int i;声明,不是定义  不需要建立存储空间
extern关键字是声明变量而不是定义变量,所以除非有extern关键字,否则都是变量的定义
C中的左值(Lvalues)和右值(Rvalues)
C语言有两种类型的表达式:
1、左值(lvalue):指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或者右边。
2、右值(rvalue):术语右值(rvalue)指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边;
变量是左值
数值型的字面值是右值
常量又称为字面量
整数常量 浮点常量
定义常量:
1.使用#define预处理器
2.使用const关键字
#define identifier value
example:
#define LENGTH 20
const type variable = value
const int  LENGTH = 10
常量一般定义成大写字母形式,以此来区分

%d 输出数值的格式
%c  输出字符的格式

C存储类
auto  所有局部变量默认的存储类
register 定义存储在寄存器中而不是RAM中的局部变量,意味着变量的最大尺寸等于寄存器的的大小,且不能对它应用一元的'&'运算符(因为它没有内存位置)
static  指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域事进行创建和销毁。因此,使用static修饰局部变量可以在函数调用之间保持局部变量的值
   也可以应用于全局变量,当static修饰全局变量时,会使变量的作用域限制在声明它的文件内
   是全局变量的默认存储类型
extern  提供一个全局变量的引用,全局变量对所有的程序文件都是可见的

C语言中for循环、while循环都可以按Ctrl+C来终止一个无限循环

C函数
主函数 main()
函数声明告诉编译器函数的名称,返回类型和参数;
函数定义提供了函数的实际主体;
内置函数:
strcat() 用来连接两个字符串;
memcpy() 复制内存到另外一个位置;
函数叫法很多:方法、子例程或者程序;

定义函数:
return_type  function_name(parameter list){
 body of the function
}

函数声明:
告诉编辑器函数名称及如何调用函数
函数的实际主体可以单独定义
在一个源文件中定义函数且在另一个文件中调用函数时,函数声明是必需的,在这种情况下,应该在调用函数的文件顶部声明函数;
return_type function_name(parameter list);

int max(int num1,int num2);

int max(int,int);

函数声明中参数名称并不重要,只有参数类型是必须的;

调用函数:
当程序调用函数时,程序控制权会转移给被调用的函数,被调用的函数执行以定义的任务,当函数的返回语句被执行时,会到达函数的结束括号时,会把程序控制权交还给主函数。

函数参数:
形参:如果函数要使用参数,则必须声明接受参数值的变量,这些变量称为函数的形参;
   形参就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁;
两种向函数传递参数的方式:
传值调用 将实参赋值给函数的形参,修改形参不会影响实参;
引用调用 通过指针传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行操作。

C作用域规则
1.在函数或块内部的局部变量; 内部调用
2.在所有函数外部的全局变量; 程序顶部调用 可以和局部变量一样,但是会被局部变量覆盖
3.在形式参数的函数参数定义中; 被当作函数内部的局部变量,会优先覆盖全局变量
局部变量被定义时,系统不会自动对其初始化,需要自行对其初始化;
全局变量被定义时,系统会自动对其进行初始化;
数据类型   初始化默认值
int     0
char    '\0'
float    0
double    0
pointer    NULL

C指针
指针:表示了变量在内存中的地址;
每个变量都有一个内存地址,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址;

指针的定义:指针是一个变量,其值是另外一个变量的地址,即内存位置的直接地址。
指针声明:
type *var-name;
type是指针的基类型,它必须是一个有效的C数据类型,var-name是指针变量的名称。用来声明指针的星号*是用来制定一个变量的指针。
所有指针的值的实际数据类型,不管是整型,浮点型,字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的十六进制数。不同数据类型的指针之间唯一不同的是,指针所指向的变量或常量的数据类型不同。
指针的相关操作:
定义一个指针;
把变量的地址赋值给指针;
访问指针变量中可用地址的值;
通过使用一元运算符*来返回位于操作数所指定地址的变量的值。
#include <stdio.h>

int main(){
 int var = 20;
 int *ip;
 
 ip = &var;
 
 printf("Address of var variable:%x\n",&var);
 
 printf("Address store in ip variable:%x\n",ip);
 
 printf("value of *ip variable:%d\n",*ip);
 
}

C中的NULL指针:
在声明变量的时候,如果没有确切的地址可以赋值,为指针变量赋一个NULL值是一个良好的编程习惯,赋为NULL值的指针被称为空指针。
NULL指针是一个定义在标准库中的值为零的常量;

访问地址为0的内存,在很多系统上是不允许的,因为该内存是操作系统保留的。
内存地址0有特别重要的意义,它表明该指针不指向一个可访问的内存位置。

C函数指针与回调函数
函数指针:指向函数的指针变量。
函数指针可以像一般函数一样,用于调用函数,传递参数。
typedef int(*fun_ptr)(int,int); //声明一个指向同样参数,返回值的函数指针变量

#include <stdio.h>

int max(int x,int y){
 return x > y ? x : y;
}

int main(void){
 int (*p)(int, int) = &max;  //&可以省略
 int a, b, c, d;
 
 scanf("%d %d %d",&a,&b,&c);
 
 d = p(p(a,b),c);
 
 printf("最大的数字是:%d\n",d);
 return 0;
}

回调函数:
函数指针作为某个函数的参数

C结构体
数组允许定义可存储相同类型数据项的变量;
结构是C编程中另一种用户自定义的可用的数据类型,允许存储不同类型的数据项;

定义结构体,必须使用struct语句
格式如下:
struct [structure tag]{
 member definition;
 ……
 member definition;
}[one or more structure variables]

访问结构成员
成员访问运算符(.)

指向结构的指针
定义: struct Books *struct_pointer
指针变量中存储结构变量的地址,为了查找结构变量的地址,请把&运算符放在结构名称的前面。
struct_pointer = &Book1;
为了使用指向该结构的指针访问结构的成员,使用—>运算符
struct_pointer—>title;

位域(或位段)
所谓"位域"是把一个字节中的二进位划分成几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位来表示。

典型案例:
用1位二进位存放一个开关量时,只有0和1两种状态。
读取外部文件格式——可以读取非标准的文件格式。例如:9为的整数。
定义:
struct 位域结构名{
 位域列表
};
其中位域列表的形式为:
类型说明符 位域名:位域长度
1)一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一个位域时,应从下一个单元起存放该位域,也可以有意使某位域从下一单元开始(添加无名位域);
2)位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度;
3)位域可以是无名位域,这是它只用来作填充或调整位置。无名位域是不能使用的。
位域的使用:
位域变量名.位域名
位域变量名->位域名(指针)

C字符串
操作字符串的函数:
strcpy(s1,s2)   复制字符串s2到字符串s1
strcat(s1,s2)   连接字符串s2到字符串s1的末尾
strlen(s1)    返回字符串s1的长度
strcmp(s1,s2)   如果s1和s2相同则返回0;如果s1>s2则返回大于0;否则返回小于0;
strchr(s1,ch)   返回一个指针,指向字符串s1中字符ch的第一次出现的位置
strstr(s1,s2)   返回一个指针,指向字符串s1中字符串s2的第一次出现的位置
  
C共用体
共用体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。
可以定义一个带有多成员的共用体,但是任何时候只能给一个成员带有值。
union语句定义共同体
共用体占用内存应足够存储共用体中最大的成员
访问共同体,用成员访问运算符(.)

C typeof
关键字typeof,用来为类型取一个新的名字;
typeof unsigned char BYTE;
BYTE b1,b2;
d定义时,会用大写字母,但是也可以使用小写字母
也可以为用户自定义的数据类型去一个新的名字。比如结构体

typeof vs #define
#define是C指令,用于为各种数据类型定义别名,域typedef类似;
不同点:
1)typedef仅限于为类型定义符号名称,#define不仅可以为类型定义别名,也能为数值定义别名,比如可以定义1为ONE;
2)typedef是由编译器执行解释的,#define语句是由预编译器进行处理的;

C的输入&输出
C语言把所有的设备都当作文件,所以设备(比如显示器)被处理的方式与文件相同。以下三个文件会在程序执行时自动打开,以便访问键盘和屏幕;
标准文件  文件指针 设备
标准输入  stdin  键盘
标准输出  stdout  屏幕
标准错误  stderr  您的屏幕

文件指针是访问文件的方式。

C的输入和输出
所有C都需要main()函数,代码从main函数开始执行。
printf()用于格式化输出到屏幕。printf()函数在头文件中声明。
stdio.h标准输入输出头文件,#include是一个预处理命令,用来引入头文件。
return 0;用于表示退出程序。
%d 格式化输出整数
%f 格式化输出浮点数

getchar()&putchar()函数

gets()&puts()函数

scanf()&printf()函数

C文件读写
打开文件:fopen()
关闭文件:fclose()
写入文件:fputs()
读取文件:fgetc()

二进制I/O函数
size_t fread(void *ptr,size_t size_of_elements,size_t number_of_elements,File *a_file)

size_t fwrite(const void *ptr,size_t size_of_elements,size_t number_of_elements,File *a_file)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值