C语言-基础语法学习-3 二级指针

这篇具有很好参考价值的文章主要介绍了C语言-基础语法学习-3 二级指针。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

二级指针

当涉及到多级指针时,C语言的灵活性和强大的指针功能可以得到充分的发挥。二级指针是指指向指针的指针,也被称为指向指针的引用。

使用二级指针可以实现以下功能:

  1. 动态内存分配:通过二级指针可以动态地分配内存块,并将其地址传递给其他函数或模块进行操作。这对于动态数据结构如链表、树等非常有用。
  2. 函数参数传递:二级指针可以用作函数的参数,通过传递指向指针的指针,函数可以修改原始指针的值,实现对指针本身的修改,而不仅仅是对指针所指向的数据的修改。
  3. 多维数组:在处理多维数组时,二级指针可以用于动态创建和操作二维及更高维的数组结构。
  4. 字符串处理:通过二级指针可以实现字符串的动态分配和修改,以及指针数组的管理。

二级指针的使用要注意以下几点:

  1. 内存管理:使用二级指针进行动态内存分配时,需要手动管理内存的分配和释放,确保在不需要使用时及时释放内存,避免内存泄漏。
  2. 空指针检查:在使用二级指针之前,务必进行空指针检查,避免对空指针进行操作导致程序崩溃或出现未定义行为。
  3. 间接访问:二级指针需要通过多次间接访问才能获得最终的数据,因此需要小心处理指针的层级关系,确保每一级指针的有效性和正确性。

总之,二级指针是C语言中一个强大且灵活的工具,它提供了对指针本身的操作和控制,使得程序可以更加高效地管理内存、处理复杂的数据结构以及实现更灵活的函数参数传递。但同时,使用二级指针也需要小心处理指针的有效性和内存管理,以确保程序的正确性和稳定性。

二级指针(double pointer)是指指针的指针,它可以用于在函数中传递和修改指针的值,或者动态管理内存。

定义

int data = 100;
int *p = &data;
int **pp = &p;   
//可以定义int *pp = &p, 但是在取内容时只能向上取一级,即*pp 为 p的地址
printf("%d", **pp);

举例

#include <stdio.h>
//二维数组表示一共3个人,每个人有4科成绩,调用函数传入二级指针,将一个人的4科成绩地址放入二级指针指向的地址
void getPosPerson(int pos, int (*pstu)[4], int **ppos)
{
    *ppos = (int *)(pstu + pos);
}

int main()
{
    int scores[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    int *ppos;
    int pos;
    scanf("%d", &pos);
    getPosPerson(pos, scores, &ppos);
    for (int i = 0; i < 4; i++)
        printf("%d ", *ppos++);
    return 0;
}

C语言中的二级指针(指向指针的指针)在处理多级指针或者动态内存分配等情况下非常有用。下面是关于C语言二级指针的一些重要知识点:

二级指针的定义和声明

二级指针是指向指针的指针,使用两个星号(**)表示。例如:

int** ptr;

二级指针的初始化

二级指针需要进行两级的内存分配。首先,分配一个指针变量的内存,然后为该指针变量分配指向的内存。示例:

int* p;
int** ptr = &p;

二级指针的使用

通过二级指针可以访问和修改指针指向的内存。例如,通过二级指针可以间接修改一级指针所指向的变量的值。示例:

int x = 10;
int* p = &x;
int** ptr = &p;

**ptr = 20; // 修改p指向的变量的值为20

二级指针和函数参数

二级指针常用于函数参数,可以通过传递指针的指针来修改原始指针的值。这在需要修改指针本身的情况下非常有用。示例:

void updatePointer(int** ptr) {
    int* newPtr = malloc(sizeof(int));
    *newPtr = 100;
    *ptr = newPtr;
}

int main() {
    int* p = NULL;
    updatePointer(&p);
    // 现在p指向了动态分配的内存
    // 可以通过*p访问该内存的值
    return 0;
}

二级指针和动态内存分配

二级指针可以用于动态分配内存。通过二级指针,可以分配指针数组或多维数组的内存。示例:

int numRows = 3;
int numCols = 4;
int** matrix = malloc(numRows * sizeof(int*));
for (int i = 0; i < numRows; i++) {
    matrix[i] = malloc(numCols * sizeof(int));
}
// 现在可以通过matrix[i][j]访问二维数组的元素

以上是关于C语言二级指针的一些基本知识点和用法。二级指针在处理多级指针、动态内存分配和函数参数传递等场景下非常有用,可以灵活地管理和操作指针的指针。

数组指针

二级指针和二维数组注意:

不能直接用二级指针指向二维数组,int **p = scores后虽然指向的地址相同,但是含义类型并不相同,错误,应该用数组指针指向二维数组。

int scores[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
int **p;
//p = scores;  错误 
int (*p2)[4] = scores; //数组指针,定义一个指针,指向一个数组,数组指针才是真正等同于二维数组名
p = &p2;  //可以用二级指针指向数组指针的地址
**p = 100; //修改的是scores[0][0]的值

二维数组

二维数组的初始化
  1. 按行列初始化

C语言-基础语法学习-3 二级指针,C语言上官,c语言,学习,开发语言

  1. 没明确行列,类似一维数组

C语言-基础语法学习-3 二级指针,C语言上官,c语言,学习,开发语言

  1. 部分赋初值

C语言-基础语法学习-3 二级指针,C语言上官,c语言,学习,开发语言
2.
C语言-基础语法学习-3 二级指针,C语言上官,c语言,学习,开发语言

C语言-基础语法学习-3 二级指针,C语言上官,c语言,学习,开发语言

4.C语言-基础语法学习-3 二级指针,C语言上官,c语言,学习,开发语言

二维数组与指针

C语言规定数组名代表数组首元素地址

int a[3][3];

a[0],a[1],a[2] 是一维数组名,则
a[0] 代表一维数组a[0]中第0列元素的地址,即

a[0] = &a[0][0]
a[1] = &a[1][0]
a[2] = &a[2][0]
------------------------
a = &a[0]
*a = a[0]
**a = a[0][0]
a + 1 = &a[1]
*(a + 1) = a[1]
a[0] + 1 = &a[0][1] = *(a + 0) + 1   
------------------------------

参考

C语言-基础语法学习-3 二级指针,C语言上官,c语言,学习,开发语言

C语言-基础语法学习-3 二级指针,C语言上官,c语言,学习,开发语言

总结

C语言-基础语法学习-3 二级指针,C语言上官,c语言,学习,开发语言

二维数组的遍历

操作数组名

int array[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};

for (int i = 0; i < 3; i++)
    for (int j = 0; j < 4; j++) {
        //几种写法一样效果
        printf("%d ", array[i][j]);
        printf("%d ", *(array[i] + j));
        printf("%d ", *(*(array + i) + j));
    }

操作指针文章来源地址https://www.toymoban.com/news/detail-518701.html

int array[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};

int *p1 = &array[0][0];
int (*p2)[4] = array;  //数组指针,定义一个指针,指向一个数组,数组指针才是真正等同于二维数组名

for (int i = 0; i < 3; i++)
    for (int j = 0; j < 4; j++) {
        printf("%d ", *p1++);
        printf("%d ", *(*(p2 + i) + j));
    }

到了这里,关于C语言-基础语法学习-3 二级指针的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • NRCE 二级C语言开发环境:Microsoft Visual C++ 2010 学习版下载

    Microsoft Visual C++ 2010 学习版 2022版考纲 网盘链接:点击下载 提取码:siyy 网盘地址下载太慢可以到:官网下载 下载完成后,是一个iso镜像文件,点击上方装载。 装载完成后,可以看到计算机处有个无穷图标的DVD驱动器 现在就可以去到你安装磁盘目录下的IDE目录(星号中间的

    2024年02月11日
    浏览(57)
  • C语言,二级指针,p,*p,**p的使用

             二级指针的使用是一个非常不易的问题,主要还是用的少了,如果经常使用到他,就会很明显的感受到其具体使用方法。 char *a[10]={\\\"as\\\",\\\"bc\\\",\\\"ssasd\\\",\\\"asd\\\"}; char **p=a;  则 p,*p,**p的含义:         在给定代码中,定义了一个字符指针数组 a ,并初始化了其中的元素

    2024年02月13日
    浏览(43)
  • 【计算机二级考试C语言】C基本语法

    我们已经看过 C 程序的基本结构,这将有助于我们理解 C 语言的其他基本的构建块。 C 程序由各种令牌组成,令牌可以是、标识符、常量、字符串值,或者是一个符号。例如,下面的 C 语句包括五个令牌: 这五个令牌分别是: 在 C 程序中,分号是语句结束符。也就是

    2024年01月18日
    浏览(52)
  • C语言-基础语法学习-1 函数

    当我们需要在C语言中传递一维数组作为函数的形参时,需要了解以下几个关键点: 函数声明和定义:在声明和定义函数时,我们可以使用以下方式指定一维数组作为形参: 或者 这两种方式都允许我们传递一个一维数组作为形参。 数组传递:在C语言中,数组传递实际上是通

    2024年02月12日
    浏览(53)
  • Rust 程序设计语言学习——基础语法

    Rust 语言是一种高效、可靠的通用高级语言。其高效不仅限于开发效率,它的执行效率也是令人称赞的,是一种少有的兼顾开发效率和执行效率的语言。 Rust 语言由 Mozilla 开发,最早发布于 2014 年 9 月。Rust 的编译器是在 MIT License 和 Apache License 2.0 双重协议声明下的免费开源软

    2024年01月22日
    浏览(52)
  • 【鸿蒙开发】第七章 ArkTS语言UI范式-基础语法

    通过前面的章节,我们基本清楚鸿蒙应用开发用到的语言和项目基本结构,在【鸿蒙开发】第四章 Stage应用模型及项目结构也提到过ArkTS的UI范式的 基本语法 、 状态管理 、 渲染控制 等能力,简要介绍如下: 基本语法 : ArkTS 定义了 声明式UI描述 、 自定义组件 和 动态扩展

    2024年02月03日
    浏览(64)
  • C语言——指针基本语法

    内存地址 在计算机内存中,每个存储单元都有一个唯一的地址(内存编号)。 通俗理解,内存就是房间,地址就是门牌号 指针和指针变量 指针(Pointer)是一种特殊的变量类型,它用于存储内存地址。 指针的实质就是内存“地址” 指针变量就是存储这个地址的变量。 指针作用

    2024年02月10日
    浏览(58)
  • HarmonyOS学习路之方舟开发框架—学习ArkTS语言(基本语法 二)

    在ArkUI中,UI显示的内容均为组件,由框架直接提供的称为系统组件,由开发者定义的称为自定义组件。在进行 UI 界面开发时,通常不是简单的将系统组件进行组合使用,而是需要考虑代码可复用性、业务逻辑与UI分离,后续版本演进等因素。因此,将UI和部分业务逻辑封装成

    2024年02月04日
    浏览(54)
  • HarmonyOS学习路之方舟开发框架—学习ArkTS语言(基本语法 四)

    当创建了自定义组件,并想对该组件添加特定功能时,例如在自定义组件中添加一个点击跳转操作。若直接在组件内嵌入事件方法,将会导致所有引入该自定义组件的地方均增加了该功能。为解决此问题,ArkUI引入了@BuilderParam装饰器,@BuilderParam用来装饰指向@Builder方法的变量

    2024年02月17日
    浏览(53)
  • HarmonyOS学习路之方舟开发框架—学习ArkTS语言(基本语法 三)

    在开始之前,先明确自定义组件和页面的关系: 自定义组件: @Component 装饰的 UI 单元,可以组合多个系统组件实现 UI 的复用。 页面:即应用的 UI 页面。可以由一个或者多个自定义组件组成, @Entry 装饰的自定义组件为页面的入口组件,即页面的根节点,一个页面有且仅能有

    2024年02月16日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包