指针的进阶【上篇】

news/2024/4/26 3:59:41/文章来源:https://blog.csdn.net/weixin_74937672/article/details/129184735

文章目录

  • 📀1.字符指针
  • 📀2.指针数组
  • 📀3.数组指针
    • 💿3.1.数组指针的定义
    • 💿3.2. &数组名VS数组名
    • 💿3.3.数组指针的使用

在这里插入图片描述

📀1.字符指针

int main()
{char ch = 'w';char* pc = &ch;// pc就是字符指针char* p = "abcdef";// 把字符串首元素地址放在p中*p = 'w';return 0;
} 

👉表达式的值是首元素的地址
👉但是这段代码运行起来会崩掉,调试看一下👇
在这里插入图片描述
👉因为这里的 “abcdef” 是常量字符串,不能被修改

int main()
{char arr[] = "abcdef";char* p = arr; // p指向的是arr数组首元素地址,arr数组是可以修改的*p = 'w';printf("%s\n", arr);// wbcdefreturn 0;
} 

在这里插入图片描述
这里就可以很好的运行,因为p指向的是arr数组首元素地址,arr数组是可以修改的

👉字符指针不仅仅可以指向字符,还可以指向字符串,但其实指向的还是字符串首字符,但是可以顺藤摸瓜找到整个字符串的字符,指向数组也是一样的

💡看一道例题👇

int main()
{char str1[] = "hello programming.";char str2[] = "hello programming.";const char* str3 = "hello programming.";const char* str4 = "hello programming.";if (str1 == str2)printf("str1 and str2 are same\n");elseprintf("str1 and str2 are not same\n");if(str3 == str4)printf("str3 and str4 are same\n");elseprintf("str3 and str4 are not same\n");return 0;
}

输出的两个结果分别是什么呢?
在这里插入图片描述

🔔这里str3和str4指向的是同一个常量字符串。C/C++会把常量字符串存储到单独的一个内存区域,当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4相同。

📀2.指针数组

👉类比一下:

字符数组 ---- 存放字符的数组
char arr1[10];
整型数组 ---- 存放整型的数组
int arr2[5];
指针数组 ---- 存放的就是指针
eg:存放字符指针的数组 ---- 字符指针数组
char* arr3[5];
eg:存放整型指针的数组 ---- 整形指针数组
int* arr4[6];

举个栗子🌰:
eg1:👇

int main()
{char* arr[] = { "abcdef","hehehe","666" };int i = 0;for (i = 0; i < 3; i++){printf("%s\n", arr[i]);}return 0;
}

在这里插入图片描述
eg2:👇
一维数组模拟一个二维数组

int main()
{int arr1[] = { 1,2,3,4,5 };int arr2[] = { 2,3,4,5,6 };int arr3[] = { 3,4,5,6,7 };//arr是一个存放整型指针的数组int* arr[] = { arr1,arr2,arr3 };int i = 0;for (i = 0; i < 3; i++) //行{int j = 0;for (j = 0; j < 5; j++) //列{printf("%d ", *(arr[i] + j));//  printf("%d ", arr[i][j]);}printf("\n");}return 0;
}

在这里插入图片描述

📀3.数组指针

💿3.1.数组指针的定义

👉类比一下:

整型指针 ---- 指向整型的指针
int a = 10;
int* p = &a;
字符指针 ---- 指向字符的指针
char ch = ’w‘;
char* pc = &ch;
数组指针 ---- 指向数组的指针 ---- 存放的是数组的地址
int arr[10];
int ( * pa)[10] = &arr; 取出的是数组的地址
char arr[10];
char ( * pc)[10] = &arr;
int* arr[5];
int * (*p)[5] = &arr;

💿3.2. &数组名VS数组名

💡数组名绝大部分情况下是数组首元素的地址
💡有两个例外:

1. sizeof (数组名)------ sizeof 内部单独放一个数组名的时候,数组名表示的是整个数组,计算得到的是数组的总大小
2. &arr ------ 这里的数组名表示整个数组,取出的是整个数组的地址,从地址值的的角度来讲,和数组首元素的地址是一样的,但是意义不一样

int main()
{int arr[10] = { 0 };printf("%p\n", sizeof(arr));printf("%p\n", arr);printf("%p\n", &arr[0]);printf("%p\n", &arr);return 0;

在这里插入图片描述
在看一下这段代码及解析👇

int main()
{int arr[10] = { 0 };//printf("%p\n", sizeof(arr));printf("%p\n", arr);//int*printf("%p\n", arr+1);//4printf("%p\n", &arr[0]);//int*printf("%p\n", &arr[0]+1);//4printf("%p\n", &arr);//int(*)[10]printf("%p\n", &arr+1);//40int(*p)[10] = &arr;//p是一个数组指针//int(*)[10]return 0;
}

在这里插入图片描述

👉根据第一段代码我们发现,其实 &arr 和 arr,虽然值是一样的,但是意义应该不一样的
👉实际上: &arr 表示的是数组的地址,而不是数组首元素的地址(细品)
👉第二段代码中 &arr 的类型是:int (*)[10],是一种数组指针类型,数组指针的地址+1,跳过整个数组大小, 所以&arr+1 相对于&arr 的差值是40

💿3.3.数组指针的使用

我们直接上代码和注释(请细品🍔)👇

int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);//使用指针来访问//int* p = arr;//for (i = 0; i < sz; i++)//{//	printf("%d ", *(p + i));//}int(*p)[10] = &arr;//p ---- &arr//*p ---- *&arr//*p ---- arrfor (i = 0; i < sz; i++){printf("%d ", *((*p) + i));}return 0;
}

