忽略点十五:EOF NULL \0的区别
——关于EOF:
在C语言中,关于EOF的宏定义:
#define EOF -1
也就是说,EOF其实就是-1,由于ASCII代码值的范围是从0~255,不会存在-1的情况,因此可以用EOF作为文件(必须是文本文件)结束标志或输入结束标志!!例如:
while (scanf ("%d", &a) != EOF) {}
EOF结束在windows对应按键是CTRL+Z,在linux对应按键是CTRL+D
——关于NULL:
在C语言中,关于NULL的宏定义:
#undef NULL
#if defined(__cplusplus) //如果存在__cplusplus这个宏定义
#define NULL 0 //NULL代表0
#else //否则
#define NULL ((void *)0) //NULL代表((void *)0)
#endif
由于__cplusplus宏定义只存在于C++中,所以在C语言里,NULL代表的是值为0的void型指针,称为空地址;
空地址真的是空吗?我们通过下面代码来输出一下NULL指针的地址:
int *p=NULL;
printf("%p\n",p); //输出结果为0x00000000
也就是说,NULL是用来代表指针为空的,但NULL也有地址,它并不是真正意义的空!!!它的作用是用来防止出现野指针的。从下面代码中就可以看出:
int *p;
if(p == NULL) {
printf("Ok\n"); //不会执行,表明野指针并不为空
}
printf("%p\n", p); //输出为一个随机地址
我们可以使用NULL作为空指针常量使用,例如:int* p = NULL;
也可以直接使用0作为空指针常量,例如:int* p = 0;
所以NULL常常用于指代对象或指针为空。例如用在链表中:
node* p = root;
while (p -> next != NULL) {
//前提条件是最后一个节点的next成员已经赋值为NULL,不然野指针并不为NULL
p = p -> next;
}
——关于\0:
'\0’是一个ASCII控制字符(转义字符),它代表空字符,作为字符串结尾字符~
比如用在某个字符串的遍历中:
char s[15] = "hello ACM";
int i = 0;
while (s[i] != '\0') {
i ++;
}
至于为什么拿出这三个来讲,是因为有时在while()里面对字符串,文本文件,指针之类的操作,!= 后加什么有时候迷糊~
就酱紫~
如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢!