void指针 null指针 未初始化指针

本文详细解释了NULL指针、未初始化指针和void指针的特性及其在C/C++中的使用注意事项。同时介绍了void关键字的意义及void指针的应用场景。

转自http://hi.baidu.com/superluo/blog/item/68f1e703daaa73ea08fa9329.html

 

一个NULL指针,即
int *p = NULL;
解引用(*p)时会引起程序运行时错误(即程序崩溃),除非什么也不做的表达式:*p;
而一个未初始化的指针
int *q;
解引用 *q 只有在做左值时会引起程序运行时错误。
void *t;
解引用时 *t 会出现编译错误。

任何人如果事先不知道一个指针是否有值,都应该进行测试,然后才能对指针进行操作。

以上引自http://hi.baidu.com/mrdenglazy/blog/item/19380bca4ea9ed80c91768eb.html

关于void和void指针:

引自:http://dev.yesky.com/340/2517340_1.shtml

1.概述

  许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。

2.void的含义

  void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。

  void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:

void a;

  这行语句编译时会出错,提示“illegal use of type 'void'”。不过,即使void a的编译不会出错,它也没有任何实际意义。

  void真正发挥的作用在于:

  (1)对函数返回的限定;

  (2)对

<think>我们在讨论指针数组的初始化指针数组是一个数组,其元素都是指针。现在需要将指针数组的所有元素初始化NULL。根据引用[3],我们可以通过定义指针变量并初始化NULL。对于指针数组,我们可以使用类似的方法,在定义时初始化整个数组。例如,如果我们有一个指针数组,包含5个整数指针,我们可以这样初始化:int*arr[5]={NULL};但这种方式会将第一个元素初始化NULL,其余元素会被初始化为0(即NULL),因为C语言规定如果初始化列表的元素个数少于数组长度,则剩余元素被初始化为0。不过,为了确保所有元素都是NULL,我们可以显式地初始化每个元素:int*arr[5]={NULL,NULL,NULL,NULL,NULL};或者,我们可以在定义后使用循环进行初始化。下面给出两种方法的示例代码:方法1:定义时初始化(显式列出所有元素)方法2:定义后循环初始化同时,我们也可以使用静态初始化,或者使用memset函数(但注意memset通常用于内存块设置,对于指针数组,我们也可以使用,因为NULL就是0,但是要注意指针表示不一定与全0相同,不过通常NULL就是0。标准保证空指针常量(即0或(void*)0)转换为指针类型后成为空指针,而空指针不一定用全0表示,但memset(ptr,0,size)对于指针数组是否安全?实际上,由于空指针常量0转换为指针类型时是空指针,而memset将内存置0后,当我们读取这些指针时,它们将为空指针(因为标准规定用0表示的空指针常量转换为指针类型就是空指针,而内存全0的指针表示在大多数平台上是空指针,但并非所有平台都如此,所以最好避免使用memset来初始化指针为空指针,而是用赋值NULL的方式)。因此,推荐使用循环赋值或者初始化列表。示例1:初始化列表(适用于已知大小的数组)示例2:循环初始化(适用于大小可变或不想写多个NULL的情况)下面我们分别给出两个示例。</think> ### C语言指针数组初始化NULL的方法 在C语言中,指针数组是一个数组,其元素均为指针类型。将指针数组初始化为`NULL`的操作有几种常用方法: #### 📌 方法1:定义时显式初始化 ```c #include <stdio.h> int main() { // 定义包含5个指针的数组,全部初始化NULL int *ptrArray[5] = {NULL, NULL, NULL, NULL, NULL}; for (int i = 0; i < 5; i++) { printf("ptrArray[%d] = %p\n", i, (void *)ptrArray[i]); } return 0; } ``` - **执行结果**:所有元素输出`(nil)`或`0x0`(空指针值) - **优点**:语法简洁直观 - **注意**:需要手动指定每个元素[^1] #### 📌 方法2:使用循环初始化(推荐用于大型数组) ```c #include <stdio.h> int main() { int *ptrArray[10]; // 声明包含10个指针的数组 // 循环初始化所有元素为NULL for (int i = 0; i < 10; i++) { ptrArray[i] = NULL; } // 验证初始化结果 for (int i = 0; i < 10; i++) { if (ptrArray[i] == NULL) { printf("Element %d initialized to NULL\n", i); } } return 0; } ``` - **执行结果**:输出所有元素已初始化提示 - **优点**:适合知大小或动态数组 - **内存示意**: ``` 索引: 0 1 2 ... 9 值: NULL NULL NULL ... NULL ``` #### 📌 方法3:静态初始化(全局数组) ```c #include <stdio.h> // 全局数组自动初始化NULL int *globalPtrArray[3]; int main() { for (int i = 0; i < 3; i++) { printf("globalPtrArray[%d] = %p\n", i, (void *)globalPtrArray[i]); } return 0; } ``` - **特点**:显式初始化的全局指针数组自动设为`NULL` - **标准依据**:C标准规定全局变量自动初始化为零值(即`NULL`)[^3] ### 💡 关键概念 1. **NULL本质**:在C语言中定义为`(void*)0`,表示无效指针 2. **内存安全**:初始化为`NULL`可防止野指针导致的定义行为 3. **检测机制**:使用`if (ptr == NULL)`判断指针是否有效 ### ⚠️ 常见错误 ```c // 错误:只初始化第一个元素 int *ptrArray[5] = {NULL}; // 错误:memset不能保证NULL兼容性 memset(ptrArray, 0, sizeof(ptrArray)); ``` > 第一种错误导致后续元素值为0(但不一定是空指针),第二种可能在不兼容平台上出错[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值