C语言学习笔记 Day10(指针--中)

Day10 内容梳理:

目录

[Chapter 7 指针](#Chapter 7 指针)

[7.4 指针 & 数组](#7.4 指针 & 数组)

(1)指针操作数组元素

(2)指针加减运算

1)加法

2)减法

(3)指针数组

[7.5 多级指针](#7.5 多级指针)


Chapter 7 指针

7.4 指针 & 数组

(1)指针操作数组元素

用指针获取数组的地址无需用符号&,因为数组本身存储的就是地址。

数组类型和指针类型相同时(比如int arr[]和int* p),arr[i] == p[i] == *(p+i)== *(arr+i)。

用指针去操作数组的话,最好还是写成数组的样式(比如写成arr[i]而不是*(arr+i)。

*(arr + i)的具体含义:地址加偏移量再取值。arr是数组首个元素的地址,i是偏移量,*( )是取值。

需要注意的是,当数组作为函数参数出现在参数列表的话,会退化为指针,丢失掉数组的精度。也就是从一串数组的数据变成了单个的指针数据,所以传入参数时最好是:函数名(int* arr, int len),而不是函数名(int arr[])。

(2)指针和运算符

指针的数据类型要和操作的数据对应上。比如int arr[ ]最好适配int* p。

1)加法

指针加法加的是数据类型的长度。指针变量+1 等同于 内存地址+sizeof(类型)。

比如int* p++是增加一个int的大小,char* p++是增加一个char的大小。

逐个测试方式1、2、3,都能得到hello world

2)减法

数组中的下标如果出现负数,可能出现越界,比如arr[-2];但指针操作中可以出现负数,比如p[-2]就是指针往前移动两位。

如下图所示,数组中的arr[-2]是越界了,所以数字报错,而p[-2]没有越界:

3)其他运算符

指针最好还是加减位移量,两个指针互相加减乘除都会报错而且没有意义,报错如下:

(3)指针数组

指针数组存的元素是一个个指针。它的定义格式和数组相似,区别只在数据类型。

用指针数组打印变量,通过 ***(地址)**就能取到该地址对应的值,如下图:

用指针数组打印二维变量数组,如下图:

数组和指针互通,所以可用指针取出多维数组的值。数组有几个维度,*符号就有多少个。以二维数组为例:

二级指针加偏移量,跳过了大小相当于一个一维数组。

比如在3×3的数组中尝试打印2,却打印出了4。

7.5 多级指针

二级指针是指向一级指针变量地址的指针。三级或更高级的指针基本用不上。

多级指针有些像寻宝,不断前往下一处线索所在的地址,直到来到最终的藏宝地,找到宝藏。对指针加*就是从上一个地点跑到下一个地点的过程,每加一个*,都离宝藏越近。

以下图为例,图中代码显示指针pp存的是指针p的地址,指针p存的是b的地址,所以有:

*pp == p == &a

**pp == *p == a

另外,可以加多个*符号。但程序不允许加多个&符号,因为容易与表示"并"的"&&"混淆。

相关推荐
超浪的晨几秒前
Java List 集合详解:从基础到实战,掌握 Java 列表操作全貌
java·开发语言·后端·学习·个人开发
我命由我123452 分钟前
嵌入式单片机开发 - HAL 库 STM32F1 外设的时钟使能(时钟使能宏、时钟禁用宏)
c语言·c++·stm32·单片机·嵌入式硬件·嵌入式·嵌入式软件
超浪的晨5 分钟前
Java Set 集合详解:从基础语法到实战应用,彻底掌握去重与唯一性集合
java·开发语言·后端·学习·个人开发
香蕉可乐荷包蛋26 分钟前
Python学习之路(十三)-常用函数的使用,及优化
开发语言·python·学习
岩中竹35 分钟前
广东省省考备考(第四十九天7.18)——判断推理:位置规律(听课后强化训练)
笔记
许白掰1 小时前
Linux入门篇学习——借助 U 盘或 TF 卡拷贝程序到开发板上
linux·学习·借助 u 盘拷贝程序到开发板上·借助 tf卡拷贝程序到开发板上
Norvyn_71 小时前
LeetCode|Day18|20. 有效的括号|Python刷题笔记
笔记·python·leetcode
Y4090012 小时前
C语言转Java语言,相同与相异之处
java·c语言·开发语言·笔记
笑衬人心。2 小时前
TCP 拥塞控制算法 —— 慢启动(Slow Start)笔记
笔记·tcp/ip·php
花海如潮淹3 小时前
前端性能追踪工具:用户体验的毫秒战争
前端·笔记·ux