强行复习第三天:c语言(下)
说好的段位难道不刷了嘛。。。。
复习归复习,题还是要刷啊喂!
明天就开始上课了。。。时间越来越紧了。。。
公众号里好多该更新的都没更。。。欠了一个app推荐,欠了一个流浪地球影评,欠了个黑寡妇个人向分析,还有一个预支出去了的复联四。。。
哦,对了,还想写一个乐园系列来着,仙女乐园写完了,还有妖精乐园想写。。。外加还想推荐点男歌手来着了。。。
林俊杰也没写。。
那个很棒的对比向idea也没写。。。
妈呀。。。
我有罪。。。
是不是还想做个漫威燃向混剪来着。。。
我还有好多材料没准备,还要复习,要刷题,要担心成绩还要照顾身体(笑哭)
比主席还忙~
加油吧,着手眼下,先做重要的。
先把c语言看完~
数组的一些语法细节:
int arr+[4+1] //是合法的
#define NUMBER 5
int arr[NUMBER]; //是合法的
int n;
…
int arr[n] //变量定义 不合法
int arr[5]={1,2,3}; //这种方法不常用,前三个赋值1,2,3,后面自动赋值为0
int arr[]={1,2,3}; //数组自动大小为3
int arr[3][4] //三行四列
int arr[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; //注意大括号之间的逗号
int arr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; //也行
int arr[3][4]={{0,1},{0,0,2},{3}};
结果是 0 1 0 我也不知道为啥要用这么鬼畜的方式赋值,反正这样是可以的。。。
0 0 2
3 0 0
int arr[][3]={1,2,3,4,5,6,7,8,9}; //可以
int arr[3][]={1,2,3,4,5,6,7,8,9}; //就不可以,你说气不气嘛
不过是有原因的,因为有上面那种鬼畜的复制方式,你只告诉我三行,谁知道你怎么划分的,有没有省略嘛。。。
int arr[3][4]可以看成3个长度为4的一维数组不假,不过。。。
凭什么对行和列双标!猪蹄子。。。
千呼万唤始出来的函数:
函数定义:把相关的语句组织起来,并给他们注明相应的名称,利用这种方法把程序分块,这种形式的组合就称为函数。也称例程或过程。
体现了结构化和分而治之,写完之后也觉得清晰清爽了不少,适合整理狂和强迫症陶冶身心。
void add(int arr[3])
{……}
数组中的值也跟着改变,原理很简单,因为形参接受的是实参的首地址,而操作的是这个地址指向的数据,当然会发生更改。就像多配了一把钥匙,你就能从那个屋子里随意取东西啦。
递归,即自我调用。怎样停下来是关键
c语言的存储空间分为三部分:代码区、静态存储区、动态存储区
变量的存储方式分为:静态存储和动态存储两种
静态存储变量:编译时就分定存储单元并一直保持不释放,直至整个程序结束,如全局变量。包括外部变量和静态变量
动态存储变量:在程序执行过程中,使用到时才分配存储单元,使用完毕立即释放,如函数的形参。包括自动变量和寄存器变量。
自动变量(动):类型说明符auto,未说明的变量都默认自动变量
外部变量(静):类型说明符extern,就是全局变量。全局变量站在作用域角度提出,外部变量站在存储方式角度提出。
一个源文件file1.c中定义int a;
在另一个源文件file2.c中声明extern int a; 就表示这些变量已经在其他文件中定义,不再为他们分配内存空间
静态变量(静):类型说明符static,静态变量属于静态存储方式,但是静态存储方式不一定是静态变量。
外部变量虽然属于静态存储方式,但不一定是静态变量,必须加static之后才能成为静态全局变量。
……怎么这么乱!不写了。
画一个思维导图就好了,如下:
内部函数:
static int f(int i,int j) //本文件使用
外部函数:
extern int f(int i,int j) //整个程序有效
c语言万恶之源之指针:
&:取地址符
*:指针运算符,取指针指的变量
指针居然可以用0赋值,代表空指针。。。我怎么不记得我学过这句。。。
这有一个优先级的问题要注意:
*pi++:因为++和*同级,结合方向自右向左,等价于*(pi++)
*++pi:等价于*(++pi)
对于一维数组 int iarr1[4]={1,2,3,4};
iarr是一个其数组元素类型的常量地址,即int型的常量地址,则iarr1+1的值会跳过一个数组元素,即4字节
对于二维数组int iarr[3][4];
iarr的数组元素是iarr[i],所以iarr是大小为4的一维数组型的常量地址,则iarr+1会跳过一个数组,即4*4字节
*(iarr+i)代表取出第i个元素
要记住,分清arr、arr[i]、arr[i][j]是啥
数组指针:
一维:
int iarr[4];
int *pia;
pia=iarr; //可以
二维:
int iarr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*pia)[4];
pia=iarr; //可以
指针数组:
int * pa[3];
也可以用来指向二维数组。
数组名作为实参,只有数组名,没有下标:
add(arr);
指向函数的指针
int max(int i1,int i2)
{……}
…
int (*pf)(int,int);
pf=max;
…
i3=(*pf)(i1,i2);
看上去有点神经病,大多数时候也不用,C++虚函数的时候会用。
说简单不简单,说难不难的字符串:
char carr[]="C Language"; //可以,注意双引号
scanf("%s",carr); //可以 这个直接就是地址,不用加&
字符串函数:
#include <string.h>
char *pc="C Language";
puts(pc); //输出
gets(pc); //输入
int i=strlen(pc); //字符串长度
char cArr[20]="I Love";
strcat(cArr,pc); //字符串链接,放到cArr里
strcpy(cArr,pc); //字符串复制,放到cArr里
int j=strcmp(carr,pc); //按照ASCII码比较串的大小 <则返回值小于0,其他同理
char *t=strstr(cArr,pc); //返回cArr中第一次出现pc的地址,注意是地址。
malloc动态分配堆区空间,涉及堆区的存储与释放时要记得#include <stdlib.h>
自定义数据类型:
赋值方式:
strStu1={102,"Zhang San",'M',78.5};
同类结构体之间可以直接赋值:
strStu1=strStu2;
结构体指针用->成员名
结构体的对象用.成员名
枚举类型???我咋毫无印象??
enum weekday
{
sun,mon,tue,wed,thu,fri,sat
};
enum weekday week1,week2;
终局之战之文件:
今天时间差不多了,感觉。。。文件不能考吧。。。没啥可考的。。。
就这么终局吧。。
加班加点看完了,不容易啊。。。