数组存储与指针学习笔记(三)指针与数组

本文是嵌入式C语言学习进阶系列的第三篇,主要探讨指针的本质、复杂指针声明、指针类型与运算,以及指针与数组的关系。指针用于访问动态内存,其声明和运算包括函数指针、对象指针和void指针。指针与数组在用法上有相似之处,如在函数参数中传递数组相当于传递地址。同时,文章还介绍了二级指针的应用,如修改指针变量的值、操作二维数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

嵌入式C语言学习进阶系列文章

GUN C编译器拓展语法学习笔记(一)GNU C特殊语法部分详解
GUN C编译器拓展语法学习笔记(二)属性声明
GUN C编译器拓展语法学习笔记(三)内联函数、内建函数与可变参数宏
数组存储与指针学习笔记(一)数据类型与存储、数据对齐、数据移植、typedef
数组存储与指针学习笔记(二)枚举类型、常量与变量



一、指针

1.1 指针的本质

  内存一般可分为静态内存和动态内存,一个程序被加载到内存运行时,代码段和数据段就属于静态内存,而堆栈则属于动态内存。

  • 静态内存的特点是内存中各个变量的地址在编译期间就确定了,在程序运行期间不再改变。
  • 动态内存中变量的地址在程序运行期间是不固定的,如函数的局部变量,如果这个函数多次被调用运行,那么每次运行都要在栈上随机分配一个栈帧空间;
      指针的原始初衷用途,其实就是访问一片匿名的动态内存。通过指针我们可以直接读写指定的内存。通变量一般采用直接寻址,既可当左值,又可当右值;而指针变量一般采用间接寻址。当指针变量通过间接寻址时,其又等价为一个普通变量(下面代码中的*p与a是等价的),既可当左值,又可当右值。

1.2 复杂指针声明

  声明一个指针,其实就是声明一个指针的类型。指针类型一般可以分为三大类。

  • 函数指针:void(*fp)(int,int)。
  • 对象指针:char*、int*、long*、struct xx*。
  • void指针:一般作为通用指针,作为函数的参数。
      函数指针,顾名思义,指针指向一个函数,指针变量存储的是函数的入口地址。当指针指向不同类型的数据时,我们称这种指针为对象指针。void
    指针既不属于对象指针,也不属于函数指针。

  和指针相关的运算符主要包括以下几种。

  • 指针声明:int*
  • 取址运算符:&
  • 间接访问运算符:*
  • 自增自减运算符:++、--
  • 成员选择运算符:.、->
  • 其他运算符:[]、()
      优先级按照从高到低的顺序依次为:[]、()、.、->、++、--、*、&
    在这里插入图片描述

  对于这种复杂的指针声明,我们可以借助“左右法则”来分析:首先从最里面的圆括号(未定义标识符)看起,先往右看,再往左看,每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里所有的东西,就跳出圆括号。重复这个过程,直到整个声明解析完毕。
  我们再去分析上面声明语句中的最后一个指针声明:首先从最里面的圆括号看起,f是一个指针,整个指针表达式因此也就定了性。这条语句声明的是一个指针。然后往右看,是一个参数列表,说明该指针的类型是一个函数指针。再向左看,是一个符号,说明该指针指向的函数的返回值是一个指针。此时括号里的东西解析完毕,跳出圆括号,继续重复这个过程。往右看是一个数组,再往左看是int*,与下面类似。在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值