速写C语言3
主要内容:
函数
数组
指针
对文件的操作
乱七八糟的知识
不建议看下去。。。写的乱七八糟
1.函数
什么是函数呢?
函数就是一段封装好的,可以重复使用的代码,它使得我们的程序更加模块化,不需要编写大量重复的代码。
被调用函数
当返回值是void类型时可以不用return语句
return语句可以有多条。只不过函数运行的时候,最后只会执行其中的一条。
函数有返回值,那么函数就要返回其声明类型的值,所以应该有return语句返回相应的值,否则编译出差。
形参(形式参数)
在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。
实参(实际参数)
函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参。
形参和实参的功能是传递数据,发生函数调用时,实参的值会传递给形参。

PS:写不下去了。。。
参考链接:https://www.runoob.com/cprogramming/c-functions.html
2.数组
http://c.biancheng.net/view/1829.html

定义数组
类型 变量名称 [元素数量];
元素数量必须是整数,具有相同的类型
一旦创建,不能改变大小
数组中的元素在内存中是连续依次排列的
(数组是一个整体,它的内存是连续的;也就是说,数组元素之间是相互挨着的,彼此之间没有一点点缝隙。)

数组的每个单元就是数组类型的一个变量
使用数组时放在[]中的数字叫做下标或索引,下标从0开始计数:
grades[0]
最大的下标就是,数组的大小-1。
长度为0的数组, int a[0]; 可以存在但是没有用。
数组的集成初始化
int [] = {1,2,3,4,5};
int [12] = {2};
后面不写的话,就是初始化为0。
int a[12] = {[1] =2,4,[5]=6};
数组的大小
sizeof() 单位是字节

得出数组的单元个数。
!!!

%-9d中 width 对应 9。
对于整数和小数,默认右对齐,不足的宽度以空格补齐,例如:
printf("%10d%12f", 234, 9.8);
输出结果为:
234 9.800000
234 前面共有7个空格,9.8 前面有4个空格。
数组的赋值
数组变量本身不能被赋值,要把一个数组的所有元素交给另一个数组,必须采用遍历。

一维数组
int [12] = {2};
sqrt()
sqrt() 用来求给定值的平方根
二维数组


a[0][0]就是1,通俗点话就是说袋子里面装着三个东西,但是这个袋子是从0开始的。

用来存放字符的数组称为字符数组
char a[10]; //一维字符数组 char b[5][10]; //二维字符数组
char c[20]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a','m'}; // 给部分数组元素赋值
char d[]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a', 'm' }; //对全体元素赋值时可以省去长度
字符数组实际上是一系列字符的集合,也就是字符串(String)。在C语言中,没有专门的字符串变量,没有string类型,通常就用一个字符数组来存放一个字符串。
char str[30] = {"c.biancheng.net"};
char str[30] = "c.biancheng.net";
数组第 0 个元素为'c',第 1 个元素为'.',第 2 个元素为'b',后面的元素以此类推。
为了方便,你也可以不指定数组长度
char str[] = {"c.biancheng.net"};
char str[] = "c.biancheng.net";

字符不需要想着'\0'
字符串需要想着最后需要加上'\0'
字符数组的长度至少要比字符串的长度大 1。
字符串输入输出
puts()
输入字符串
puts():输出字符串并自动换行,该函数只能输出字符串。
printf():通过格式控制符%s输出字符串,不能自动换行。除了字符串,printf() 还能输出其他类型的数据。
gets()
得到字符串
scanf():通过格式控制符%s输入字符串。除了字符串,scanf() 还能输入其他类型的数据。
gets():直接输入字符串,并且只能输入字符串。
scanf() 和 gets() 是有区别的:
scanf() 读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串。
gets() 认为空格也是字符串的一部分,只有遇到回车键时才认为字符串输入结束,所以,不管输入了多少个空格,只要不按下回车键,对 gets() 来说就是一个完整的字符串。换句话说,gets() 用来读取一整行字符串。
注意,scanf() 在读取数据时需要的是数据的地址,这一点是恒定不变的,所以对于 int、char、float 等类型的变量都要在前边添加&以获取它们的地址。但是在本段代码中,我们只给出了字符串的名字,却没有在前边添加&,这是为什么呢?因为字符串名字或者数组名字在使用的过程中一般都会转换为地址,所以再添加&就是多此一举,甚至会导致错误了。
scanf() 如果是字符的话就不需要&符号加上
http://c.biancheng.net/view/1833.html

