c语言总结小笔记——小包包的成长记

1.基本数据类型包括:int、char(占1字节)、float

字节是计算机中管理内存的基本单位,任何一个变量一定是一个或多个相邻的字节构成的。变量的地址是构成他的多个字节中地址最小的那个字节的地址

bit、KB、M、G、T、P  

ASCII:  '0'~'9' 48~57     'A'~'Z'  65~90    'a'~'z'  97~122   

short占两个字节 int在不同机器上所占大小不固定 long占4个

float单精度 精确到小数点后6位 ,double双精度 精确到小数点后12位

类型转换:实际上是建立了新的变量,新的内存空间(浮点和整型运算 转换成浮点后运算,整型和字符型运算 转换成int运算,或做强制类型转换)

2. printf() 、 scanf()

(1) printf(“格式字符串”,表达式1,表达式2...) printf("输出%03d\n",5);  输出005

格式字符串分两个部分:普通字符(原样输出)、转换说明

转换说明格式:%-0m.n l或h 格式字符   

% :转换说明的开始

- :左对齐 省略表示右对齐

0 :表示空位填0 省略表示空位不填

m.n :表示 域宽(占用的宽度).精度(输出浮点的小数点后的位数)  默认n=6

l或h : l 输出整数时l代表long 浮点数时l代表double  h 将整数的格式修正为short

       格式字符 : i/d十进制整数、u无符号十进制、o 无符号八进制整数、x十六进制、c字符、s字符串、f浮点数、e指数形式输出浮点数、g在f和e之间选   择较短格式输出、p输出地址、

(2) scanf("格式字符串",地址列表);   scanf("%f",&f1);  

  大多数scanf()只包含转换说明,若含有普通字符,则在输入时要依照普通字符格式输入 scanf("r=%d",&r);  输入:r=5

scanf调用失败,返回0 。主要原因是类型不匹配。当数据类型和输入缓冲区中的数据类型不一致时,便无法读走数据,缓冲区便不会清除这个数据,后面的数据将读不进来,可能致死循环。 为解决此问题,可先判断scanf返回值,若为0即读取失败,假设要读取整型或浮点型,为避免误输入字符型数据,则可用这两条语句:

scanf("%*[^\n]"); scanf("%*c"); 忽略任何非\n的字符,忽略任何char字符。

scanf不会读取最后的换行符,会把换行和空格当做输入结束,若需要读取换行符可用scanf(“%*c”);

3、

(1)sizeof()  关键字、操作符   返回一个对象或者类型所占内存字节数    sizeof(类型/变量名/表达式)

(2)const   关键字:const修饰的变量—只读变量,不能被修改。

(3)auto   关键字:自动变量  除了被static修饰的变量以外,其他普通变量都是auto,所以一般省略auto关键字

(4)static  关键字:修饰局部变量,即静态局部变量:局部变量的数值是上一次调用之后的数值

  修饰全局变量,即静态全局变量:只能在本文件中使用。

(5)register 关键字:resister修饰的变量称为寄存器变量,告诉编译器这个变量会被频繁使用,保存到寄存器中。

(6)volatile  关键字:volatile修饰的变量其数值不稳定,可能发生变化。告诉编译器这个变量可能会被位置的因素改变,不应该对这个变量进行优化。当这个变量数值改变时,应该立刻写到内存中,读取这个变量时,不要使用备份数据。


4. 运算符

逻辑与或非 && ||  !     按位与或非 &  |  ~    按位异或  ^       左移 <<  右边空位补0  左移一位相当于*2        右移 >> 左边空位补符号位  右移一位相当于/2 (移位操作比乘除快) 

& 取地址    * 根据地址取变量值       三元运算符:条件?表达式1:表达式2;

5.

(1)switch(控制表达式)

{

case 常量表达式1:语句1;break;

case 常量表达式2:语句2;break;

...

default:语句;            //(如若case都不满足则执行default后的语句)

}

(2)do

{

循环体

}while(表达式);    //注意while()后面有分号

(3)continue  只能在循环中使用,用来结束本次循环,开始下一次循环

   break   用来直接跳出循环或直接跳出switch语句块


6.复合数据类型

(1)数组:具有相同数据类型的数据的集合

数组定义时必须指定数组长度,不初始化赋值时有必要进行清零操作,否则都是随机数。

数组名就是常量指针。

初始化:int a[5]={0};//全部清零     

