关于C语言二级指针正确使用总结

关于C语言二级指针正确使用总结

什么是二级指针

C语言中的二级指针其实就是指向指针的指针,指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。同理可以构建三级或者N级指针,但是一般情况下用不到多级指针,只有二级指针在一些情况中需要使用,以下是二级指针的初始化:

二级指针的示意图

在这里插入图片描述


include <stdio.h>

int main(void)
{
    int var;
    int *ptr1; 
    int **ptr2;  //初始化一个整型的二级指针
    
    var = 50;
    ptr1 = &var;  /*获取var的地址*/
    ptr2 = &ptr1; /*获取ptr1的地址*/
    
    printf("var 的值是:var = %d\n", var);
    printf("var 的值是:*ptr1 = %d\n", *ptr1);
    printf("var 的值是:**ptr2 = %d\n", **ptr2);
    
    return 0;
}

编译以后的结果是:

var 的值是:var = 50
var 的值是:*ptr1 = 50
var 的值是:**ptr2 = 50

什么时候该使用二级指针作为函数形参

  • 传递指针数组
    在C语言中,数组与其它变量在使用上有很大的不同.无论是字符型、整型、实型变量,还是结构体类型或者指针类型的变量,语句中出现变量名都代表对该变量所在内存单元的访问,变量名代表整个变量在内存中的存储单元,可以向该变量赋值,也可以从中取出数据使用.但是定义一个数组之后,数组名并不代表整个数组所占据的内存单元,而是代表数组首元素的地址:
int function1(int **arary);
/*其中array是一个指针数组,元素是指针*/

int *arary[10];  //初始化一个指针数组
function(&arary);
  • 对传入的一级指针进行修改

二级指针在数据结构使用比较广泛,因为一些基础的数据结构中很多结构的初始化操作都是以建立一个头结点开始的,比如说在树中,通过调用函数对整体树的结点元素进行操作:改变结点的指向、结点的内存的释放以及结点内存的分配。这时就需要用到指向指针的指针。

我们以二叉树初始化函数为例,其中输入的参数为指向根节点的指针,为了给初始化的根节点指针分配内存就需要一个指针指向根节点指针:

typedef char ElemType;

typedef struct BiTNode
{
    ElemType data;
    struct BiTNode *lchild, *rchild;  //左子树&右子树
}BiTNode, *BitTree;

/**创建一个树*/
/*其中T是指向一个根节点指针的指针*/
/*如果此时只是传入根节点指针,那么只是传入根节点指针的副本,函数内的*/
/* 所有操作都是针对副本而言,因此对于这个函数就为该副本开辟了内存,而实际上*/
/* 根节点并没有分配到到内存*/
void CreateBitTree(BitTree *T);
{
    ElemType c;// 创建根节点元素

    scanf("%c", &c);
    if(' ' == c)     //无元素输入指针指向空
        *T = NULL;
    else
    {/*否则为树的结点分配空间*/
        *T = (BiTNode *)malloc(sizeof(BiTNode));
        (*T)->data = c;
        CreateBitTree(&((*T)->lchild));  //递归实现树的结点不断初始化
        CreateBitTree(&((*T)->rchild));
    }
}
以指针参数申请动态内存的错误示例
# include <stdio.h>
# include <stdlib.h>

void Iinitara(char * str, int num)
{
    str = (char *)malloc(sizeof(char) * num);
}

int main()
{
    char *str = NULL;
    Iintara(str, 100);
    strcpy(str, 'Hello World');   // 无法实现,因为main函数中的str并为分配到内存
    return 0;
}
总结
  • 如果修改实参指针指向时就需要用到二级指针
  • 如果传入参数是一级指针数组时需要用到二级指针
  • 如果只是用指针修改指向单元内容时,只需要传入一级指针即可
  • 16
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
计算机二级C语言知识点主要包括语法基础、数据类型、运算符、控制语句、函数、数组、字符串、结构体、指针等内容。 首先是语法基础,包括标识符的命名规则、注释的使用方法、变量的定义和声明等。掌握这些基础知识是理解后续知识的基础。 其次是数据类型,C语言中主要包括基本数据类型(如int、float、char等)和派生数据类型(如数组、结构体等)。对各种数据类型的特点、表示范围以及存储方式的了解,是编写程序的基础。 运算符包括算术运算符、关系运算符、逻辑运算符、位运算符等。掌握运算符的优先级和结合性,能够正确理解和使用运算符,编写出更加高效、准确的程序。 控制语句主要包括条件语句和循环语句。条件语句使用if-else语句和switch语句进行条件判断和多分支选择。循环语句包括for循环、while循环和do-while循环,用于重复执行一段代码。了解这些控制语句的用法和特点,能够正确地控制程序的执行流程。 函数是C语言的重要组成部分,能够提高代码的可重用性和可读性。学习函数的定义、调用和参数传递方式,能够编写出结构清晰、模块化的程序。 数组是一种能够存储多个相同类型数据的容器,了解数组的定义、使用和特点,能够处理大量数据,并进行各种操作。 字符串是一组字符的集合,掌握字符串的定义、初始化和操作函数的使用,能够处理字符串相关的操作,如拼接、比较等。 结构体是一种自定义的数据类型,可以包含多个不同类型的数据成员,了解结构体的定义和使用方式,能够处理更加复杂的数据结构。 指针是C语言的重要概念,通过指针可以直接访问内存地址,了解指针的定义、初始化和使用方式,能够灵活地处理内存中的数据。 综上所述,掌握二级C语言的知识点,对于理解计算机程序的执行原理、提高编程能力具有重要意义。通过实践和不断的积累,能够有效地应用这些知识点编写出高质量的C语言程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值