http://c.biancheng.net/view/1834.html


参考链接:http://c.biancheng.net/view/1828.html
3.指针
指针值只能是地址或者空,0表示空。
%p 十六进制 &i 以地址返回给你
相邻数组之间的差距是4
scanf("%d",&i);
运算符&
获取变量的地址,它的操作数必须是变量
不能是表达式。
数组 相邻的差距是4
%x
无符号十六进制整数
\xhh 十六进制值
%p 指针
4.对文件的操作
1.格式化的输入输出
printf()
%
%9.2f 合起来有9个字符,小数点后面两位
修饰字符
%
putchar()
字符
scanf()
%i
getchar()
字符 得到你输入的字符
2.文件

w 打开只写。如果不存在则新建,如果存在则清空
a 打开追加。如果不存在则新建,如果存在则从文件尾开始
x 只新建,如果存在则不能打开
操作文件的正确流程为:打开文件 --> 读写文件 --> 关闭文件。文件在进行读写操作之前要先打开,使用完毕要关闭。

FILE *fopen(char *filename, char *mode);
filename为文件名(包括文件路径),mode为打开方式,它们都是字符串。
FILE *fp = fopen("demo.txt", "r");
表示以“只读”方式打开当前目录下的 demo.txt 文件,并使 fp 指向该文件,这样就可以通过 fp 来操作 demo.txt 了。fp 通常被称为文件指针。
FILE *fp = fopen("D:\\demo.txt","rb+");
表示以二进制方式打开 D 盘下的 demo.txt 文件,允许读和写。
整体来说,文件打开方式由 r、w、a、t、b、+ 六个字符拼成,各字符的含义是:
r(read):读
w(write):写
a(append):追加
t(text):文本文件
b(binary):二进制文件
+:读和写
字符读取函数 fgetc
int fgetc (FILE *fp);
fp 为文件指针。fgetc() 读取成功时返回读取到的字符,读取到文件末尾或读取失败时返回EOF。
EOF 是 end of file 的缩写,表示文件末尾,是在 stdio.h 中定义的宏,它的值是一个负数,往往是 -1。fgetc() 的返回值类型之所以为 int,就是为了容纳这个负数(char不能是负数)。
字符写入函数 fputc
fputc 是 file output char 的所以,意思是向指定的文件中写入一个字符。fputc() 的用法为:int fputc ( int ch, FILE *fp );
PS:不想写下去,就到这里吧。。。还要回去看指针是什么玩意呢。
乱七八糟的知识
变量名的命名规则:
1.不能以数字开头,不能使用关键字命名
2.由数字,英文,下划线(_)组成
% 取余数 都需要是整数
/ 整数除于整数的结果是整数 整除
++a 在用之前+1
a++ 是用完a在加+1
逻辑运算符
&& and 与
两个雪人在一起,,,与
&& 如果两个操作数均为true(非零),则条件为真(取1);
|| or 或
两个人,男人或者女人,两根筷子
|| 如果两个操作数中有其中任意一个非零,则条件为真。
! not 非
!用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。
C 作用域规则
全局变量是定义在函数外部,通常是在程序的顶部。全局变量在整个程序生命周期内都是有效的,在任意的函数内部能访问全局变量。
全局变量可以被任何函数访问。也就是说,全局变量在声明后整个程序中都是可用的。
在程序中,局部变量和全局变量的名称可以相同,但是在函数内,如果两个名字相同,会使用局部变量值,全局变量不会被使用。
就近为原则,我理解