C语言学习笔记(个人整理)

  1. Extern int a; 声明变量名而不定义
  2. 数值常量后缀U(无符号) L(长整数)的组合
  3. 浮点常量 必须带小数点
  4. 字符常量 %c ‘x’(单引号)
  5. 字符串常量 %s “hello”(双引号)
  6. 定义常量 (多用大写)用constint a=5;或#define LENGTH 10;
  7. 存储类:auto 默认形式 register 定义存储在寄存器中

Static 在程序的生命周期内保持局部变量存在或让全局变量的作用域为文件内

Extern 全局变量的引用 对所有的程序文件均可用

  1. 位运算符作用于位 并逐位执行操作 & | ^
& 如果同时存在于两个操作数中,二进制 AND 运算符复制一位到结果中。 (A & B) 将得到 12,即为 0000 1100
| 如果存在于任一操作数中,二进制 OR 运算符复制一位到结果中。 (A | B) 将得到 61,即为 0011 1101
^ 如果存在于其中一个操作数中但不同时存在于两个操作数中,二进制异或运算符复制一位到结果中。 (A ^ B) 将得到 49,即为 0011 0001
~ 二进制补码运算符是一元运算符,具有”翻转”位效果,即0变成1,1变成0。 (~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。
<< 二进制左移运算符。左操作数的值向左移动右操作数指定的位数。 A << 2 将得到 240,即为 1111 0000
>> 二进制右移运算符。左操作数的值向右移动右操作数指定的位数。 A >> 2 将得到 15,即为 0000 1111

 

  1. ?a:b; 若为真则a否则
  2. 运算符优先级
类别  运算符  结合性 
后缀 () [] -> . ++ – – 从左到右
一元 + – ! ~ ++ – – (type)* & sizeof 从右到左
乘除 * / % 从左到右
加减 + – 从左到右
移位 << >> 从左到右
关系 < <= > >= 从左到右
相等 == != 从左到右
位与 AND & 从左到右
位异或 XOR ^ 从左到右
位或 OR | 从左到右
逻辑与 AND && 从左到右
逻辑或 OR || 从左到右
条件 ?: 从右到左
赋值 = += -= *= /= %=>>= <<= &= ^= |= 从右到左
逗号 , 从左到右
  1. 非零和非空的值为真 0和null为假

判断

  1. If else 语句,其中若有else if 匹配成功 后面的不会被执行测试
  2. Switch 会对每一个case进行检查,直到遇见break或者结束

循环和跳出循环

  1. While 当条件为真时循环 为假时跳出循环
  2. For循环 可以把三个分句全为空来做成无限循环
  3. Do while在尾部检查循环条件 至少执行一次
  4. Break 出现在一个循环内时 会立即终止循环
  5. Continue会跳过当次循坏 开始下次循环
  6. Goto label在goto前后均可

goto label;

label: statement;

函数

  1. 传值方式调用函数

将参数实际值复制给函数的实行参数,不会改变用于调用函数的实际参数

引用方式调用函数

将参数地址(指针)赋值给形式参数,修改形参会影响实参

如 void swap(int *a,int *b);

Swap(&a,&b);

  1. 局部变量:定义在函数内部或块内,作用域为函数内或块内 定义时系统不会对其初始化

全局变量:定义在所有函数外部 生命周期为整个程序 定义时系统自动初始化

数组

  1. 传递数组给函数 (通常还会传入一个表示数组大小的形参)
  • 形式参数为指针

Void function(int *pt);

(2)    形式参数为一个已定义大小的数组

void function(int a[10]);

  • 形式参数为一个为定义大小的数组

Void function(int a[]);

  1. 从函数返回数组

可以返回数组名来达到返回数组的目的 声明一个返回指针的函数

Int *function();

  1. 指向数组的指针

数组名是一个指向数组中第一个元素的常量指针

指针

  1. 指针

为一个变量,其值为另一个变量的地址

所有指针的值的实际数据类型都一样:代表内存地址的长的十六进制数

所指向的量的数据类型在声明指针时指定

在声明时,如没有确定的地址可以复制,可以给指针变量赋值NULL。(空指针) 输出为0

  1. 指针的算术运算

Ptr指向地址为1000的整形指针

Ptr++将指向1004  ptr每增加一次,都将指向下一个整数位置,后移四个字节

增加的为数据类型的长度

  1. 指针数组

Int *ptr[max];

可指向整形,也可指向字符。指向字符可以存储一个字符串列表

Char *name[]={“Zara”,”Hina”,”Nuha”,”Sara”};

  1. 指向指针的指针

Int **var;取值同样需要两个**

  1. 传递指针给函数

整型:Void get(unsigned long *ptr);

Get(&a);

数组:void get(int *arr,int size);

  1. 从函数返回指针

Int *function();

  1. 字符串

字符串是使用null或’\0’终止的一个字符数组

由于要存储空字符,所以字符数组的大小要比存储的内容的字符数多一

如 char s[6]={‘H’,’E’,’L’,’L’,’O’,’\0’};

等同Char s[]={“HELLO”};

初始化时,会自动在字符串后面补结束字符\0

1 strcpy(s1, s2);
复制字符串 s2 到字符串 s1。
2 strcat(s1, s2);
连接字符串 s2 到字符串 s1 的末尾。
3 strlen(s1);
返回字符串 s1 的长度。
4 strcmp(s1, s2);
如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。
5 strchr(s1, ch);
返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。
6 strstr(s1, s2);
返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。
  1. 结构体

用户自定义的可以用数据类型,可以存储不同类型的数据项

Struct [strcture tag](可选)

{

Member definition;

Member definition;

}[one or more structure variables];

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

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

结构体作为函数传参:void printf(struct Books Book);

指向结构体的指针:struct Books *struct_point;

Struct_point=&Book1;

用结构体指针访问结构成员,必须使用->运算符

Struct_point->title;

33.位域:将一个字节中的二进位划分为几个不同区域,并说明每个区域的位数。每个域有一个域名。

Struct 位于结构名

{

类型说明符 位域名:位于长度;

};

如:struct bs{

Int a:8;

};

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

定义共用体: union [union tag]

{

Member definition;

…..

}[one or more union var];

共用体所占用的内存应足够存储共用体中最大的成员

访问共用体也用(.)

  1. typedef:只可以为类型取一个新的名字

typedef unsigned char BYTE;

定义之后 BYTE可以作为unsigned char的缩写

BYTE b1,b2;

#define可以为类型定义别名 也可以为数值定义别名

输入输出

  1. getchar() 函数从屏幕读取下一个可用的字符,并把它返回为一个整数。同一个时间内只会读取一个单一的字符,通过在循环内使用可以读取多个字符
  2. putchar()把字符输出到屏幕上,并返回相同的字符,同一个时间内只会输出一个单一的字符,同样可以在循环内使用达到输出多个字符的目的

#include <stdio.h>int main( ){   int c;    printf( “Enter a value :”);   c = getchar( );    printf( “\nYou entered: “);   putchar( c );    return 0;}

  1. gets(char *s) 函数从stdin读取一行到S所指向的缓冲区,直到一个终止符
  2. puts(const char *s)把字符串和一个未遂的换行符写入到

#include <stdio.h>int main( ){   char str[100];    printf( “Enter a value :”);   gets( str );    printf( “\nYou entered: “);   puts( str );    return 0;}

  1. scanf() 从stdin中读取输入
  2. printf()把输入写入到stdout

#include <stdio.h>int main( ){   char str[100];   int i;    printf( “Enter a value :”);   scanf(“%s %d”, str, &i);    printf( “\nYou entered: %s %d “, str, i);    return 0;}

文件管理

  1. FILE *fopen(constchar* filename,constchar* mode );

Mode 为如下其中一个

r 打开一个已有的文本文件,允许读取文件。
w 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。
a 打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。
r+ 打开一个文本文件,允许读写文件。
w+ 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。
a+ 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。
  1. 关闭文件 int fclose (FILE *fp);
  2. 写入文件int fputc(int c,FILE *fp);
  3. 读取文件int fgetc(FILE *fp);

预处理

  1. 定义宏 #define MAX 20;
  2. 从系统库中获取文件 #include <stdio.h>

从本地目录中获取文件  #include “myheader.h”

预定义宏

描述
__DATE__ 当前日期,一个以 “MMM DD YYYY” 格式表示的字符常量。
__TIME__ 当前时间,一个以 “HH:MM:SS” 格式表示的字符常量。
__FILE__ 这会包含当前文件名,一个字符串常量。
__LINE__ 这会包含当前行号,一个十进制常量。
__STDC__ 当编译器以 ANSI 标准编译时,则定义为 1。

46.强制类型转换 mean=(double)sum/count;

  1. C可变参数:最后一个参数写成省略号,需要使用stdarg.h文件

Int func(int, …)

{

}

Int main()

{

Func(1,2,3);

Func()1,2,3,4);

}

