二级指针:可以理解为指向指针的指针,存放的是指针变量的地址。

下面用一级指针来保存一个指针变量的地址;

#include<stdio.h>

int main()
{
int *p1;
int *p2;
int data;
p1=&data;
p2=&p1;
printf("p1保存的地址=%p\n",&data);
printf("data=%d\n",*p1);
printf("p2的地址=%p\n",&p2); return 0;
}

输出结果:

p1保存的地址=000000000061FE0C
data=0
p2的地址=000000000061FE10

现在使用二级指针来实现同样的功能:

#include<stdio.h>

int main()
{
// int *p1;
// int *p2;
// int data;
// p1=&data;
// p2=&p1;
// printf("p1保存的地址=%p\n",&data);
// printf("data=%d\n",*p1);
// printf("p2的地址=%p\n",&p2); int data;
int *p1;
int **p2;
p1=&data;
p2=&p1;
printf("p1保存的地址=%p\n",&data);
printf("data=%d\n",*p1);
printf("p2的地址=%p\n",p2);
printf("data=%d\n",**p2); return 0;
}

输出结果:

p1保存的地址=000000000061FE14
data=0
p2的地址=000000000061FE08
data=0
二级指针和二级数组避坑

#include<stdio.h>
/*
野指针是指向位置随机的(乱指一气),错误的指针,系统无法对其进行操作。野指针指向的值是非法的内存地址,指向的内存是不可用的。
*/ int main()
{
//二级指针和二维数组避坑
int scores1[3][4]={
{10,20,30,40},
{50,60,70,80},
{90,100,110,120}
};
//定义一个二级指针
int **p1;
p1=scores1;
printf("p1:%p\n",p1);
printf("scores1:%p\n",scores1);
printf("*p1:%p\n",*p1);//*p1是一个野指针,不是我们认为的会变成列地址
**p1=2200;//修改scores[0][0]
printf("done\n"); return 0;
}

如果想让一个二级指针p指向一个二级数组,那么*p不是你认为的二维数组的列地址,而是一个野指针,是无法对二维数组进行操作的。如果想对二维数组修改。,可以通过使用

数组指针来指向二维数组的地址,再让二级指针指向数组指针的地址,而不能直接让二级指针指向一个二维数组。

#include<stdio.h>

int main()
{
int scores2[3][4]={
{10,20,30,40},
{50,60,70,80},
{90,100,110,120}
};
//定义一个二级指针
int **p2;
//定义一个数组指针
int (*p3)[4]=scores2;
//让二级指针指向数组指针地址
p2=&p3;
printf("p3:%p\n",p3);
printf("scores2:%p\n",scores2);
//修改scores
p2[0][0]=120;
printf("scores2[0][0]:%d\n",scores2[0][0]);
return 0;
}

输出结果:

p3:000000000061FDE0
scores2:000000000061FDE0
scores2[0][0]:120

虽然可以实现,但是不建议这样使用,而且编译器也在编译的时候也会抛出警告。

