有关指针变量的类型及含有义

本文详细介绍了C语言中的各种变量定义方式及其含义,包括基本的整型变量、指针变量、数组、指针数组等,并解释了复杂的指针到函数及函数返回指针的概念。
变量定义 类型表示 含义
int i; int 定义整型变量 i
int * p; int * 定义 p 为指向整型数据的指针变量
int a[5]; int [5] 定义整型数组 a,它有 5 个元素
int * p[4]; int * [4] 定义指针数组 p,它由 4 个指向整型数据的指针元素组成
int ( * p )[4]; int ( * )[4] p 为指向包含 4 个元素的一维数组的指针变量
int f( ); int ( ) f 为返回整型函数值的函数
int * p( ); int * ( ) p 为返回一个指针的函数,该指针指向整型数据
int ( * p )( ); int ( * )( ) p 为指向函数的指针,该函数返回一个整型值
int ** p; int ** p 是一个指针变量,它指向一个指向整型数据的指针变量
int const * p; int const * p 是常指针,其值是固定的,即指向不能变
const int * p; const int * p 是指向常量的指针变量,不能通过 p 改变其指向的对象的值
const int * const p; const int * const p 是指向常量的常指针,其指向不能变,且不能通过 p 改变其指向的变量的值
void * p; void * p 是一个指针变量,类型为 viod(空类型),不指向具体的对象


### C语言指针置为NULL的最佳实践 在C语言中,将指针置为`NULL`是一种常见的做法,目的是为了表示该指针当前不指向任何有效的内存地址。这种操作可以有效防止悬空指针(dangling pointer)带来的潜在风险,并提升程序的安全性和稳定性。 #### 使用`NULL`的意 `NULL`是一个宏定义,通常被定义为`(void*)0`或简单的`0`[^1]。它用来表示一个特殊的指针值,表明这个指针目前未指向任何实际的对象或内存位置。通过显式地将指针初始化为`NULL`,程序员能够清楚地区分合法的指针值和非法状态下的指针值。 #### 如何正确设置指针为`NULL` 以下是几种推荐的方式: 1. **声明并初始化指针** 在声明指针变量的同时将其初始化为`NULL`,这是预防未初始化指针引发问题的有效方法之一。 ```c int *p = NULL; ``` 2. **动态分配失败后的处理** 当尝试使用`malloc()`或其他函数动态分配内存时,如果返回的是`NULL`,则说明请求未能成功完成。此时应立即将相关指针设回`NULL`以避免后续误用。 ```c int *arr = (int *)malloc(10 * sizeof(int)); if (!arr) { arr = NULL; // 明确标记此指针不可用 } free(arr); arr = NULL; // 防止释放后再次访问已销毁资源 ``` 3. **函数退出前清理局部指针** 如果某个函数内部创建了一个临时使用的指针对象,则应在离开作用域之前确保其已被适当重置至`NULL`状态。 ```c void example_function() { char *buffer = malloc(BUFFER_SIZE); ... free(buffer); buffer = NULL; // 确保不会意外再引用已经free掉的空间 } ``` 4. **结构体内成员指针的操作** 对于复杂数据类型的实例化过程里涉及多个子字段均为指针的情况,同样建议逐一设定默认初值为`NULL`。 ```c typedef struct Node { struct Node *leftChild; struct Node *rightChild; } TreeNode; TreeNode root; memset(&root, 0, sizeof(TreeNode)); // 或者手动赋值如下: root.leftChild = NULL; root.rightChild = NULL; ``` 需要注意的一点是,尽管某些编译器可能允许直接把数值零赋予给指针类型变量来代表同样的含义,但从可读性和跨平台兼容性的角度来看,还是强烈提倡采用标准形式即利用预定义好的常量名`NULL`来进行此类操作][^[^23]。 另外值得注意的一个常见误区在于认为只要简单地让某指针等于另一个含有`NULL`值得到的新副本就万事大吉了;然而实际上还需要考虑原版是否已经被解除绑定等问题以免造成逻辑混乱甚至崩溃事故的发生[^4]。 综上所述,在日常开发实践中养成良好的习惯——始终记得适时适当地运用好这一特性将会极大地促进代码质量的整体改善!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值