C语言笔记

Tips

  • C语言区分大小写
  • C编译器忽略空格
  • 所有的 C 语言程序都需要包含 main() 函数,代码从 main() 函数开始执行。

C11

C11(也被称为C1X)指ISO标准ISO/IEC 9899:2011,是当前最新的C语言标准。
在它之前的C语言标准为C99。


C环境

  1. 文本编辑器 (例:vi/vim)
    输入程序,编辑器创建的文件——源文件。
    C程序源文件扩展名 “.c”
  2. C编译器 (例:GNU的C/C++编译器)
    源代码编译成最终的可执行程序。
    工作流程:源程序(source code)→预处理器(preprocessor)→编译器(compiler)→汇编程序(assembler)→目标程序(object code)→连接器(链接器,Linker)→可执行程序(executables)

C程序包含内容

  1. 预处理器指令
  2. 函数
  3. 变量
  4. 语句 & 表达式
  5. 注释

预处理

include <stdio.h>
#include "my.h"

stdio.h表示系统文件库, 也可以声明其它的。
.h表示头文件,因为这些文件都是放在程序各文件的开头。
#include 告诉预处理器将指定头文件的内容插入到预处理器命令的相应位,导入头文件的预编译指令。
<> 表示系统自带的库,也可以写成" " 表示用户自定义的库。
<>直接到系统指定的目录下查找该文件;
" "先在当前目录查找有无该头文件,有则包含该目录下的头文件,没有则到系统指定的目录下找该头文件。
防止重复include:

  1. #pragma once
    某些老的编译器不支持
  2. #ifndef XXX
    #define XXX
    #endif
    出现宏名重复,即字符串中有与宏名相同的字符串
#undef  FILE_SIZE
#define FILE_SIZE 42  //取消原定义,重新定义。
#ifndef MESSAGE
   #define MESSAGE "You wish!"
#endif  //没有定义MESSAGE,则进行定义

预定义宏

  1. __DATE__ : 日期
  2. __TIME__ : 时间
  3. __FILE__ : 当前文件名
  4. __LINE__: 代码当前行号
  5. __STDC__:当编译器以 ANSI 标准编译时,则定义为 1。

注释方式

  1. //单行注释
  2. /* 单行注释 */
  3. /*
    多行注释
    多行注释
    多行注释
    */

数据类型

  1. 基本类型:整数类型、浮点类型
  2. 枚举类型
  3. void类型
    表明没有可用的值、无类型
    void表示函数没有返回值,
    而用int或其他,则函数需要有返回值如:
int egg()
{
return 0;
}
  1. 派生类型:指针类型、数组类型、结构类型、共用体类型、函数类型

整数类型

类型 大小 值范围
char 1字节 -128 到 127 或 0 到 255
unsigned char 1字节 0 到 255
signed char 1 字节 -128 到 127
int 2 或 4 字节 -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647
unsigned int 2 或 4 字节 0 到 65,535 或 0 到 4,294,967,295
short 2 字节 -32,768 到 32,767
unsigned short 2 字节 0 到 65,535
long 4 字节 -2,147,483,648 到 2,147,483,647
unsigned long 4 字节 0 到 4,294,967,295

signed表示有符号的,即+/-;
unsigned表示无符号。
具体字节大小查询:
printf("int 存储大小 : %lu \n", sizeof(int));

浮点类型

类型 存储大小 值范围 精度
float 4 字节 1.2E-38 到 3.4E+38 6 位小数
double 8 字节 2.3E-308 到 1.7E+308 15 位小数
long double 16 字节 3.4E-4932 到 1.1E+4932 19 位小数

枚举

enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
}; //分别 = 1 2 3 4 5 6 7
enum DAY
{
      MON, TUE=3, WED, THU, FRI, SAT, SUN
}; //分别 = 0 3 4 5 6 7 8

枚举变量定义

enum DAY
{
      MON, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY day;
enum DAY
{
      MON, TUE, WED, THU, FRI, SAT, SUN
} day;
enum
{
      MON, TUE, WED, THU, FRI, SAT, SUN
} day;

常量

定义常量

  1. #define THIS 10;
  2. const int ABCDE = 10;

存储类

