C语言基础知识笔记
C语言笔记
- 因为默认main为int所以可以直接:
- main(){
- …
- }
- 函数定义不可嵌套
- 运算符%%只能用于整数操作
- %%要双标记才能打印
- 判等与赋值一定要区分
- 不可以在同一个地方,访问和修改同一个数的数值
- 负数操作运算符“/”、“%”时,C89和C99都要确保一个神奇的公式:(a/b)*b+a%d=a
- 变量是左值
- if(表达式){语句;}
- if(表达式){语句;}else语句
- if的用法:
- if(表达式){语句;}
- else if(表达式){语句;}
- else if(表达式){语句;}
- else{语句;}
- 条件表达式:
- 表达式1?表达式2:表达式3
- 表达式1成立计算表达式2的值
- 表达式1不成立计算表达式3的值
- switch结构:
- switch(表达式){
- case 表达式1: case 2: case 3:
- 语句;break;
- case 表达式4:
- 语句;break;
- default:语句;break;
- }
- else语句属于离他最近的且还未与其他else配对的if语句
- 循环中
- while用于循环体执行之前检验
- do用于循环执行之后检
- for用于递增或递减计数变量的循环
- continue语句仅在循环可用
- while循环:
- while(表达式)表达式不为0即执行
- {语句;}
- 如果一来就为0,会一次都不执行直接跳出循环
- while(1)是一种常用的无限循环语句
- do循环:
- do{语句;}while(表达式);
- 先执行循环,再判定
- 至少执行一次循环
- for循环:
- for(表达式1;2;3)
- 表达式1用来赋初值(循环执行前)
- 表达式2用来控制循环终止
- 表达式3(循环执行后执行)
- 可以等价于
- 表达式1;
- while(表达式2){
- 语句
- 表达式3;
- }
- 必须有两个分号,表达式1都可以挑出来表达之后省略(;2;3)
- 形式参数定义时!每个形参前必须都有其类型说明
- 函数定义:
- 返回类型 函数名(形式参数)
- {
- 声明;
- 语句;
- }
- (花括号内的称为函数体)
- 函数调用:
- 函数名(实际参数);
- 函数声明:
- 返回类型 函数名(形式参数);
- 注意!这里有分号!
- 原因是形式参数里面没有具体的变量名称,只需要类型
- 目的是让程序进行预备
- 如果函数在调用前遇到了原型,编译器会创建一个隐式声明(也说明函数声明的重要性!)
- 如果函数在调用前没有遇到原型,编译器会执行默认的实际参数提升
- 无实参的函数要调用也必须有()
- 非void函数必须用return语句来指定返回值
- void类型函数没有返回值
- 若省略返回类型,C89会自动变为int,C99中不合法
- 把数组名传递给函数时,数组名后不加方括号!
- 利用数组型实际参数可以控制数组的有效性,把无效部分在后期删去!!!
- 声明多维数组的形式参数时,声明可以省略第一维的长度(例如二维数组,可以不说行数,但是必须制定列数)
- 变长数组声明时必须先长度参数,再数组,要让代表数组长度的参数先被程序看见
- 也可以用*替换数组内的长度参数,*直接代表数组长度与形参列表中的前面的参数有关
- static可以在数组参数声明中使用C99
- int a【static 3】代表数组长度至少为3
- 多维数组的话static仅可用于第一维
- 静态局部变量static可以在局部变量的值调用结束后,而不释放,保存原值。
- static int a;
- 寄存器变量(register变量)代表允许将局部变量的值放在cpu中提高执行效率
- register int a;
- 扩展外部变量的作用域(extern)
- extern 外部变量名字;
- 代表作用域效果从上一行开始
- 再正式定义外部变量
- 然后以下的范围都可使用
- 日后测试完善(少用为好)
- 加了static变为静态外部变量后,不可用extern扩大其范围
- 复合字面量是通过指定其包含的元素而创建的没有名字的数组(int 【】){…}
- 可以使用const把数组变为只读
- (const int【】){1,1}
- return语句:
- return 表达式;
- 在main函数中也可以用exit来等价替换,形式如下:
- 首先必须是在main函数中!
- #include<stdlib.h>
- exit(表达式);
- return 0;可以变为exit(0);
- 也可以用exit(EXIT_SUCCESS);
- exit(EXIT_FAILURE);
- continue语句
- 把循环转移到循环体末尾之前
- 但是没有跳出循环!
- continue与goto等效替换
- while (…) { while (…) {
- … …
- continue; goto end;
- … …
- } end: ;
- }
- break语句
- 可以跳出循环
- 一个break只能跳出最近的一层
- goto语句
- 使用模版:
- 标识符:语句
- goto 标识符;
- 可以任意跳跃!直接跳出多重循环!
- 所以优点也是缺点,很容易创造垃圾代码
- 空语句最好单独放置在一行,或者用continue;语句或者还可以用{}凸显一下
- 空循环一般仅只是用于增加简洁度,而不会提高效率
- 素数判断可以只检查不大于n(你输入的检验数)的平方根 的除数
- 十进制不可以0开头
- 八进制通常以0开头
- 十六进制通常以0x或0X开头
- 有符号整数类型
- short int:%hd
- int:%d
- long int:%ld(C99可以%lld)
- 浮点类型
- float:%f,常量末尾加f
- double:%lf,末尾加F
- long double:%lf,末尾加L
- 注意!只能在scanf中使用l,不能在printf函数格式串中使用
- long double中scanf和printf都放%Lf
- 字符操作
- 显示格式:
- char sb;
- sb='a'
- sb=' '
- 字符常量使用时,转义序列必须用一对单引号括起来:'\33'
- getchar返回的是int型的值,尽管它读入和返回的是字符
- %s不能有空格
- 使用getchar时必须打括号!!!!!曹尼玛!
- 类型转换有隐式转换和显式转换
- 常用的算术转换的策略是整值提升
- 强制转换表达式:
- (类型名)表达式
- 类型定义:
- typedef 类型 名字;
- 名字 变量,变量,变量;
- 更容易理解,更有实际意义,容易修改,直接改定义处的类型
- 类型定义比宏定义强大,宏定义还不能定义数组和指针。
- sizeof表达式:
- sizeof(类型名)
- 这个运算符允许程序储存指定类型值所需的空间的大小
- C语言有两种聚合类型:数组和结构
- 数组:
- 类型 名字【大小】{个体表示,个体表示};
- 数组可以通过在类型名前面加const变成常量数组
- 声明为常量数组的数组不会被程序修改,编译器也能发现那些有修改他意图的代码
- C99可以使用变长数组,即使用非常量表达式
- 变长数组的限制在于无初始化值和静态存储期限
- 在局部变量声明中放置static可以使变量具有静态存储期限,即拥有永久的存储单元,即使函数返回,也不会失去他的值。
- #define N n等效于sizeof(a)/sizeof(a【0】)
- 这是为了解决可能忘记名字的问题
- 也可以二者直接组合定义
- #include<string.h>
- gets(数组) and puts(数组)
- strcat(字符数组1,字符数组2)
- 效果:把字符串2接到1的后面
- 字符串1一定要够大!
- 83.rcpy(字符数组1,字符串2)
- 效果:把字符串2复制到字符数组1中
- 字符串2也可以是字符数组
- 够大!
- strcmp(字符串1,字符串2)
- 从左往右比较不同元素,随ASCII码大的为正
- 若两个字符串相等,为0
- 小于为负
- strlen(字符数组)
- 测量长度
- 不包含'\0'
- strlwr(字符串)
- 效果:将字符串转化为小写
- strupr(字符串)
- 效果:将字符串转化为大写
- 指针就是地址,指针变量就是储存地址的变量
- 指针变量的声明:
- 1.int i;
- 类型 *p,*q;
- p=&i;
- q=&j;
- &:取地址符(&x就是x在内存中的地址)*:间接寻址符(*p就是i的别名,改变*p的值也会改变i的值)
- 对变量使用&会产生指针
- 对指针使用*会返回变量
- q=p是把p的内容(i的地址)给了q,即把q指向了p所指向的地方
- *q=*p是把p指向的值(i的值)复制给q指向的对象(j的值)
- const保护参数:说明p是指向“长整数”的指针。表明函数不会改变指针参数指向的对象。
- 数组指针的元素可以
- *(p+i)表示数组p的第i个元素
- p+i实质为p+i*(元素所占字节)还是位置
- 多维数组中a【1】+1等价于*a(a+1)+1,都表示了a【1】【1】
- 指向函数的指针:
- int(*p)(int)
- p=f(函数入口)
- 这是一个指向整形函数,并且这个整形函数还有一个整形参数的函数
- 调用形式为:
- a=(*p)(n)
- (*p)(n)等效于f(n)
C语言笔记
-
因为默认main为int所以可以直接:
-
main(){
-
…
-
}
-
函数定义不可嵌套
-
运算符%%只能用于整数操作
-
%%要双标记才能打印
-
判等与赋值一定要区分
-
不可以在同一个地方,访问和修改同一个数的数值
-
负数操作运算符“/”、“%”时,C89和C99都要确保一个神奇的公式:(a/b)*b+a%d=a
-
变量是左值
-
if(表达式){语句;}
-
if(表达式){语句;}else语句
-
if的用法:
-
if(表达式){语句;}
-
else if(表达式){语句;}
-
else if(表达式){语句;}
-
else{语句;}
-
条件表达式:
-
表达式1?表达式2:表达式3
-
表达式1成立计算表达式2的值
-
表达式1不成立计算表达式3的值
-
switch结构:
-
switch(表达式){
-
case 表达式1: case 2: case 3:
-
语句;break;
-
case 表达式4:
-
语句;break;
-
default:语句;break;
-
}
-
else语句属于离他最近的且还未与其他else配对的if语句
-
循环中
-
while用于循环体执行之前检验
-
do用于循环执行之后检
-
for用于递增或递减计数变量的循环
-
continue语句仅在循环可用
-
while循环:
-
while(表达式)表达式不为0即执行
-
{语句;}
-
如果一来就为0,会一次都不执行直接跳出循环
-
while(1)是一种常用的无限循环语句
-
do循环:
-
do{语句;}while(表达式);
-
先执行循环,再判定
-
至少执行一次循环
-
for循环:
-
for(表达式1;2;3)
-
表达式1用来赋初值(循环执行前)
-
表达式2用来控制循环终止
-
表达式3(循环执行后执行)
-
可以等价于
-
表达式1;
-
while(表达式2){
-
语句
-
表达式3;
-
}
-
必须有两个分号,表达式1都可以挑出来表达之后省略(;2;3)
-
形式参数定义时!每个形参前必须都有其类型说明
-
函数定义:
-
返回类型 函数名(形式参数)
-
{
-
声明;
-
语句;
-
}
-
(花括号内的称为函数体)
-
函数调用:
-
函数名(实际参数);
-
函数声明:
-
返回类型 函数名(形式参数);
-
注意!这里有分号!
-
原因是形式参数里面没有具体的变量名称,只需要类型
-
目的是让程序进行预备
-
如果函数在调用前遇到了原型,编译器会创建一个隐式声明(也说明函数声明的重要性!)
-
如果函数在调用前没有遇到原型,编译器会执行默认的实际参数提升
-
无实参的函数要调用也必须有()
-
非void函数必须用return语句来指定返回值
-
void类型函数没有返回值
-
若省略返回类型,C89会自动变为int,C99中不合法
-
把数组名传递给函数时,数组名后不加方括号!
-
利用数组型实际参数可以控制数组的有效性,把无效部分在后期删去!!!
-
声明多维数组的形式参数时,声明可以省略第一维的长度(例如二维数组,可以不说行数,但是必须制定列数)
-
变长数组声明时必须先长度参数,再数组,要让代表数组长度的参数先被程序看见
-
也可以用*替换数组内的长度参数,*直接代表数组长度与形参列表中的前面的参数有关
-
static可以在数组参数声明中使用C99
-
int a【static 3】代表数组长度至少为3
-
多维数组的话static仅可用于第一维
-
静态局部变量static可以在局部变量的值调用结束后,而不释放,保存原值。
-
static int a;
-
寄存器变量(register变量)代表允许将局部变量的值放在cpu中提高执行效率
-
register int a;
-
扩展外部变量的作用域(extern)
-
extern 外部变量名字;
-
代表作用域效果从上一行开始
-
再正式定义外部变量
-
然后以下的范围都可使用
-
日后测试完善(少用为好)
-
加了static变为静态外部变量后,不可用extern扩大其范围
-
复合字面量是通过指定其包含的元素而创建的没有名字的数组(int 【】){…}
-
可以使用const把数组变为只读
-
(const int【】){1,1}
-
return语句:
-
return 表达式;
-
在main函数中也可以用exit来等价替换,形式如下:
-
首先必须是在main函数中!
-
#include<stdlib.h>
-
exit(表达式);
-
return 0;可以变为exit(0);
-
也可以用exit(EXIT_SUCCESS);
-
exit(EXIT_FAILURE);
-
continue语句
-
把循环转移到循环体末尾之前
-
但是没有跳出循环!
-
continue与goto等效替换
-
while (…) { while (…) {
-
… …
-
continue; goto end;
-
… …
-
} end: ;
-
}
-
break语句
-
可以跳出循环
-
一个break只能跳出最近的一层
-
goto语句
-
使用模版:
-
标识符:语句
-
goto 标识符;
-
可以任意跳跃!直接跳出多重循环!
-
所以优点也是缺点,很容易创造垃圾代码
-
空语句最好单独放置在一行,或者用continue;语句或者还可以用{}凸显一下
-
空循环一般仅只是用于增加简洁度,而不会提高效率
-
素数判断可以只检查不大于n(你输入的检验数)的平方根 的除数
-
十进制不可以0开头
-
八进制通常以0开头
-
十六进制通常以0x或0X开头
-
有符号整数类型
-
short int:%hd
-
int:%d
-
long int:%ld(C99可以%lld)
-
浮点类型
-
float:%f,常量末尾加f
-
double:%lf,末尾加F
-
long double:%lf,末尾加L
-
注意!只能在scanf中使用l,不能在printf函数格式串中使用
-
long double中scanf和printf都放%Lf
-
字符操作
-
显示格式:
-
char sb;
-
sb='a'
-
sb=' '
-
字符常量使用时,转义序列必须用一对单引号括起来:'\33'
-
getchar返回的是int型的值,尽管它读入和返回的是字符
-
%s不能有空格
-
使用getchar时必须打括号!!!!!曹尼玛!
-
类型转换有隐式转换和显式转换
-
常用的算术转换的策略是整值提升
-
强制转换表达式:
-
(类型名)表达式
-
类型定义:
-
typedef 类型 名字;
-
名字 变量,变量,变量;
-
更容易理解,更有实际意义,容易修改,直接改定义处的类型
-
类型定义比宏定义强大,宏定义还不能定义数组和指针。
-
sizeof表达式:
-
sizeof(类型名)
-
这个运算符允许程序储存指定类型值所需的空间的大小
-
C语言有两种聚合类型:数组和结构
-
数组:
-
类型 名字【大小】{个体表示,个体表示};
-
数组可以通过在类型名前面加const变成常量数组
-
声明为常量数组的数组不会被程序修改,编译器也能发现那些有修改他意图的代码
-
C99可以使用变长数组,即使用非常量表达式
-
变长数组的限制在于无初始化值和静态存储期限
-
在局部变量声明中放置static可以使变量具有静态存储期限,即拥有永久的存储单元,即使函数返回,也不会失去他的值。
-
#define N n等效于sizeof(a)/sizeof(a【0】)
-
这是为了解决可能忘记名字的问题
-
也可以二者直接组合定义
-
#include<string.h>
-
gets(数组) and puts(数组)
-
strcat(字符数组1,字符数组2)
-
效果:把字符串2接到1的后面
-
字符串1一定要够大!
-
strcpy(字符数组1,字符串2)
-
效果:把字符串2复制到字符数组1中
-
字符串2也可以是字符数组
-
够大!
-
strcmp(字符串1,字符串2)
-
从左往右比较不同元素,随ASCII码大的为正
-
若两个字符串相等,为0
-
小于为负
-
strlen(字符数组)
-
测量长度
-
不包含'\0'
-
strlwr(字符串)
-
效果:将字符串转化为小写
-
strupr(字符串)
-
效果:将字符串转化为大写
-
指针就是地址,指针变量就是储存地址的变量
-
指针变量的声明:
-
1.int i;
-
类型 *p,*q;
-
p=&i;
-
q=&j;
-
&:取地址符(&x就是x在内存中的地址)*:间接寻址符(*p就是i的别名,改变*p的值也会改变i的值)
-
对变量使用&会产生指针
-
对指针使用*会返回变量
-
q=p是把p的内容(i的地址)给了q,即把q指向了p所指向的地方
-
*q=*p是把p指向的值(i的值)复制给q指向的对象(j的值)
-
const保护参数:说明p是指向“长整数”的指针。表明函数不会改变指针参数指向的对象。
-
数组指针的元素可以
-
*(p+i)表示数组p的第i个元素
-
p+i实质为p+i*(元素所占字节)还是位置
-
多维数组中a【1】+1等价于*a(a+1)+1,都表示了a【1】【1】
-
指向函数的指针:
-
int(*p)(int)
-
p=f(函数入口)
-
这是一个指向整形函数,并且这个整形函数还有一个整形参数的函数
-
调用形式为:
-
a=(*p)(n)
-
(*p)(n)等效于f(n)
一种单项链表编法
-
辗转相除法
-
用(a,b)表示最大公约数
-
若a%b=c,则(a,b)=(b,c)
-
一些常用的函数
-
除法:sqrt
-
pow(x,y) x的y次方
-
字符串拼接:strcat(数组1,数组2)
-
字符串比较:strcmp
-
字符串复制:strcpy
-