嵌入式-C语言基础:二级指针的更多相关文章

  1. 嵌入式-C语言基础:指针函数

    指针函数:返回指针的函数,即函数返回一个地址.例如:int * a(int x,int y);由于()的优先级比*高,因此a先与()结合,a(int x,int y)显然是一个函数,函数前面带一个in ...

  2. 嵌入式-C语言基础:指针数组(和数组指针区分开来)

    指针数组:一个数组,若其元素均为指针类型的数据,称为指针数组,指针数组存放的是指针类型的数据,也就是指针数组的每个元素都存放一个地址.下面定义一个指针数组: int * p[4];//[]的优先级是比 ...

  3. 嵌入式-C语言基础:指针偏移打印数组

    在C语言中,数组名代表数组中首元素的地址,所以,下面两句获取数组的首地址是等价的: #include<stdio.h> int main() { int a[5]={1,2,3,4,5}; ...

  4. 嵌入式-C语言基础:指针是存放变量的地址,那为什么要区分类型?

    指针是存放变量的地址,那为什么要区分类型?不能所有类型的变量都用一个类型吗?下面用一个例子来说明这个问题. #include<stdio.h> int main() { int a=0x1 ...

  5. 嵌入式-C语言基础:指针

    指针就是地址,变量的值可以通过两种方式访问,一个是通过变量名,一个是通过地址访问. 从而引出一个问题,即什么是指针变量?整型(字符)变量就是存放整形(字符)的变量,指针变量就是存放指针的变量,也就是存 ...

  6. GO学习-(10) Go语言基础之指针

    Go语言基础之指针 区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针. 要搞明白Go语言中的指针需要先知道3个概念:指针地址.指针类型和指针取值. Go语言中的指针 任何程序数 ...

  7. C语言复习: 二级指针和多级指针

    二级指针内存模型建立 void main2() {     int i = 0;       //指针数组     char * p1[] = { "123", "456 ...

  8. 由链表初始化看C语言的二级指针

    先来看C语言创建链表.插入节点和遍历链表的一段代码: #include <stdio.h> #include <stdlib.h> typedef int ElemType; ...

  9. 论C语言中二级指针和二维数组之间的区别

    刚开始学习C语言的时候,觉得一个数组可以定义一个一级指针去访问,想当然的就觉得可以定义一个二级指针去访问二维数组.很显然这是错误的. 我们来看看C语言的数组在内存中的存储方式. 实际上C语言中的数组, ...

随机推荐

  1. 【java】学习路线10-权限修饰符详解

    /*关于修饰符:类:public default                public protected default privatesame class          √       ...

  2. 《Java编程思想》读书笔记(三)

    前言:三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第十一章到第十六章的内容,这一次 ...

  3. 如何在 C# 程序中注入恶意 DLL?

    一:背景 前段时间在训练营上课的时候就有朋友提到一个问题,为什么 Windbg 附加到 C# 程序后,程序就处于中断状态了?它到底是如何实现的? 其实简而言之就是线程的远程注入,这一篇就展开说一下. ...

  4. KingbaseES ksqlrc文件介绍

    ksqlrc文件作用 ksql在连接到数据库后但在接收正常的命令之前,会尝试读取并执行该文件中的命令,如果加上-X参数,则跳过该文件. 系统级的启动文件是ksqlrc,文件在安装好的KingbaseE ...

  5. 如何在 Jenkins CI/CD 流水线中保护密钥?

    CI/CD 流水线是 DevOps 团队软件交付过程的基本组成部分.该流水线利用自动化和持续监控来实现软件的无缝交付.通过持续自动化,确保 CI/CD 流水线每一步的安全性非常重要.在流水线的各个阶段 ...

  6. 不懂 Kubernetes 实现云原生是什么体验?

    云原生的本质和最终效果 要明白什么是云原生,就要先弄明白云计算是什么有什么问题,云计算将计算资源.网络.存储等基础设施统一管理,通过资源规模化和自动化管理,实现降低资源的成本和提高资源的管理效率,云计 ...

  7. Exchange 2019数据库切换

    最近在测试Exchange 2019的一些安装步骤.在测试到DAG的数据库切换的时候遇到了一些问题.An Active Manager operation failed. Error: The dat ...

  8. vCenter 升级错误 VCSServiceManager 1603

    近日,看到了VMware发布的vCenter 6.7 Update 1b的更新消息.其中有一条比较震撼.有误删所有VM的概率,这种BUG谁也承受不起. Removing a virtual machi ...

  9. k8s中pod的容器日志查看命令

    如果容器已经崩溃停止,您可以仍然使用 kubectl logs --previous 获取该容器的日志,只不过需要添加参数 --previous. 如果 Pod 中包含多个容器,而您想要看其中某一个容 ...

  10. 使用 Loki 搭建个人日志平台

    文章转载自:https://blog.kelu.org/tech/2020/01/31/grafana-loki-for-logging-aggregation.html 背景 Loki的第一个稳定版 ...