浅谈 scanf中的 EOF(文件结束的标志) End Of File
在scanf函数中,scanf读取失败的时候,它会返回一个-1 即EOF;读取成功的时候,它会返回读取到的数据的个数。常用于在线oj题目的多组输入。
关键字初识 (部分)
register (寄存器) :寄存器是集成在CPU上的一个区域,其存储数据的速度特别快。
int main(){
register int a=10; //建议编译器将变量a放入寄存器当中
return 0;
}
typedef (重命名,给变量起别名)
typedef unsigned int uint;
int main(){
uint a; //变量a即为unsigned int类型
return 0;
}
static(静态的)
可用来:1、修饰局部变量
2、修饰全局变量
3、修饰函数
void test(){
int a=0; //不用static修饰
a++;
printf(“%d\n”,a);
}
int main(){
int i = 0;
while(i<10){
test(); //只打印1
i++;
}
return 0;}
再看下列代码:
void test(){
static int a=0; //static修饰a
a++;
printf(“%d\n”,a);
}
int main(){
int i=0;
while(i<10){
test(); //打印了1到10的所有数字
i++;
}
return 0;
}
这里最好从内存的层面上去理解:
对于存储在栈区的数据,其在进入作用域时创建,出了作用域就被释放;而放在静态区的数据,直到程序结束的时候才被释放。则对于被static修饰的局部变量来说,其一开始被创建在静态区里,满足直到程序结束才释放,其值可以被更改,当我们使用一个局部变量,使如果用完时不想让他被内存释放,或者要更新它的值之后还要继续使用,则需要用static关键字修饰该局部变量。注意,它依旧是个局部变量,其生命周期没有变。
对于static修饰的全局变量和函数,它们两特点相似,只做解释不做代码验证了:全局变量和函数都是具有外部链接属性的,可以被非源文件的其他文件调用。但当其被static关键字修饰的时候,其外部链接属性被限制成了内部链接属性,即只能在它当前的源文件中被调用,其他源文件无法调用被static修饰的全局变量和函数。说白了,就是限制了他们的作用域。
define(定义常量和宏)
可用来定义符号和宏,对于符号不做过多详解,对于宏,坐如下研究:
#define M 100 //定义符号常量
#define MAX(x,y) (x > y ? x : y) // 宏 ,与函数类似,但有区别,如函数有返回值,而宏没有.
int main(){
int a=10;
int b=20;
int m = MAX(a,b); //即为 int m=(a > b ?a : b);
return 0;
}
宏只用来定义简单的逻辑判断,复杂的逻辑判断还是要用函数
C语言最具特色的 指针 (初识)
首先要理解内存,以及数据在内存当中的地址,这里不做描述因为已经有所理解了。直接对指针进行理解与描述。内存单元的编号=指针=地址。
先看如下代码:
int main(){
int a=0;
printf(“%p”,&a);//打印地址、指针用%p格式化
//a是整型,在内存当中占4个字节,但这里打印的时候,只打印了a变量在内存当中所占四个字节当中的第一个字节的地址
return 0;
}
在定义指针指向地址时,定义的指针的类型必须要和它指向的数据的数据类型相同:
int main(){
int a=10;
int *pa=&a; // 正确,a为int类型,pa也要为int型
float *pb=&a; // 错误,指针的类型和它所指向的数据的类型不匹配
return 0;
}
通过*(解引用)操作符可以取到指针指向地址中所存储的值:
int main()
{
int a=10;
int *pa=&a;
printf(“%d”,*pa); //打印10
return 0;
}