NULL,空字符串和"\0"

C语言指针初始化区别
本文通过一个简单的C语言程序对比了四种不同的字符串指针初始化方式:使用空字符串、NULL、空格字符和转义字符。文章详细解释了每种初始化方式下指针指向的内容及内存分配情况。

初学编程,脑袋闲的抽风突然想到

char* c1 = ""

char* c2 =  NULL

char* c3 = " "

char* c4 = "\0"

这四者之间到底有如何不同,就写了一段程序测试一下!

#include <stdio.h>
int main()
{
    char* c1 = "";
    char* c2 = NULL;
    char* c3 = " ";
    char* c4 = "\0";
   

    printf("c1 = %s\n", c1);
    printf("&c1 = %p\n", c1);
    printf("c1 = %d\n",*c1);   // 打印*c1 对应的十进制ASCII码
    printf("c2 = %s\n", c2);
    printf("&c2 = %p\n", c2);
    //printf("c2 = %d\n", *c2); // 这里会引发段错误
    printf("c3 = %s\n", c3);
    printf("&c3 = %p\n", c3);
    printf("c3 = %d\n", *c3);
    printf("c4 = %s\n", c4);
    printf("&c4 = %p\n", c4);
    printf("c4 = %d\n", *c4);     
   

    return 0;
}

编译执行如下所示:

 

可见 char* c1 = "" 与 char* c4 = "\0" 效果是相同的,都是在内存中申请了一个字节的内存用来存放一个空字符,

空字符对应的十进制ASCII码是0;

而char* c3 = " " 是在内存中申请了一个字节的内存存放空格字符即sp, 空格字符对应的十进制ASCII码是32;

char* c2 = NULL 没有申请任何内存也没有存放任何内容!

### 区别 - **定义本质**:`null` 表示一个空对象指针,是一个原始值,意味着变量被明确赋值为没有任何对象指向;空字符 `""` 是一个长度为 0 的字符,属于字符类型。 - **布尔值转换**:在布尔上下文中,`null` 转换为 `false`,空字符 `""` 同样转换为 `false`。但它们本质不同,例如: ```javascript console.log(Boolean(null)); // false console.log(Boolean("")); // false ``` - **类型检查**:使用 `typeof` 检查类型时,`null` 的类型是 `object`,这是 JavaScript 语言的一个历史遗留问题;空字符的类型是 `string`。 ```javascript console.log(typeof null); // "object" console.log(typeof ""); // "string" ``` ### 使用场景 - **null 的使用场景** - **初始化变量**:当变量需要在后续赋值,但初始时没有合适的值时,可将其初始化为 `null`。 ```javascript let data = null; // 后续根据条件赋值 if (someCondition) { data = { key: 'value' }; } ``` - **函数返回值**:函数在某些情况下无法返回有效结果时,可返回 `null` 表示无结果。 ```javascript function findElement(arr, target) { for (let i = 0; i < arr.length; i++) { if (arr[i] === target) { return arr[i]; } } return null; } ``` - **空字符的使用场景** - **表单输入**:用户未输入内容时,表单字段的值通常为空字符。 ```html <input type="text" id="myInput"> <script> const input = document.getElementById('myInput'); console.log(input.value); // 若用户未输入,值为空字符 </script> ``` - **字符拼接**:需要初始化一个空字符用于后续拼接其他字符。 ```javascript let result = ""; const words = ["Hello", " ", "World"]; for (let word of words) { result += word; } console.log(result); // "Hello World" ``` ### 处理方法 - **null 的处理方法** - **检查是否为 null**:使用 `===` 或 `!==` 来判断变量是否为 `null`。 ```javascript let value = null; if (value === null) { console.log("值为 null"); } ``` - **避免空指针错误**:在访问 `null` 变量的属性或方法前,先检查是否为 `null`。 ```javascript let obj = null; if (obj!== null) { console.log(obj.property); } ``` - **空字符的处理方法** - **检查是否为空字符**:使用 `===` 或检查字符长度是否为 0。 ```javascript let str = ""; if (str === "" || str.length === 0) { console.log("字符为空"); } ``` - **去除首尾空格**:使用 `trim()` 方法去除空字符可能存在的首尾空格。 ```javascript let str = " "; str = str.trim(); if (str === "") { console.log("去除空格后字符为空"); } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值