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

这篇具有很好参考价值的文章主要介绍了【C语言初阶】指针的运算or数组与指针的关系你了解吗?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


【C语言初阶】指针的运算or数组与指针的关系你了解吗?,《C语言初级篇》,c语言,开发语言,c++,指针,实用技巧

🎬 鸽芷咕:个人主页

 🔥 个人专栏:《快速入门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 归位到最开始的指向位置进行访问
    【C语言初阶】指针的运算or数组与指针的关系你了解吗?,《C语言初级篇》,c语言,开发语言,c++,指针,实用技巧

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

#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++ 每次向前指向下一个元素给每个元素赋值,直到把前五个都赋完!
    【C语言初阶】指针的运算or数组与指针的关系你了解吗?,《C语言初级篇》,c语言,开发语言,c++,指针,实用技巧

💭 指针-指针

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

  • 不知道大家了解个库函数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 的是就需出现访问越界的问题!
    【C语言初阶】指针的运算or数组与指针的关系你了解吗?,《C语言初级篇》,c语言,开发语言,c++,指针,实用技巧

📚 代码改进:

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;
}

📑 代码结果:
【C语言初阶】指针的运算or数组与指针的关系你了解吗?,《C语言初级篇》,c语言,开发语言,c++,指针,实用技巧

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

  • 那么这样写代码是可行的:
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;
}

📑 代码结果:
【C语言初阶】指针的运算or数组与指针的关系你了解吗?,《C语言初级篇》,c语言,开发语言,c++,指针,实用技巧

  • 既然这俩个操作符是相等的那么又能推演出:
  • *(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 里面存放的是指针变量的地址
    【C语言初阶】指针的运算or数组与指针的关系你了解吗?,《C语言初级篇》,c语言,开发语言,c++,指针,实用技巧

💬 二级指针的运算

所以我们对 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;
}

📑 代码结果:

【C语言初阶】指针的运算or数组与指针的关系你了解吗?,《C语言初级篇》,c语言,开发语言,c++,指针,实用技巧

📝全篇总结

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

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

💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
拜托拜托这个真的很重要!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。
【C语言初阶】指针的运算or数组与指针的关系你了解吗?,《C语言初级篇》,c语言,开发语言,c++,指针,实用技巧文章来源地址https://www.toymoban.com/news/detail-602312.html

到了这里,关于【C语言初阶】指针的运算or数组与指针的关系你了解吗?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言初阶】初学必看,深入了解指针的概念!看完让你不在害怕指针(图文并茂)

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,今天给大家带来的指针篇的初阶,带你先从底层一步步理解指针!    ⛳️ 指针可以说是C语言最重要的部分了!俗话说

    2024年02月16日
    浏览(40)
  • 【C语言】指针的入门篇2,深入理解指针和数组的关系

    欢迎来CILMY23的博客喔,本期系列为【C语言】指针的入门篇2,深入理解指针和数组的关系,图文讲解指针和数组关系的知识,带大家理解指针和数组的关系,以及指针+数组的用法,感谢观看,支持的可以给个赞哇。 前言 在上一篇博客中,我们了解了指针就是地址,并且把地

    2024年02月20日
    浏览(46)
  • C语言指针(适合C语言进阶者):一道题带你深入理解数组与指针的关系

    🎈个人主页:JAMES别扣了 💕在校大学生一枚。对IT有着极其浓厚的兴趣 ✨系列专栏目前为C语言初阶、后续会更新c语言的学习方法以及c题目分享. 😍希望我的文章对大家有着不一样的帮助,欢迎大家关注我,我也会回关,大家一起交流一起互动,感谢大家的多多支持哈! 🎉

    2024年04月16日
    浏览(52)
  • 前端学习C语言 - 初级指针

    本篇主要介绍: 指针和变量的关系 、指针类型、 指针的运算符 、空指针和野指针、 指针和数组 、 指针和字符串 、const 和指针、以及 gdb 调试段错误 。 指针是一种特殊的变量。存放地址的变量就是指针。 int num = 1; 会申请4个字节的内存来存放数字1,每次访问 num 就是访问

    2024年02月10日
    浏览(42)
  • C++ — 指针和数组的关系?

    在本文中,您将了解数组与指针之间的关系,并在程序中有效地使用它们。 指针是保存地址的变量。指针不仅可以存储单个变量的地址,还可以存储数组单元的地址。 看以下示例:         假设指针需要指向数组的第四个元素,即在上述情况下的第四个数组元素的保存地

    2024年02月07日
    浏览(42)
  • 【C语言初阶(八)】初阶指针详解

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C语言学习分享⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多C语言知识   🔝🔝 我们在介绍C语言时已经给大家介绍过指针的概念以及内存地址的概念了,这里我们就不再重复说明前面的内容,对指针毫无了解的

    2024年02月09日
    浏览(45)
  • LeetCode 2401.最长优雅子数组 ----双指针+位运算

    数据范围1e5 考虑nlog 或者n的解法,考虑双指针 因为这里要求的是一段连续的数组 想起我们的最长不重复连续子序列 然后结合一下位运算就好了 是一道双指针不错的题目

    2024年02月06日
    浏览(35)
  • 【C语言】初阶指针(指针及其类型以及野指针)

    简单不先于复杂,而是在复杂之后。 目录 1. 指针是什么? 2. 指针和指针类型  2.1  指针+-整数 2.2 指针的解引用  3. 野指针  3.1 野指针成因  3.2 如何规避野指针  指针理解的两个要点: 1. 指针是内存中最小单元的编号,也就是地址。 2. 平时口语中说的指针,通常指的是指

    2023年04月16日
    浏览(47)
  • 初阶C语言-指针

    🌞 . ◡̈ ᴴᴬᵛᴱ ᴬ ᴳᴼᴼᴰ ᵀᴵᴹᴱ我们终会上岸,无论去到哪里都是阳光万里,鲜花灿烂 ₍ᐢ •⌄• ᐢ₎ 今天我们一起学习一下指针的相关内容吧! 📖指针是什么呢? 1.指针是内存中的一个最小单元的编号,也就是地址。 2.平时口语中说的指针就是指针变量,是用

    2024年02月12日
    浏览(38)
  • C语言——指针详解(初阶)

    在C语言学习过程中,指针算一个难点。我总结所学的指针知识,写一篇博客,希望大家对指针的知识理解的更通透。 每个内存都有一个唯一的编号,这个编号也被称为地址,C语言创建变量。都要在内存上开辟空间。 编号= = 地址 = =指针 我们可以通过(取地址操作符)取出变

    2024年02月16日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包