  1. auto
    只能用在函数内,即 auto 只能修饰局部变量。

  2. register

  3. static

  4. extern


运算符

位运算符(二进制)

  1. & 与
  2. | 或
  3. ^ 异或
    相同为0,不同为1
  4. ~ 取反
  5. << 二进制左移
    假设A=60,A<<2得到240
    60二进制:0011,1100
    左移2位后的二进制:1111,0000(即十进制240)
  6. >> 二进制右移
    A=60,A>>2得到15
    60:0011,1100
    右移2位后的二进制:0000,1111(即十进制15)

循环

循环控制语句

  1. break:终止循环或switch语句。
  2. continue:立即停止本次循环,开始下一次循环。
  3. goto:转移到被标记的语句。

作用域

  1. 局部变量
    函数内部使用
  2. 全局变量
    整个程序的生命周期
  • 如果全局变量和局部变量名字相同, 优先使用局部变量。
  • 全局变量自动初始化。

数组

初始化数组

int a[5] = {5, 2,4, 7, 50}; //一维数组

int a[3][4] = {  
 {0, 1, 2, 3} ,   /*  初始化0行 */
 {4, 5, 6, 7} ,   /*  初始化1行 */
 {8, 9, 10, 11}   /*  初始化2行 */
};
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};

多维数组

int x[3][4] //二维数组


指针

输出变量地址:
printf("a变量的地址: %p\n", &a );
指针是变量,值为另一个变量的内存地址,即十六进制数。
整数型、浮点型等指针,指针类型都一样,而指向的数据类型不同。

int main ()
{
   int  a = 20;   
   int  *ip;       

   ip = &a;  //指针指向数组为:int b[5];  ip = b;
 
   printf("变量地址: %p\n", &a  );  //bffd8b3c
 
   printf("指针存储地址: %p\n", ip ); //bffd8b3c
 
   printf("指针访问值: %d\n", *ip ); // 20
 
   return 0;
}

空指针:
int *ip = NULL; //此时地址是0x0
指针的指针:

int  a;
int  *ptr;
int  **pptr;
a = 8;
ptr = &var;
pptr = &ptr;

字符串

char a[6] = {'h', 'e', 'l', 'l', 'o', '\0'};
char a[] = "hello";


结构体

typedef struct abcd   
{
}__attribute__((packed)) abcd;

__attribute__((packed))的作用:取消字节对齐,减少占用空间,让内存紧凑存储。


共用体

union Data
{
   int i;
   float f;
   char  str[20];
} data; 

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


位域

位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。


typedef

typedef struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} Book;

输入输出

输入

scanf() 函数用于从标准输入(键盘)读取并格式化;
scanf("%s %d", str, &i); //char前无&,int前有&
getchar()
gets()

输出

printf() 函数发送格式化输出到标准输出(屏幕)。

  1. %d 格式化输出整数
  2. %f 格式化输出浮点型数据
  3. %s 字符串
  4. %c 字符

putchar()
puts()


文件读写

打开并写入文件

#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);
}
访问模式 备注
r 打开一个已有的文本文件,允许读取文件。
w 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。
a 打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。
r+ 打开一个文本文件,允许读写文件。
w+ 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。
a+ 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。

强制类型转换

int sum = 17, count = 5;
double mean;
mean = (double) sum / count;

可变参数

即函数输入数量不固定
利用stdarg.h 中的va_list、va_start、va_arg、va_end


内存管理

内存分配管理函数:在<stdlib.h> 头文件

  1. void *calloc(int num, int size);
    在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。它的结果是分配了 num*size 个字节长度的内存空间,并且每个字节的值都是0。

  2. void free(void *address);
    该函数释放 address 所指向的内存块,释放的是动态分配的内存空间。

  3. void *malloc(int num);
    在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。

  4. void *realloc(void *address, int newsize);
    该函数重新分配内存,把内存扩展到 newsize。

内存分配示例:
description = (char *)malloc( 200 * sizeof(char) );
calloc(200, sizeof(char));
description = (char *) realloc( description, 100 * sizeof(char) ); // 重新分配内存
free(description); // 释放内存


命令行参数


48页

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容