C语言的一些总结

printf() 用于格式化输出到屏幕。printf() 函数在 “stdio.h” 头文件中声明,stdio.h 是一个头文件 (标准输入输出头文件) ,当编译器遇到 printf() 函数时,如果没有找到 stdio.h 头文件,会发生编译错误。

#include 是一个预处理命令,用来引入头文件。

所有的 C 语言程序都需要包含 main() 函数,代码从 main() 函数开始执行。return 0; 语句用于表示退出程序。

//表示注释,/* */多行注释。

C语言的优势:结构化语言、处理底层、高效率、多平台编译、 最广泛系统程序设计语言。

C 程序主要包括以下部分:预处理器指令、函数、变量、语句 & 表达式、注释。

C 程序由各种令牌组成,令牌可以是关键字、标识符、常量、字符串值,或者是一个符号。

C 标识符是用来标识变量、函数,或其他自定义名称。以字母或下划线开头,由数字、字母、下划线组成。

C 程序中,分号是语句结束符,多个标识符之间用逗号分隔。

C 是区分大小写的编程语言。

C中保留字(32):auto(声明自动变量)、break、case、char(声明字符型变量或函数返回值类型)、const(声明只读变量)、continue、default(开关语句中的"其它"分支)、do、double(声明双精度浮点型变量或函数返回值类型)、else、enum(声明枚举类型)、extern(声明变量或函数是在其它文件或本文件的其他位置定义)、float(声明浮点型变量或函数返回值类型)、for、goto(无条件跳转语句)、if、int(声明整型变量或函数)、long(声明长整型变量或函数返回值类型)、register(声明寄存器变量)、return(子程序返回语句(可以带参数,也可不带参数))、short(声明短整型变量或函数)、signed(声明有符号类型变量或函数)、sizeof(计算数据类型或变量长度(即所占字节数))、static(声明静态变量)、struct(声明结构体类型)、switch(开关语句)、typedef(用以给数据类型取别名)、unsigned(声明无符号类型变量或函数)、union(声明共用体类型)、void(声明函数无返回值或无参数,声明无类型指针)、volatile(说明变量在程序执行中可被隐含地改变)、while

数据类型:整数类型和浮点类型、枚举类型、void 类型(表明没有可用的值)、派生类型(指针类型、数组类型、结构类型、共用体类型和函数类型),函数的类型指的是函数返回值的类型。

整数类型:char(1)、int(2/4)、short(2)、long(4)

使用 sizeof 运算符,表达式 sizeof(type) 得到对象类型的存储字节大小

%lu 为 32 位无符号整数

浮点类型:float(4)、double(8)、long (16)
%E 为以指数形式输出单、双精度实数

void 类型:不返回值的函数的返回类型为空、不带参数的函数可以接受一个 void、类型为 void * 的指针代表对象的地址,而不是类型

C 语言中如果一个表达式中含有不同类型的常量和变量,在计算时,会将它们自动转换为同一种类型

变量是程序可操作的存储区名称。C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局。

变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。

变量可以在声明的时候被初始化(指定一个初始值)。

不带初始化的定义:带有静态存储持续时间的变量会被隐式初始化为 NULL(所有字节的值都是 0),其他所有变量的初始值是未定义的。

如果需要在一个源文件中引用另外一个源文件中定义的变量,只需在引用的文件中将变量前加上 extern 关键字。

变量是左值,因此可以出现在赋值号的左边。数值型的字面值是右值,因此不能被赋值,不能出现在赋值号的左边。

常量是固定值,可以是任何的基本数据类型,比如整数常量、浮点常量、字符常量,或字符串字面值,也有枚举常量。

整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。

换行符(\n)或制表符(\t)

字符串常量是括在双引号 “” 中的。

C 中,有两种简单的定义常量的方式:使用 #define 预处理器;使用 const 关键字。

#define WIDTH  5
 const int  LENGTH = 10;

把常量定义为大写字母形式

C存储类:auto 存储类是所有局部变量默认的存储类,auto 只能用在函数内,即 auto 只能修饰局部变量。

register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。

使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。

当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。

全局变量可以在函数内使用,局部变量使用 static 修饰后,不会在每次调用时重置。

extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。

