【C语言初阶】指针的运算or数组与指针的关系你了解吗?

news2024/11/24 14:26:50

在这里插入图片描述

🎬 鸽芷咕:个人主页

 🔥 个人专栏:《快速入门C语言》《C语言初阶篇》

⛺️生活的理想,就是为了理想的生活!

文章目录

  • 📋 前言
  • 💬 指针运算
    • 💭 指针+-整数
    • 💭 指针-指针
    • 💭 指针的关系运算
  • 💬 指针和数组
    • 💭 指针和数组变种推演
    • 💭 指针和数组的关系
  • 💬 二级指针
      • 💬 二级指针的运算
  • 📝全篇总结

📋 前言

   🌈hello! 各位宝子们大家好啊,前面给大大家介绍了指针的基础知识。那么这一章就来给大家介绍下一部分内容!
   ⛳️指针的运算 以及 数组与指针的关系 也是我们在指针的学习过程中非常重要的!
   📚本期文章收录在《C语言初阶篇》,大家有兴趣可以看看呐
  ⛺️ 欢迎铁汁们 ✔️ 点赞 👍 收藏 ⭐留言 📝!

🔥 注:前一章的指针讲解是《指针的概念》

💬 指针运算

💭 指针±整数

其实在上一章我们就见过指针加减整数了对于 type * p 的指针想要加 nn 是这样计算的

  • n*sizeof(type)

📚 代码演示:

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
	int* p = &arr[0];
	//不用下标访问
	int sz = sizeof(arr) /sizeof(arr[0]);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		*p = i;
		 p = p+1;
	}
	p = &arr[0];
	for (i = 0; i < sz; i++)
	{
		printf("%d\n",*(p+i));
	}
	return 0;
}

这里我们就使用指针加减整数的方式来进行访问数组进行赋值

  • 每次让指针p 向前指4个字节,然后进行赋值!
  • 之后再把指针p 归位到最开始的指向位置进行访问
    在这里插入图片描述

前面的例子懂了我们再来看这个例子大家看看!
📚 代码演示:

#define N_VALUES 5
float values[N_VALUES];
float *vp;
//指针+-整数;指针的关系运算
for (vp = &values[0]; vp < &values[N_VALUES];)
{
     *vp++ = 0;
}

这个例子其实和前面很像,数组中是从地址值向高地址使开辟的一份连续的空间!这里我们把 数组的第一个地址赋给指针 p

  • 所以指针 p 肯定没有 &values[5]的地址大!
  • p++ 每次向前指向下一个元素给每个元素赋值,直到把前五个都赋完!
    在这里插入图片描述

💭 指针-指针

指针加减整数的例子我们了解完了,下面就来了解了解指针加减指针的应用把!

  • 不知道大家了解个库函数strlen 的实现嘛/
  • 今天就用指针-指针的方法实现一下!
    🔥 注:库函数的模拟实现链接,大家感兴趣可以看看呢! 《strlen的三种实现方法》

📚 代码演示:

#include <stdio.h>
int my_strlen(char* s)
{
    char* p = s;
    while (*p != '\0')
        p++;
    return p - s;
}

int main()
{
    char arr[] = "abcdef\0";
    int len = my_strlen(arr);
    printf("%d\n", len);
	return 0;
}

⛳️ 诶这里就巧妙的应用了指针里面存放的地址来进行减法运算,用差做取值。刚好能求字符的长度的。

  • 因为一个字符也就只能只能存放一个字节
  • 而每一个字节都有地址连续的空间地址就是递增的!

💭 指针的关系运算

指针减指针的运算我们学了其实指针的运算还有一条规定:
C语言标准规定:

  • 允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。
  • 我们来看一下这段代码:

📚 代码演示:

for(vp = &values[5-1]; vp >= &values[0];vp--)
{
    *vp = 0;
}

这段代码有什么问题呢?其实这段代码是倒着往回赋值的从数组 values[4],一直向后赋值但是

  • 当最后一个元素 values[0] 赋完值的时候
  • 循环调整部分 vp-- 还会执行一次导致 vp 成为野指针
  • 所以,当我们在次想用 vp 的是就需出现访问越界的问题!
    在这里插入图片描述

📚 代码改进:

