【C 语言】一级指针 易犯错误 模型 ( 判定指针合法性 | 数组越界 | 不断修改指针变量值 | 函数中将栈内存数组返回 | 函数间接赋值形参操作 | 指针取值与自增操作 )

简介: 【C 语言】一级指针 易犯错误 模型 ( 判定指针合法性 | 数组越界 | 不断修改指针变量值 | 函数中将栈内存数组返回 | 函数间接赋值形参操作 | 指针取值与自增操作 )

文章目录

一、判定指针合法性

二、数组越界

三、不断修改指针变量值

四、函数中将栈内存数组返回

五、函数间接赋值形参操作

六、指针取值与自增操作





一、判定指针合法性


判定指针合法性时 , 必须进行如下判断 , 判断的是 指针指向的地址 是否为 NULL , 即 是否为 0 地址 ;


int get_value(char *key_value, char *key, char *value, int *value_len)
{
    // 任何函数调用前 , 先判定函数形参正确性
    if(key_value == NULL || key == NULL || value == NULL || value_len == NULL)
    {
        printf("key_value == NULL || key == NULL || value == NULL || value_len == NULL\n");
        return -1;
    }
}


不能判断 指针指向的内容是否为 0 , 下面的示例是错误的 :


// 错误示例
int get_value(char *key_value)
{
    // 错误的判定示例
    if(*key_value != '\0')
    {
        return -1;
    }
}


C 语言中的 指针 , 内存 等原理必须知道 , 不知道原理 , 就不会调用指针 ;


Java 语言中都会调用 , 即使 不懂 其中的内存 , 引用 相关的内存 原理 ;






二、数组越界


定义数组变量后 , 为其赋值时 , 赋值的内容 超出了数组的大小 ;


错误示例 : "abc" 字符串需要 4 44 字节内存 , 后面第 4 44 个字节是 \0 字符 ;


// 错误示例 
char str[3] = "abc";





三、不断修改指针变量值


凡是涉及到修改 指针 变量值时 , 不要直接修改 原来的 指针变量 指向 ;


推荐 创建新的 临时局部指针变量 , 接收该 指针 , 需要修改指针时 , 修改 该 临时局部指针变量 ;






四、函数中将栈内存数组返回


如果在函数中 , 需要 创建一块内存空间 , 返回给调用者 ;


这块在 函数中 创建的内存 , 不能是数组 , 必须使用 malloc 函数 , 在 堆内存 中创建一块内存空间 ;


在 函数内 创建的数组 存储在 栈内存中 , 栈内存的数据 , 在函数结束后 , 其被系统自动回收 , 该内存可能被写入其它数据 ;






五、函数间接赋值形参操作


在函数中 , 如果需要通过 函数的 形参指针变量 通过 间接赋值 返回相关结果 , 这个指针使用时要慎重 ;


建议 创建一个 临时局部指针变量 , 接收该 形参指针 , 需要修改 指针 时 , 修改 临时局部指针变量 ;






六、指针取值与自增操作


对于指针 * 和 ++ 同时操作时 , 如 :


*p++;


特别注意 , 后缀 ++ 操作优先级高 , 先执行 *p 操作 , 然后地址 ++ ;


上述语句执行后 , 指针指向的地址就改变了 ;


对于不确定的操作 , 建议使用 () 设置操作优先级 ;



将 指针 指向的地址 中存储的 值 自增 : 先取出值 , 然后自增 ;


(*p)++ ;

(*p)++ ;



先将地址自增 , 然后再取值 :


*(p++);



目录
相关文章
|
6天前
|
安全 程序员 编译器
【C语言基础】:深入理解指针(二)
【C语言基础】:深入理解指针(二)
【C语言基础】:深入理解指针(二)
|
5天前
|
算法 Java 程序员
面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性
【6月更文挑战第15天】面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性。封装可使用结构体封装数据和方法,如模拟矩形对象。继承则通过结构体嵌套实现静态继承。多态可通过函数指针模拟,但C不支持虚函数表,实现复杂。C语言能体现OOP思想,但不如C++、Java等语言原生支持。
23 7
|
6天前
|
安全 C语言
【C语言基础】:内存操作函数
【C语言基础】:内存操作函数
|
6天前
|
C语言
【C语言基础】:深入理解指针(终篇)
【C语言基础】:深入理解指针(终篇)
|
6天前
|
存储 C语言 C++
【C语言基础】:深入理解指针(三)
【C语言基础】:深入理解指针(三)
|
7月前
|
C语言
【C语言】用函数递归的方法解决汉诺塔问题
【C语言】用函数递归的方法解决汉诺塔问题
37 0
|
算法 程序员 C语言
C语言基础(有关三个数比较大小、冒泡排序、最大公约数、和有关某个数x的绝对值的n次方除于n的阶乘问题的函数求解法;和阶乘函数递归方法;和数组作函数参数的
C语言基础(有关三个数比较大小、冒泡排序、最大公约数、和有关某个数x的绝对值的n次方除于n的阶乘问题的函数求解法;和阶乘函数递归方法;和数组作函数参数的
|
C语言
字符串逆序(C语言版 函数,递归方法)
字符串逆序(C语言版 函数,递归方法)
100 0
字符串逆序(C语言版 函数,递归方法)
|
Linux 编译器 C语言
C语言调用C++实现的库函数方法
C语言调用C++实现的库函数方法
145 0
|
C语言
C语言编写函数字符串删除对应的字符(两种方法)
C语言编写函数字符串删除对应的字符(两种方法)
596 0
C语言编写函数字符串删除对应的字符(两种方法)