【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++);



目录
相关文章
|
4天前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
29 12
|
12天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
35 4
|
30天前
|
存储 编译器 C语言
【c语言】数组
本文介绍了数组的基本概念及一维和二维数组的创建、初始化、使用方法及其在内存中的存储形式。一维数组通过下标访问元素,支持初始化和动态输入输出。二维数组则通过行和列的下标访问元素,同样支持初始化和动态输入输出。此外,还简要介绍了C99标准中的变长数组,允许在运行时根据变量创建数组,但不能初始化。
37 6
|
27天前
|
存储 Rust C#
内存指针解引用
【10月更文挑战第14天】
30 1
|
1月前
|
存储 人工智能 BI
C语言:数组的分类
C语言中的数组分为一维数组、多维数组和字符串数组。一维数组是最基本的形式,用于存储一系列相同类型的元素;多维数组则可以看作是一维数组的数组,常用于矩阵运算等场景;字符串数组则是以字符为元素的一维数组,专门用于处理文本数据。
|
1月前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
1月前
|
存储 C语言
C语言:一维数组的不初始化、部分初始化、完全初始化的不同点
C语言中一维数组的初始化有三种情况:不初始化时,数组元素的值是随机的;部分初始化时,未指定的元素会被自动赋值为0;完全初始化时,所有元素都被赋予了初始值。
|
1月前
|
C语言 C++
保姆式教学C语言——数组
保姆式教学C语言——数组
17 0
保姆式教学C语言——数组
|
1月前
|
C语言
C语言数组
C语言数组
19 0
|
1月前
|
存储 C语言 索引
c语言回顾-数组(全网最详细,哈哈哈) (下)
c语言回顾-数组(全网最详细,哈哈哈) (下)
44 0
下一篇
无影云桌面