for(vp = &values[5-1]; vp > &values[0];)
{
    *--vp = 0;
}

这样当指针 vp 赋完值之后就不会再进行减减的动作了。因为根本就进不来循环里面所以想前面的错误我们就避免了。
🔥 但是:这并不符合C语言的标准,所以我们尽量不要这样写以免有些编译器跑不过去。

💬 指针和数组

📚 代码演示:

#include <stdio.h>
int main()
{
 int arr[10] = {1,2,3,4,5,6,7,8,9,0};
    printf("%p\n", arr);
    printf("%p\n", &arr[0]);
    return 0;
}

📑 代码结果:
在这里插入图片描述

  ⛳️ 诶这里就可以看到,其实数组名和数组第一个元素的地址是一样,所以可见数组名和数组首元素的地址是一样的。

  • 那么这样写代码是可行的:
int arr[10] = {1,2,3,4,5,6,7,8,9,0};
int *p = arr;//p存放的是数组首元素的地址
//等同于 *p= &arr[0];

💭 指针和数组变种推演

而指针是用来存放地址的,数组又是一块连续的空间。所以我们可以拿指针变量来接收数组首元素的地址,用来遍历数组!

  • 所以我们对指针解引用 和 数组下标是相等的。
  •     arr[ i ] == *(p+i)
  • 而    *(i+p) == arr[ i ]
  • 所以   *(i+p) == i[ arr ]
  • 而 : p == arr == &arr[ 0 ]
  • 所以   *() 操作符 等同于 [ ]

📚 代码演示:

#include <stdio.h>
int main()
{
    int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
    int* p = arr; //指针存放数组首元素的地址
    int sz = sizeof(arr) / sizeof(arr[0]);
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        arr[i] = i;
        printf("%d %d %d %d\n",arr[i],i[arr],*(p+i),p[i]);
    }
    return 0;
}

📑 代码结果:
在这里插入图片描述

  • 既然这俩个操作符是相等的那么又能推演出:
  • *(arr+i) == arr[ i ] == *(i+arr)
    🔥 注:这里就不给大家演示了,大家可以自己去试着练一下呢。

💭 指针和数组的关系

  ⛳️前面我们看到了,数组和指针的应用也给大家带来不一样的数组写法是不是很有趣!那么他们究竟有什么关系?既然指针和数组使用使用起来一样的效果那么我们可以把指针理解为数组嘛?

  • 其实我们可以这样理解
  • 指针变量就是指针变量,不是数组。指针变量的大小是4/8个字节,是用来专门存放地址的.
  • 数组就是数组,不是指针,数组是一块连续的空间。可以存放一个或,多个类型相同的数据。

🔰 那么他们的联系是什么?

  • 🌱 数组中,数组名其实是数组首元素的地址,数组名 == 地址 == 指针

  • 🌱 当我们知道数组首元素地址的时候,因为数组又是连续存放的,所以通过指针就可以来遍历访问我们的数组。

💬 二级指针

  ⛳️ 指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?答案是二级指针,存放指针变量的地址我们叫做二级指针!

📚 代码演示:

#include <stdio.h>
int main()
{
	int a = 10;
	int* p = &a;//p是一级指针变量,指针变量也是变量,
	//变量是在内存中开辟空间的,是变量就有地址
	int** pp = &p;//pp就是二级指针变量,
	//二级指针变量就是用来存放一级指针变量的地址
    return 0;
}

⛳️ 二级指针变量就是用来存放一级指针的地址,那么怎么来理解 int**

  • int** 第一个 int* 说明了 pp 是个指针变量
  • 而第二个 * 则说明了 pp 里面存放的是指针变量的地址
    在这里插入图片描述

💬 二级指针的运算

所以我们对 pp 指针解引用一次是找到一级指针的内容

  • 所以:*pp 等价于 p == &a

所以我们想用二级指针找到一级指针所指向的对象 a 就需要进行俩次解引用

📚 代码演示:

#include <stdio.h>
int main()
{
	int a = 10;
	int* p = &a;
	int** pp = &p;
	**pp = 100;
	printf("%d", a);
    return 0;
}

📑 代码结果:

在这里插入图片描述

📝全篇总结

