C语言查缺补漏(十五)EOF NULL \0的区别

忽略点十五: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()里面对字符串,文本文件,指针之类的操作,!= 后加什么有时候迷糊~

​ 就酱紫~

转载请注明出处!!!

如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢!

猜你喜欢

转载自blog.csdn.net/Ivan_zcy/article/details/82960216