我们先讨论NULL,平时使用指针的时候,会经常遇见这个家伙,这个家伙的值是是这样定义的
#define NULL 0
或者
#define NULL (void *)0
我们看一下下面这段代码
#include <stdio.h>int main () {size_t ii;int *ptr = NULL;unsigned long *null_value = (unsigned long *)&ptr;if (NULL == 0) {printf ("NULL == 0\n"); }printf ("NULL = 0x");for (ii = 0; ii < sizeof (ptr); ii++) {printf ("%02X", null_value[ii]); }printf ("\n");return 0;
}
程序输出
NULL == 0
NULL = 0x000061FE08000400B1138000--------------------------------
Process exited after 0.02921 seconds with return value 0
请按任意键继续. . .
我们用 &ptr
获取 ptr
的地址,然后用 unsigned long *
把这个地址转换成 unsigned long *
类型,之后再用 *
钥匙来打开这个地址,获取这个地址的值。只不过这里不是用 *
获取,用的是数组偏移。
我们修改下代码
#include <stdio.h>int main () {size_t ii;int *ptr = NULL;unsigned long *null_value = (unsigned long *)&ptr;if (NULL == 0) {printf ("NULL == 0\n"); }printf ("NULL = 0x");for (ii = 0; ii < sizeof (ptr); ii++) {printf ("%02X", null_value[ii]); }printf ("\n");printf("0x%p 0x%p\n",ptr,&ptr);return 0;
}
程序输出
NULL == 0
NULL = 0x000061FE08000400A7138000
0x0000000000000000 0x000000000061FE08--------------------------------
Process exited after 0.03177 seconds with return value 0
请按任意键继续. . .
这样看之后,就觉得没有那么拗口了吧。
我们再讨论下 「'0'」
字符 0 和其他都不能混为一谈,它是一个字符,字符对应的是ascii 码
#include <stdio.h>int main () {char c = '0'; printf("'%c' 0x%x %d\n",c,c,c); return 0;
}
程序输出
'0' 0x30 48--------------------------------
Process exited after 0.02841 seconds with return value 0
请按任意键继续. . .
「"0"」是一个字符串,字符串跟字符的不同是,字符串在最后面有一个字符结束标识 nul
。
测试程序
#include <stdio.h>
#include <string.h>
int main () {char * str = "0"; int len = strlen(str);printf("%d\n",len); for(int i = 0;i< len +1;i++)printf("[0x%x]",str[i]);return 0;
}
程序输出
1
[0x30][0x0]
--------------------------------
Process exited after 0.02936 seconds with return value 0
请按任意键继续. . .
「\0」这个就有点意思了,这个其实也就是数值 0
。
测试程序
#include <stdio.h>
#include <string.h>
int main () {char c = '\0';printf("'%c' 0x%x %d\n",c,c,c); return 0;
}
程序输出
' ' 0x0 0--------------------------------
Process exited after 0.03893 seconds with return value 0
请按任意键继续. . .
好了,就这些,看了这些之后,就再也不用担心如果一个字符串里面有 0
字符不知道怎么做算法比较了吧。
推荐阅读:
专辑|Linux文章汇总
专辑|程序人生
专辑|C语言
嵌入式Linux
微信扫描二维码,关注我的公众号