✅ 归纳:
好了以上就是关于指针的运算 数组和指针的关系 以及 二级指针的概念我们就全讲解完毕了!
  指针的运算
  数组和指针的关系
  二级指针

☁️ 本章的内容就是这么多啦!不知道大家了解了没有呢?有不懂的可以私信评论嗷!
看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注

💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
拜托拜托这个真的很重要!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/779094.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

类和对象(中)--运算符重载

目录 1.运算符重载①运算符重载的概念②日期类和运算符重载 2.赋值运算符重载3. 流插入运算符<<重载4.Date类实现5.const成员6.取地址及const取地址操作符重载 1.运算符重载 大家有没有想过内置类型可以使用的运算符是否自定义类型的成员变量也可以使用呢&#xff1f; …

pyqt5-多行文本区QTextEdit实现鼠标滚轮调整文本大小

核心 在 PyQt5 中&#xff0c;你可以通过处理鼠标滚轮事件来设置 QTextEdit 的字体大小。具体做法是在 QTextEdit 上重新实现 wheelEvent 方法&#xff0c;并根据滚轮方向调整字体大小。 代码 import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5…

MATLAB 最小二乘法拟合直线点云 方法一 (26)

MATLAB 最小二乘法拟合直线点云 方法一 (26) 一、算法简介二、算法实现1.代码(详细注释)2.结果展示2.1 拟合效果可视化2.2 对比拟合系数与实际值一、算法简介 提供一组点云(x1 y1 )(x2 y2 )(x3 y3 )…等等多个点… 算法自动拟合直线方程 二维点云的直线方程为:y=kx+…

Mac 预览(Preview)丢失PDF标注恢复

感谢https://blog.csdn.net/yaoyao_chen/article/details/127462497的推荐&#xff01; 辛苦用预览在pdf上做的阅读标记&#xff0c;关闭后打开全丢失了&#xff0c;推荐尝试下网站导入文件进行恢复&#xff1a; 直接使用该网页应用PDF Annotation Recovery 或者访问该项目&a…

在 Windows 中通过 WSL 2 高效使用 Docker

大家好&#xff0c;我是比特桃。平时开发中&#xff0c;不免会使用一些容器来跑中间件。而开发者使用的操作系统&#xff0c;大多是Mac OS 、Windows。Docker 为了兼顾这两个平台的用户&#xff0c;推出了 Docker Desktop 应用。Docker Desktop 中的内核还是采用了 Linux 的内核…

swift简单弹幕例子,仿哔哩哔哩

先看例子 每个弹幕的速度都是不一样的&#xff0c;支持弹幕整体开始暂停。 如果弹幕实在是太多了&#xff0c;有个缓冲队列&#xff0c;不停的重试能否显示&#xff0c;保证文字都能显示全&#xff0c;并且每条都能显示。 实现是基于 CADisplayLink 实现的&#xff0c;如此来…

mac使用教程【快速从windows切换为mac,mac快捷键合集】

mac使用教程 1. 安装brew并通过brew安装git 1.1 安装brew 打开终端输入如下命令&#xff1a; % /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"选择对应的镜像进行安装 # 例如&#xff1a;输入5&#xff…

了解 3DS MAX 3D摄像机跟踪设置:第 5部分

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 创建陨石坑 步骤 1 启动 3ds Max 和 打开本教程最后一部分中保存的文件。 启动 3ds Max 步骤 2 删除所有占位符 从头开始创建陨石坑。 删除所有占位符 步骤 3 创建具有“长度”的平面 段和宽度段各…

如何创建vue2,vue3项目

前提需安装node.js和Vue CLI node.js:https://nodejs.org/zh-cn Vue CLI&#xff1a; npm install -g vue/cli 如何创建一个vue2项目 &#xff08;1&#xff09; 使用cmd终端直接创建 进入到vue项目所创建的目录里&#xff08;我是直接创建在桌面上&#xff09; 选择vue2 …

【mysql】聚簇索引和非聚簇索引(B树和B+树)

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: mysql 目录 一、索引分类 二、索引的数据结构 2.1 B树&#xff1a;改造二叉树 2.2 B树&#xff1a;改造B树 三、Mysql索引实现—InnoDB引擎 3.1 主键索引&#xff08;聚簇索引&#xff09; 3.2 …