算术运算符(+、-、、/、%、++、–)、关系运算符(==、!=、>、<、>=、<=)、逻辑运算符(&&、||、!)、位运算符(&、|、、~、<<、、>>)、赋值运算符(=、+=、-=、*=、/=、&=、%=、>>=、<<=、|=、=)和其他运算符(&、(*a; 将指向一个变量)、?:条件表达式)

a++ 与 ++a 的区别:先赋值后运算;先运算后赋值

C 语言把任何非零和非空的值假定为 true,把零或 null 假定为 false。

switch 语句中的 expression 是一个常量表达式,必须是一个整型或枚举类型。每个 case 后跟一个要比较的值和一个冒号。

嵌套 switch 语句,即使内部和外部 switch 的 case 常量包含共同的值,也没有矛盾。

用 for(;? 结构来表示一个无限循环 ,Ctrl + C 键终止一个无限循环。

循环:while循环、for循环、do…while循环、嵌套循环

控制语句:break、continue、goto

函数声明告诉编译器函数的名称、返回类型和参数。函数还有很多叫法,比如方法、子例程或程序,等等。

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

当您在一个源文件中定义函数且在另一个文件中调用函数时,函数声明是必需的。在这种情况下,您应该在调用函数的文件顶部声明函数

函数参数:传值调用、引用调用(通过指针传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。)

C 语言中有三个地方可以声明变量:在函数或块内部的局部变量、在所有函数外部的全局变量、在形式参数的函数参数定义中

在程序中,局部变量和全局变量的名称可以相同,但是在函数内,如果两个名字相同,会使用局部变量值,全局变量不会被使用。

函数的参数,形式参数,被当作该函数内的局部变量,如果与全局变量同名它们会优先使用。

**区别:**全局变量保存在内存的全局存储区中,占用静态的存储单元;
局部变量保存在栈中,只有在所在函数被调用时才动态地为变量分配存储单元。

当局部变量被定义时,系统不会对其初始化(赋值),您必须自行对其初始化。定义全局变量时,系统会自动对其初始化

C 中要声明一个数组,需要指定元素的类型和元素的数量

大括号 { } 之间的值的数目不能大于我们在数组声明时在方括号 [ ] 中指定的元素数目。

数组元素可以通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后边。

传递数组给函数:形式参数是一个指针、形式参数是一个已定义大小的数组、形式参数是一个未定义大小的数组

从函数返回数组:C 语言不允许返回一个完整的数组作为函数的参数,,可以通过指定不带索引的数组名来返回一个指向数组的指针。

想要从函数返回一个一维数组,您必须声明一个返回指针的函数

C 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。

**指向数组的指针:**过指定不带索引的数组名称来生成一个指向数组中第一个元素的指针
数组名是一个指向数组中第一个元素的常量指针。

把第一个元素的地址存储在 p 中,您就可以使用 p、(p+1)、*(p+2) 等来访问数组元素.。

printf 的 %f 格式总是得到 double,%f 跟 %lf 的输出显示效果是一样的。

第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。

enum season {spring, summer=3, autumn, winter};

先定义枚举类型,再定义枚举变量;定义枚举类型的同时定义枚举变量;省略枚举名称,直接定义枚举变量

枚举类型是被当做 int 或者 unsigned int 类型来处理的

动态内存分配,没有指针是无法执行的

每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址

指针是一个变量,其值为另一个变量的地址,使用指针存储其他变量地址之前,对其进行声明。

定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值

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

如果指针包含空值(零值),则假定它不指向任何东西。

检查一个空指针,您可以使用 if 语句

对指针进行四种算术运算:++、–、+、-

ptr++

假设 ptr 是一个指向地址 1000 的整型指针,是一个 32 位的整数(4字节),执行完上述的运算之后,ptr 将指向位置 1004;如果 ptr 指向一个地址为 1000 的字符,字符内存1个字节,运算会导致指针指向位置 1001。

递增一个指针:使用指针代替数组,因为变量指针可以递增,而数组不能递增,数组可以看成一个指针常量。

递减一个指针:把值减去其数据类型的字节数

指针可以用关系运算符进行比较,如 ==、< 和 >。

 ptr <= &var[MAX - 1]

通常说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。函数指针可以像一般函数一样,用于调用函数、传递参数。

int (* p)(int, int) = & max;     // &可以省略,明了函数指针变量 p,指向函数 max

d = p(p(a, b), c);       //与直接调用函数等价,d = max(max(a, b), c)

函数指针作为某个函数的参数:回调函数就是一个通过函数指针调用的函数。

C 语言中,字符串实际上是使用 null 字符 ‘\0’ 终止的一维字符数组,不占内存

结构是用户自定义的允许存储不同类型的数据项。定义结构,必须使用 struct 语句。

struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book;//结构变量,定义在结构的末尾,最后一个分号之前,可以指定一个或多个结构变量。

在一般情况下,结构体名tag、结构体成员member-list、结构体变量variable-list 这 3 部分至少要出现 2 个

结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针。

如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明

结构体变量的初始化:

book = {"C 语言", "RUNOOB", "编程语言", 123456};

访问结构成员:使用成员访问运算符(.):变量.成员

结构作为函数参数

指向结构的指针

struct Books *struct_pointer;
struct_pointer = &Book1;  //存储结构变量的地址
struct_pointer->title;    //指针访问结构的成员,必须使用 -> 运算符

C 语言又提供了一种数据结构,称为"位域"或"位段"。
所谓"位域"是把一个字节中的二进位划分为几个不同的区域。

struct bs{
    int a:8;
    int b:2;
    int c:6;
}data;

data 为 bs 变量,共占两个字节。其中位域 a 占 8 位,位域 b 占 2 位,位域 c 占 6 位。

共用体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值

定义共用体,必须使用 union 语句,方式与定义结构类似。共用体占用的内存应足够存储共用体中最大的成员。

访问共用体的成员,使用成员访问运算符(.)

typedef 关键字,使用它来为类型取一个新的名字

typedef unsigned char BYTE;//unsigned char定义为 BYTE

typedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名,比如可以定义 1 为 ONE。

typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。

C 语言中的 I/O (输入/输出) 通常使用 printf() 和 scanf() 两个函数。

int getchar(void) 函数从屏幕读取下一个可用的字符,并把它返回为一个整数,同一个时间内只会读取一个单一的字符。

int putchar(int c) 函数把字符输出到屏幕上,并返回相同的字符。这个函数在同一个时间内只会输出一个单一的字符。

char *gets(char *s)
int puts(const char *s)
输入一些文本,当输入一个文本并按下回车键时,程序会继续并读取一整行直到该行结束

在读取字符串时,只要遇到一个空格,scanf() 就会停止读取。

 #include <stdio.h>
 
int main()
{
   FILE *fp = NULL;//申明文件指针
 
   fp = fopen("/tmp/test.txt", "w+");
   fprintf(fp, "This is testing for fprintf...\n");
   fputs("This is testing for fputs...\n", fp);
   fclose(fp);
}

 
int main()
{
   FILE *fp = NULL;
   char buff[255];
 
   fp = fopen("/tmp/test.txt", "r");
   fscanf(fp, "%s", buff);
   printf("1: %s\n", buff );
 
   fgets(buff, 255, (FILE*)fp);
   printf("2: %s\n", buff );
   
   fgets(buff, 255, (FILE*)fp);
   printf("3: %s\n", buff );
   fclose(fp);
 
}





可以定义一个文件指针 FILE *fp,当你打开一个文件时,文件指针指向开头,你要指到多少个字节,只要控制偏移量就好,例如, 相对当前位置往后移动一个字节:fseek(fp,1,SEEK_CUR); 中间的值就是偏移量。

如果你要往前移动一个字节,直接改为负值就可以:fseek(fp,-1,SEEK_CUR)。

C 预处理器(C Preprocessor)简写为 CPP。

如果一个头文件被引用两次,编译器会处理两次头文件的内容,这将产生错误。

强制类型转换:

 mean = (double) sum / count;

较低类型转换为较高类型,然后再参加运算

使用 stderr 文件流来输出所有的错误

递归:一个函数可以调用其自身。注意定义一个从函数退出的条件,否则会进入死循环。

#include <stdio.h>
 
double factorial(unsigned int i)
{
   if(i <= 1)
   {
      return 1;
   }
   return i * factorial(i - 1);
}





int  main()
{
    int i = 15;
    printf("%d 的阶乘为 %f\n", i, factorial(i));
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值