int a[5]={1,2};  //后三个元素清零 (如果初始化式里面的常量表达式个数小于数组元素个数时,剩下的元素初始化为0)

int a[5]={[1]=10,[4]=20};  //指定初始化   其他元素为0

sizeof(数组名)=sizeof(数组元素类型)*元素个数

二维数组:a[行][列]    按照行主序存储数组      初始化0  int a[3][4]={{0}};

变长数组:顺序执行  int n;  scanf("%d",&n);   int a[n];

(2)结构体:不同类型数据的集合

struct color{ int Blue; int Black; int Red; int Yellow;};   //花括号后面一定有分号   

color c={1,2,3,4};    //结构体变量

typedef struct {成员列表}别名;  

对于结构体变量:如果结构体是一个地址,则访问成员变量:结构体名->成员变量

  如果不是地址,则访问成员变量:结构体名.成员变量

使用结构体指针作为函数的参数和返回值:

结构体对齐与补齐:按照数据类型由小到大顺序进行书写,使结构体大小最小

结构体位段/位域:位段可以指定每个成员的大小,节约内存。大小是指多少个二进制位。

                                              

(3)联合:union{成员变量}别名;

与结构体类似,但是 所有成员共用起始地址相同的一段内存。联合占用内存的大小=占据内存最大的那个成员所占的大小

(4)枚举:enum 枚举名{ 枚举常量1,枚举常量2... };  枚举的成员常量值,即枚举常量默认从0开始,逐个递增。也可指定值


7.函数 :    返回值的数据类型  函数名(参数列表){ 函数体 }

函数定义在函数调用之后,则在调用前必须要声明该函数(格式: 返回值的数据类型  函数名(参数列表);),否则默认返回值是int类型。

函数的返回值的数据类型必须与return返回值的类型一致,如果没有返回值应指定为void,返回值类型省略则默认为int型。

参数列表中的每个形式参数必须有类型说明,逗号隔开参数。

函数调用:格式: 函数名(实际参数);

函数被调用时,使用的实际参数的一个拷贝数据。

调用函数和被调用函数之间共享数据的方法——数组作为函数参数,传递的是数组名(即数组第一个元素的起始地址)。而且应设计两个参数:一是数组,二是数组长度

函数递归:函数调用了自己本身。例如:函数实现n的阶乘:

8.局部变量、静态局部变量、全局变量

局部变量:定义在函数体中的变量(生命周期以及作用域:从定义到函数结束)

静态局部变量:static修饰的局部变量(生命周期:整个程序   作用域:和普通变量一样)。静态局部变量数值是上一次调用结束之后的值。

全局变量:定义在整个程序中的变量。全局变量在定义之后自动初始化为0。全局变量维护困难、排错困难、代码复用困难,应该尽量减少全局变量的使用


9.程序在内存中的分布

程序段:代码段,只读

数据段:存放已经初始化的全局变量,属于静态内存分配

bss段:存放程序中未初始化的全局变量和静态变量

堆:保存进程中被动态分配的内存  (自己申请,自己释放)

申请动态内存:malloc(分配字节大小) 分配内存开但不初始化       calloc()分配内存且清零     realloc()调整先前分配的内存块大小    申请失败返回NULL

释放:free()     注意动态内存块使用完毕后一定要释放

栈:存储程序中临时创建的局部变量  (自动分配,自动释放)


10.指针

指针就是内存地址,指针变量就是存储地址的变量。

int *q=&a;  //  表示 q 是指针 ,指向的数据是int类型的。指针的值是a这个变量的地址。这里的 * 表示定义的变量是指针,不能省略,在定义时不代表取指针对应的内容。

或写成:int *q=NULL;  q=&a;

*q=10;    //表示将10这个数赋给q指针指向的内容。即q指针指向的内容是10。

void * 通用指针,无类型指针,本质就是地址

指针作为函数的返回值:int*  test()返回一个地址。但是不要返回函数局部变量的地址,因为在函数结束之后所使用的内存会释放掉,包括函数中定义的变量。

指针作为函数的参数:void swap(int *a,int *b)调用的时候,要将地址作为实际参数 swap(&i,&j);

函数指针:int (*q)(int i,int j)  q是一个指针,指向一个函数,这个函数返回一个int型值。

                          

数组和指针:使用指针访问数组 比较两种写法: int a[10]={0};

int *q=&a[0];  //定义一个指针指向数组第一个元素的起始位置

// int *q=a;   与上一句等价,数组名实际上是常量指针

指针数组:本质是数组,数组的每个元素都是指针