如何利用plotly和geopandas根据美国邮政编码(Zip-Code)绘制美国地图

对于我自己来说&#xff0c;该需求源自于分析Movielens-1m数据集的用户数据&#xff1a; UserID::Gender::Age::Occupation::Zip-code 1::F::1::10::48067 2::M::56::16::70072 3::M::25::15::55117 4::M::45::7::02460 5::M::25::20::55455 6::F::50::9::55117我希望根据Zip-…

Python读写csv文件

简介 通过Python内置csv模块&#xff0c;可以读取和写入CSV&#xff08;逗号分隔值&#xff09;文件。 CSV是一种常见的文件格式&#xff0c;通常用于存储表格数据&#xff0c;每行数据由逗号分隔&#xff0c;每个字段可以用引号括起来。 测试文件内容如下 列号,年龄,姓名,性别…

香橙派Zero2安装wiringPi外设库

安装wiringOP库 直接在香橙派上下载 wiringOP 的代码 sudo apt update sudo apt install -y git git clone https://github.com/orangepi-xunlong/wiringOP 如果在香橙派上下载不下来&#xff0c;也可以在通过windows浏览器打开https://github.com/orangepi-xunlong/wiringOP …

【【高级程序设计语言C++】C++多态的概念及原理

1. 多态的概念2. 多态的定义及实现2.1. 多态的条件2.2. 虚函数2.3. 虚函数的重写2.4. 虚函数重写的两个例外2.5. C11的override和final2.6. 重载、重写、重定义的对比 3. 抽象类3.1. 概念3.2. 实现继承和接口继承的对比 4. 多态的原理4.1. 虚函数表4.2. 多态原理4.3. 动态绑定和…

(34)继电器开关

文章目录 前言 34.1 装有IOMCU的自动驾驶仪上的继电器引脚 34.2 通过任务规划器定义继电器引脚 34.3 飞行员控制继电器 34.4 任务控制继电器 34.5 任务规划器控制继电器 前言 "继电器"是自动驾驶仪上的一个数字输出引脚&#xff0c;可在 0V 和 3.3V 或 5V 之间…

商城-学习整理-基础-分布式组件(三)

目录 一、前言二、Spring Cloud&Spring Cloud Alibaba1、Spring Cloud 与Spring Cloud Alibaba简介2、为什么使用Spring Cloud Alibaba3、版本选择4、项目中的依赖 三、Spring Cloud Alibaba-Nacos作为注册中心1、Nacos1&#xff09;、下载 nacos-server2&#xff09;、启动…

【C++ 程序设计】第 1~9 章:常见知识点汇总

目录 一、C 语言简介 二、面向对象的基本概念 三、类和对象进阶 四、运算符重载 五、类的继承与派生 六、多态与虚函数 七、输入/输出流 八、文件操作 九、函数模板与类模板 一、C 语言简介 知识点名称内容C语言的发展简史★★1. C 语言是 C 语言的前身 &…

让GPT人工智能变身常用工具-上

1.密码生成器:GPT为您创建安全密码 想象GPT作为您的个人密码生成器,负责从头到尾为您创建复杂且安全的密码。您只需要告诉他您的密码需求,比如密码的长度,是否包含大写字母、小写字母、数字或特殊字符,他会立即为您生成一个复杂但经过深度设计的密码。 例子: 我希望您…

第八届中国开源年会(COSCon'23)启动!

*海报设计师&#xff1a;朱亿钦&#xff08;居居&#xff09; 一年一度的开源盛会&#xff0c;COSCon23 第八届中国开源年会&#xff0c;将于10月28~29日&#xff0c;在四川成都市高新区菁蓉汇召开&#xff01;本次大会的主题是&#xff1a;“开源&#xff1a;川流不息、山海相…

(css)滚动条样式

(css)滚动条样式 效果&#xff1a; /*滚动条整体样式*/ ::-webkit-scrollbar {width: 2px;/*高宽分别对应横竖滚动条的尺寸*/height: 10px; } ::-webkit-scrollbar-thumb {/*滚动条里面小方块*/border-radius: 10px;width: 2px;height: 60px;background: linear-gradient(0deg,…