多级指针使用方法

多级指针

前言

我们如何用一个指针对象去指向另一个指针对象的地址呢?此时,我们将引入多级指针这一概念。

如果我们要指向一个一级指针的地址,比如 int*p,此时如果要指向p的地址------&p,那么我们需要一个二级指针对象。比如:int **q=&p。这里q就是指向一级指针p的一个二级指针,其类型为int **,表示指向一个指针的指针。

我们通过代码清单观察二级指针、一级指针以及普通对象之间的关系。

c 复制代码
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>

int main() {
int32_t x=10,y=20;

int32_t *p=&x, *q=&y;
int32_t **pp=&p;

bool b = *pp == &x
printf("b = %d'n", b);

**pp = q;
printf("p == q ? %d'n", p==q);

**pp = 30;	//这一步把y的值改为30

printf("y = %d\n", y);

}

指向用户自定义类型的指针

指针除了可以指向整数,还可以定义指向枚举、结构体以及联合体类型的指针。指向枚举类型的指针与一般指向基本类型的指针差不多,只不过类型变为枚举类型。对于一个普通结构体对象要访问成员时,使用"."操作符,而当用指针访问时,必须使用"->"成员访问操作符。

下面举个例子

c 复制代码
#include <stdio.h>

int main(int argc, const char * argv[]) {
		// 枚举
		enum TRAFFIC_LIGHT{
				TRAFFIC_LIGHT_RED,
				TRAFFIC_LIGHT_YELLOW,
				TRAFFIC_LIGHT_GREEN,
		} light, *pe = &light;
		
		enum TRAFFIC_LIGHT *pe2 = pe;	
		
		*pe2 = TRAFFIC_LIGHT_YELLOW;
		
		pritnf("light=%d'n", light);
		
		struct S {
				int a;
				enum TRAFFIC_LIGHT *pe;
		} s, *p = &s;		// 直接声明一个对象s以及指向该结构体类型的指针对象p
		
		p->a = 10;
		p->f = -0.5f
		p->pe = &light;
		
		//也可以用下列方式访问成员,但注意要加上括号
		(*p).a = 10;
		}

指针与数组的关系

接下来我们介绍C语言中数组和指针的关系、本质以及指针运算规则。

  1. 数组与指针是不同类型
  • 数组属于聚合类型
  • 指针属于标量类型
    虽然不同,但数组在表达式中通常会自动退化位指针。
    例如
c 复制代码
int a[5];	//会自动转换为int *
// 即指向数组首元素a[0]的地址

但以下情况不会退化

  • sizeof(a)
  • &_Alignof
  • &a

数组名本质上常被当作首元素指针使用

c 复制代码
a[1]
// 等价于下面
*(a+1)

`` 说明:

  • 下标访问实际上是指针+偏移量
  • 再通过*解引用得到元素
  1. 指针不是普通整数加法
c 复制代码
type *p;
// 则
p+1	//	等价于地址 + sizeof(type),即跳到下一个同类型元素

int *p  
// p+1	地址实际上增加 4 字节

总结

  1. 数组和指针关系非常紧密
  2. 数组名多数情况下就是首元素地址
    3) 下标访问本质是地址偏移计算
    4)C语言底层非常接近内存模型与硬件操作
相关推荐
努力努力再努力wz12 小时前
【Redis入门系列】:Redis 内部编码机制与 String 深度解析:SDS 底层实现、三种编码与核心命令详解
c语言·开发语言·数据结构·数据库·c++·redis·缓存
zincsweet12 小时前
一文掌握 Linux 文件操作:C 语言接口 + 系统调用 + 缓冲区原理
linux·c语言
子榆.12 小时前
CANN自定义GEMM算子(Ascend C手写高性能矩阵乘法)
c语言·开发语言·矩阵
仰泳之鹅12 小时前
【C语言】动态内存管理
c语言·数据结构·算法
qq38624619613 小时前
C3 语言:C 的现代替代方案,保守改良能否战胜激进革命?
c语言·系统编程·内存安全·c3语言·现代化特性
潜创微科技21 小时前
IT6520:USB‑C 转 MIPI 芯片方案 4K@120Hz 高清显示
c语言·开发语言
hh.h.1 天前
CANN算子开发入门:从零开始写第一个Ascend C算子
c语言·开发语言·cann·c算子
AI科技星1 天前
全域数学·第三部·数术几何部·平行网格卷 完整专著目录(含拓扑发展史+学科定位·终稿)
c语言·开发语言·网络·量子计算·agi
枕星而眠1 天前
Linux 四大进程/线程同步锁详解:互斥锁、读写锁、条件变量、文件锁
linux·c语言·后端·ubuntu·学习方法