定义 int* p[n];     []优先级高,先与p结合成为一个数组,再由int*说明这是整型指针数组,有n个指针类型的数组元素。执行p+1时,则p指向下一个数组元素 

数组指针:也称为行指针。本质是指针,指针指向一个数组

定义 int (*p)[n]; ()优先级高,说明p是一个指针,指向整型一维数组,数组长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。

如要将二维数组赋给一指针,应这样赋值:int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
  p=a;        //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++;       //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
所以数组指针也称指向一维数组的指针,亦称行指针。
      

  

const与指针:const int *p;指针指向的数据是只读的。*p只读

     int *const p;指针本身是只读的。p只读

     const int *const p; *p,p都是只读的。

二级指针:指向指针的指针,一级指针保存变量的地址,二级指针保存一级指针的地址。 int **q;


11.字符串

字符串是‘\0’作为结束标志。

字符串的三种表达方式:

字面值:存在全局区域,不可改变。字面值相同的字符串在内存中只有一个。

char数组:char str[4]="abc";  //注意:虽然字符串数组初始化只有3个元素,但是数组要定义长度为4,因为最后一个一定是‘\0'

printf(“%s”,str);

char *:char* q="abc";  指针存储地址  既可以指向字面值,也可以指向char数组里面的元素

    printf("%s",q);   

字符串读取: scanf("%s",&name);   scanf遇到空格或者换行字符就表示输入结束,即scanf只适合连续不断地输入。

gets(name); gets从设备读取一行字符回来,放到name中,但是gets不会考虑name的大小,可能导致溢出

fgets(name,20,stdin); 能解决上面两个的缺点。注意fgets会在整个字符串后面添加 \n

操作字符串的库函数:<string.h>

char *strcpy(char *dest,char *src)   //src字符串拷贝到dest中     strncpy()保证缓冲区不会溢出

char *strcat(char *dest,char *src)   //src中字符串连接到dest字符串的末尾    strncat()保证缓冲区不会溢出

int strlen()   //测量字符串的长度,不包含’\0'

int strcmp(char *s1,char *s2)     //比较两字符串。相等 返回0;s1>s2返回正数。 注意strcmp(str,"abc\n");   strncmp()只比较两个字符串的前n个字符


12.预处理

文件包含:#include<stdio.h>  // <>到系统指定的路径寻找

#include“xxx.h”    //优先从当前目录查找 一般适用于自定义文件

宏定义:简单宏替换  #define PI 3.14      //注意不要有分号

     带参数的宏  #define 标识符(x1,x2,x3) 替换列表   

 如:#define MUL(x,y) ((x)*(y))   //注意结尾不要有分号 标识符和括号之间没有空格   每个参数加括号,整个表达式外面加括号以保障运算顺序

宏运算符:#运算符:将宏中的参数转换为字面值常量,只能出现在带参数的宏的替换列表中

##运算符:将两个标识符粘合在一起形成一个标识符

预定义的宏:_LINE_     _FILE_     _DATE_     _TIME_     _STDC_  

条件编译:#if   #endif   判断#if后面的宏的数值,如果是0,就将#if 和 #endif 之间的代码从程序中移除,非0则保留


13.

自定义头文件:xxx.h  全局变量的共享、宏定义的共享、函数声明共享、类型定义的共享。  注意:如果重复包含一个头文件,会导致编译错误。

extern 修饰全局变量:extern int r ;   //告诉编译器,本文件中在此声明的该变量已经在其他文件中定义。注意:如果一个全局变量使用static修饰,即使在其他文件中用extern声明,该文件也不能使用这个变量。

大端模式、小端模式:(大端:低字位存储高字节)


14.文件操作

文件就是存储介质上数据的集合,每一个打开的文件在内存里面都有一个结构体来保存,这个结构体是系统定义的FILE。

文件指针:FILE* fp;

FILE *fopen(const char* path,const char* mode):打开一个文件,返回一个指向打开文件的指针,失败返回NULL。path路径,mode访问方式(“r” "w" "a"追加  “r+”  "w+"  "a+" "rb" "wb" "ab" 。。。)。

int fclose(FILE *fp):关闭文件。fp为想要关闭的文件的文件指针。成功返回0,失败返回EOF

int fputc(int c , FILE *fp):将一个字符写到文件中。返回字符对应的整数值,失败则返回EOF

int fgetc(FILE *stream):从文件中读一个字符出来,返回读到的字符







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值