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

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

#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. 批处理(bat)命令修改xml模板数据

    给定一个模板,然后通过bat修改某个节点中的值 模板如下: <?xml version="1.0" encoding="UTF-16"?> < ...

  2. 第五十三篇:Vue安装Element ui

    好家伙,之前写的一篇过时了,用不了了,更新一波 (已新建一个vue项目) 1. 在项目目录下执行:npm i element-ui -S 2. 在main.js中写入 import ElementUI ...

  3. 【多服务场景化解决方案】智能家居(UrbanHome)

    ​ 介绍 UrbanHome是一款提供房屋维修服务的移动应用.如有维修需求,用户可通过该应用联系所在城市的管道工,电工,保洁,漆匠,木匠,修理工等,或是搜寻导航附近的维修商店. 通过构建UrbanHo ...

  4. Sentinel 源码分析- 熔断降级原理分析

    直接从Sentinel 源码demo ExceptionRatioCircuitBreakerDemo看起 直接看他的main函数 public static void main(String[] a ...

  5. 一文搞懂mysql索引底层逻辑,干货满满!

    一.什么是索引 在mysql中,索引是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录.通过索引,查询数据时不用读完记录的所有信息,而只是查询索引列即可 ...

  6. Docker 完整版教程

    Docker 安装 一.安装前必读 在安装 Docker 之前,先说一下配置,我这里是Centos7 Linux 内核:官方建议 3.10 以上,3.8以上貌似也可. 注意:本文的命令使用的是 roo ...

  7. Java 中HashMap 详解

    本篇重点: 1.HashMap的存储结构 2.HashMap的put和get操作过程 3.HashMap的扩容 4.关于transient关键字 HashMap的存储结构 1. HashMap 总体是 ...

  8. 从云AK泄露利用看企业特权管理

    从云AK泄露利用看企业特权管理 目录 - 缘起 - 当前主流AK泄露检测方式 - 防止AK滥用的关键要素? - 哪些算特权账号管理? - 如何做特权账号管理? - 特权管理与堡垒机.IAM.零信任的关 ...

  9. 第六章:Django 综合篇 - 11:分页 Paginator

    分页功能是几乎所有的网站上都需要提供的功能,当你要展示的条目比较多时,必须进行分页,不但能减小数据库读取数据压力,也有利于用户浏览. Django又很贴心的为我们提供了一个Paginator分页工具, ...

  10. 启动elasticsearch报错解决

    说不定以后会不定期更新该文档 1.提示文件描述符数量太少,修改/etc/security/limits.conf文件,添加. * soft nofile 65537 * hard nofile 655 ...