在这里插入图片描述

//一维数组传参,形参是数组
void print(int arr[10], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");
}
//一维数组传参,形参是指针
void print(int *arr, int sz)
{int i = 0;for (i = 0; i < sz; i++){//printf("%d ", arr[i]);printf("%d ", *(arr+i));}printf("\n");
}
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int sz = sizeof(arr) / sizeof(arr[0]);print(arr, sz);return 0;
}

在这里插入图片描述

void print(int arr[3][5], int r, int c)
{int i = 0;for (i = 0; i < r; i++){int j = 0;for (j = 0; j < c; j++){printf("%d ",arr[i][j]);}printf("\n");}
}void print(int(*arr)[5], int r, int c)
{int i = 0;for (i = 0; i < r; i++){int j = 0;for (j = 0; j < c; j++){printf("%d ", *(*(arr + i) + j));//arr[i]}printf("\n");}
}
int main()
{int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };//二维数组的数组名,也表示首元素地址//二维数组的首元素是第一行//首元素的地址就是第一行的地址,是一个一维数组的地址print(arr, 3, 5);return 0;
}

在这里插入图片描述

🥰希望大家能够理解呀🥰

总结🥰
以上就是 指针的进阶【上篇】 内容啦🥳🥳🥳🥳
本文章所在【C语言知识篇】专栏,感兴趣的烙铁可以订阅本专栏哦🥳🥳🥳
欲知后事如何,请听下篇分解喽💕💕💕
小的会继续学习,继续努力带来更好的作品😊😊😊
创作写文不易,还多请各位大佬uu们多多支持哦🥰🥰🥰

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智慧物联网系统源码:一个用于数据的收集、处理、可视化、设备管理、设备预警、报警的平台

项目简介&#xff1a; 一个用于数据的收集、处理、可视化、设备管理、设备预警、报警的平台&#xff0c;通过平台将所有设备连接起来&#xff0c;为上层应用提供设备的管理、数据收集、远程控制等核心物联网功能。 支持支持远程对设备进行实时监控、故障排查、远程控制&#…

PPP点到点协议认证之PAP认证

PPP点到点协议认证之PAP认证 需求 如图配置接口的IP地址将R1配置为认证端&#xff0c;用户名和密码是 huawei/hcie &#xff0c;使用的认证方式是pap确保R1和R2之间可以互相ping通 拓扑图 配置思路 确保接口使用协议是PPP确保接口的IP地址配置正确在R1 的端口上&#xff0c…

Pycharm远程服务器常见问题

2023年02月23日 问题描述&#xff1a;Pycharm远程服务器跑代码时&#xff0c;不小心把Pycharm关掉了&#xff0c;但服务器代码还在运行&#xff1f; 解决办法&#xff1a;kill进程 先用watch -n 0.5 nvidia_smi查看进程&#xff0c;然后kill -9 <进程> 1、nvidia-smi…

ip公司和soc公司是什么?

IP 公司和 SoC 公司都是半导体行业的重要组成部分&#xff0c;但它们的角色和职责略有不同。IP&#xff08;Intellectual Property&#xff09;公司主要提供可重用的知识产权组件&#xff0c;也称为 IP 核或 IP 模块&#xff0c;这些组件可以在设计芯片的过程中被集成到芯片中。…

Unity 对接 ML-Agents 初探

一、ML-Agents 是什么 The Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enables games and simulations to serve as environments for training intelligent agents. We provide implementations (based on PyTorch) of state-of-the…

回归预测 | MATLAB实现BO-CNN-GRU贝叶斯优化卷积门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现BO-CNN-GRU贝叶斯优化卷积门控循环单元多输入单输出回归预测 目录回归预测 | MATLAB实现BO-CNN-GRU贝叶斯优化卷积门控循环单元多输入单输出回归预测效果一览基本介绍模型描述程序设计参考资料效果一览 基本介绍 基于贝叶斯(bayes)优化卷积神经网络-门控循…

Unity(三)--导入3d模型并实现UGUI界面上嵌入3d模型

Unity支持的常用模型格式及建模软件: 格式建模软件网格动画材质骨骼FBX3DMax,C4D,Blender,Maya等√√√√OBJ3DMax,C4D,Blender,Maya等√目录 导入模型并调整好位置创建2D场景(UGUI)使3d模型显示在图片前面方法一:使用Render Texture注意点导入模型并调整好位置 以FBX为例,…

百万数据excel导出功能如何实现?

最近我做过一个MySQL百万级别数据的excel导出功能&#xff0c;已经正常上线使用了。 这个功能挺有意思的&#xff0c;里面需要注意的细节还真不少&#xff0c;现在拿出来跟大家分享一下&#xff0c;希望对你会有所帮助。 原始需求&#xff1a;用户在UI界面上点击全部导出按钮…

如果不使用时钟同步工具,linux如何解决时钟同步问题?仅需要一行命令即可。

这是一篇日记&#xff0c;记录了上帝下凡出手&#xff0c;解救苍生与水火之中的神奇文章&#xff0c;如果你也有过类似的经历&#xff0c;留言关注&#xff0c;咱们交流一下~ 目录 背景&#xff08;如果不想知道可以跳过&#xff09; 一行神奇的命令 一段一段的研究 总结 背…

go atomic 原子操作

在 go 语言 string 类型思考 中有说到 -race 竞态检测&#xff0c;多个 goroutine 并发读写同一个变量是会触发。竞态竞争导致的问题是&#xff1a;结果不可控&#xff0c;你也无法预料最终的结果是什么。 比较棘手的竞态竞争会发生在一些切片类型上&#xff0c;在遍历读取切片…

221 最大正方形

#221 最大正方形 题目描述 在一个由 0 和 1 组成的二维矩阵内&#xff0c;找到只包含 1 的最大正方形&#xff0c;并返回其面积。 示例 1&#xff1a; 输入&#xff1a;matrix [["1","0","1","0","0"],["1",&…

【LeetCode】2357. 使数组中所有元素都等于零

2357. 使数组中所有元素都等于零 题目描述 给你一个非负整数数组 nums 。在一步操作中&#xff0c;你必须&#xff1a; 选出一个正整数 x &#xff0c;x 需要小于或等于 nums 中 最小 的 非零 元素。nums 中的每个正整数都减去 x。 返回使 nums 中所有元素都等于 0 需要的 …

经典设计模式MVC理解

MVC是模型(Model)、视图(View)、控制器(Controller)的简写&#xff0c;将业务逻辑、数据、显示分离的方法来组织代码。今天简单回顾一下。 mvc释义理解 M代表模型(Model)&#xff0c;表示业务规则封装。在MVC的三个部件中&#xff0c;模型拥有最多的处理任务。被模型返回的数据…

图表类可视化开发采坑记录之旅3

如图所示的扇形图样式改造&#xff1a; 开发框架&#xff1a; 基于vue2&#xff0c;echarts5.0.0 基于组件&#xff1a; html代码&#xff1a; <div class"showCanvas"><div id"midError"></div> </div> css代码&#xff1a; …

【华为OD机试模拟题】用 C++ 实现 - 去除多余空格(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

运动蓝牙耳机什么牌子好,运动蓝牙耳机品牌推荐

现在市面上运动耳机的品牌越来越多&#xff0c;还不知道选择哪一些运动耳机品牌&#xff0c;可以看看下面的一些耳机分享&#xff0c;运动耳机需要注意耳机的参数配置以及佩戴舒适度&#xff0c;根据自己最根本的使用需求来选择运动耳机。 1、南卡Runner Pro4骨传导蓝牙运动耳…

C/C++开发,无可避免的内存管理(篇一)-内存那些事

一、内存管理机制 任何编程语言在访问和操作内存时都会涉及大量的计算工作。但相对其他语言&#xff0c;c/c开发者必须自行采取措施确保所访问的内存是有效的&#xff0c;并且与实际物理存储相对应&#xff0c;以确保正在执行的任务不会访问不应该访问的内存位置。C/C语言及编译…

mongoDB的安装与使用

MongoDB安装MongoDB官方网站&#xff1a;https://www.mongodb.com/try/download/community-kubernetes-operator2软件安装权限不足&#xff1a;https://www.javaclub.cn/database/56541.htmlstep1:打开安装包直接点击Nextstep2&#xff1a;继续点击Nextstep3&#xff1a;点击自…

DMotion - 基于DOTS的动画框架和状态机

【博物纳新】专栏是UWA旨在为开发者推荐新颖、易用、有趣的开源项目&#xff0c;帮助大家在项目研发之余发现世界上的热门项目、前沿技术或者令人惊叹的视觉效果&#xff0c;并探索将其应用到自己项目的可行性。很多时候&#xff0c;我们并不知道自己想要什么&#xff0c;直到某…

day51【代码随想录】动态规划之回文子串、最长回文子序列

文章目录前言一、回文子串&#xff08;力扣647&#xff09;二、最长回文子序列&#xff08;力扣516&#xff09;前言 1、回文子串 2、最长回文子序列 一、回文子串&#xff08;力扣647&#xff09; 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目…