48.内存管理:添加<stdlib.h>文件

序号 函数和描述
1 void *calloc(int num, int size);
该函数分配一个带有 num 个元素的数组,每个元素的大小为 size 字节。
2 void free(void *address); 
该函数释放 address 所指向的h内存块。
3 void *malloc(int num); 
该函数分配一个 num 字节的数组,并把它们进行初始化。
4 void *realloc(void *address, int newsize); 
该函数重新分配内存,把内存扩展到 newsize

49.动态分配内存

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

int main()

{

char name[100];

char *description;

 

strcpy(name, “Zara Ali”);

 

/* 动态分配内存 */

description = malloc( 200 * sizeof(char) );

if( description == NULL )

{

fprintf(stderr, “Error – unable to allocate required memory\n”);

}

else

{

strcpy( description, “Zara ali a DPS student in class 10th”);

}

printf(“Name = %s\n”, name );

printf(“Description: %s\n”, description );

}

50.重新调整内存大小和释放内存:调用free()释放内存

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

int main()

{

char name[100];

char *description;

 

strcpy(name, “Zara Ali”);

 

/* 动态分配内存 */

description = malloc( 30 * sizeof(char) );

if( description == NULL )

{

fprintf(stderr, “Error – unable to allocate required memory\n”);

}

else

{

strcpy( description, “Zara ali a DPS student.”);

}

/* 假设您想要存储更大的描述信息 */

description = realloc( description, 100 * sizeof(char) );

if( description == NULL )

{

fprintf(stderr, “Error – unable to allocate required memory\n”);

}

else

{

strcat( description, “She is in class 10th”);

}

 

printf(“Name = %s\n”, name );

printf(“Description: %s\n”, description );

 

/* 使用 free() 函数释放内存 */

free(description);

}