【C语言】指针进阶第三站,数组指针!

点击蓝字

1b344e0652d96e67f08d237321604a28.png

关注我们

数组指针

整型指针:指向整型的指针

字符指针:指向字符的指针

数组指针:指向数组的指针

79ca408c7dbc15ec359acadf35e707fc.png

基本概念

下面哪个是数组指针呢?

指针数组和数组指针的概念很容易混淆,一定要分清楚哦!

int *p1[10];
int (*p2)[10];

p1是指针数组,每个元素的类型是int*

p2是数组指针,每个元素的类型是int(*)[10]

int (*p2)[10];
//p2先和*结合,表示p2是一个指针变量
//指向一个大小为10个整型的数组
//所以p2是数组指针
注:[ ]的优先级高于*,所以必须加上()来保证p2先和*结合

1.1、代码示例

int* parr[6];
int* (*pp)[6] = &parr;

pp是一个数组指针,类型是int*(*)[6],存放的是int*类型的数组,该数组有6个元素

feb20bb314fd93051d7eab30fd09b482.png

一般情况下,去掉变量名,剩下的即为变量类型

如:int* (*pp)[6]去掉变量名pp,变量类型为int*(*)[6]

char arr[5];
char (*pa)[5] = &arr;

pa也是一个数组指针,变量类型为char(*)[5],指向char类型的数组,该数组元素个数为5

1.2、错误示范

你肯定会有一个疑问,变量类型为int(*)[5]的数组指针,能否指向数组元素为3或者6的数组呢?

b33c1ebf2cb40c0a47add4afcb6523d7.png

程序能够正常编译,但是会报出如下警告

warning C4048: “int (*)[5]”和“int (*)[3]”数组的下标不同

在正常编写代码的时候,我们还是得保证数组指针和原数组的元素个数一致!

arr和&arr的区别

在进一步了解数组指针之前,我们需要了解arr和&arr的区别

当我们用%p打印arr和&arr时,会发现它们的结果是相同的

cbc52f4cdb8de3e7a34ca5169aa27d70.png

但这能说明arr和&arr等价了吗?

并不能!

再来看看下面这串代码

4e350e1fe08174a2451e44a4d0ff1264.png

arr+1跳过4个字节,一个元素int的大小

&arr+1跳过40个字节,整个数组的大小

其实&arr和arr虽然指向的地址值相同,但是意义不同!

&arr表示的是数组的地址,是int(*)[10]类型

arr表示数组首元素的地址,是int*类型

数组的地址+1,跳过整个数组的大小

所以&arr+1和&arr的差值为40

对应的int(*p)[5]和int* p1也有不同

p接收的是&arr,整个数组的地址

p1接收arr,数组首元素的地址

数组指针的使用

3.1打印一维数组

下面这串代码是用整型指针打印数组元素的情况

65b6fcbd20328737f8cf519ecfd1c049.png

除了整型指针外,我们可以利用数组指针打印元素

int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int (*p)[10] = &arr;
int i = 0;
for (i = 0; i < 10; i++){
printf("%d ", *((*p) + i));
//*p-->arr}
printf("\n");
return 0;
}

*p等价于arr,arr+i等价于&arr[i],对arr+i解引用就是arr[i]

feef730458ef59d14048b6ae8a6db37c.png

但是这种方式实际上是把简单问题复杂化了:我们本来就可以用int*指针来打印数组元素,为何要利用数组指针来多此一举呢?

所以在一维数组里面,我们一般不会这么写

3.2、打印二维数组

假设我现在需要一个print函数来打印二维数组

在之前,我们一般会想到用这张方式传入二维数组

void print(int a[3][5], int r, int c);

当我们想用数组指针的时候,情况就有些变化了

数组名是数组首元素的地址

二维数组的首元素是第一行

二维数组的数组名表示第一行的地址

//main函数中
print(arr,3,5);

这里prinf里面的arr就需要用数组指针来接收

该二维数组是3行5列,每一行都有5个元素,是一个int[5]的数组

对应的数组指针为int(*)[5]类型

void print(int(*p)[5], int r, int c)

这里的p指针指向的是二维数组第一行的地址

*p:对p直接解引用

相当于拿道了第一行元素的地址(把第一行看作数组,也就是数组的地址)

相当于是二维数组第一行首元素的地址

2a5ebe6eafea4e6b6e644698d289d654.png

对(p+i)解引用,就能拿到第i行第一个元素的地址

*(p+i)+j第i行第j个元素的地址

*(*(p+i)+j)第i行第j个元素

这一部分和上篇博客指针数组的内容相似

最终的函数实现如下

void print(int(*p)[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 ", *(*(p + i) + j)); }
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;
}

985acb013624ec78f0beabce3a05c08f.png

4练习:判断

这一站最重要的就是区别指针数组和数组指针

4.1 int arr[5]

int arr[5];

arr是一个整型数组,有5个元素,每个元素是int类型的

4.2 int*parr[10]

int*parr1[10];

parr1是一个数组,数组有10个int*类型的元素

所以parr1是指针数组

4.3 int (*parr2)[10]

int(*parr2)[10];

parr2和*结合,表示parr2是一个指针

去掉parr2即为它的变量类型int(*)[10]

所以parr2是一个数组指针

4.4 int(*parr3[10])[5]

int(*parr3[10])[5];

[]的优先级高于*

parr3先和[]结合,说明parr3是一个数组

该数组有10个元素,每一个元素都是一个数组指针,类型是int(*)[5]

该数组指针指向的数组有5个int类型的元素

0199ca79972ed5695ba2b645dfc8f3ec.png

结语

第三站数组指针到这里就结束啦!

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

36d68bc89059234da3623a070902c531.png

2cd3ab46928efb412897032c5d11c0a5.gif

戳“阅读原文”我们一起进步

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

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

相关文章

Python3判断是否为回文数

Python3判断是否为回文数原题 https://leetcode-cn.com/problems/palindrome-number/ 题目&#xff1a; 不允许用str的方法&#xff01; 判断一个整数是否是回文数。回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。…

lambda 序列化_如何以及为什么要序列化Lambda

lambda 序列化总览 lambda序列化在许多用例中很有用&#xff0c;例如持久配置或作为远程资源的访客模式 。 远程访客 例如&#xff0c;因此我想访问远程Map上的资源&#xff0c;可以使用get / put&#xff0c;但是说我只想从Map的值中返回一个字段&#xff0c;我可以将lambda作…

python进行数据查询_如何进行python数据库查询?(实例解析)

在这篇文章之中我们来了解一下关于python数据库的相关知识&#xff0c;有些朋友可能是刚刚接触到python这一编程语言&#xff0c;对这一方面不是特别的了解&#xff0c;在接下来这篇文章将会来带大家来了解关于python查询数据库中数据的相关知识。 数据库的查询操作 Python查询…

【C语言】指针进阶第四站:数组/指针的传参问题!

点击蓝字关注我们朋友们&#xff0c;到站啦&#xff01;指针进阶第四站&#xff1a;传参问题0.引例自定义函数里形参的类型&#xff0c;要和函数调用中传过去的实参类型相对应test函数里的是int类型&#xff0c;我们传过去的参数a也是int类型void test(int n) {} int main() {i…

python做自动化控制postman_python自动化测试入门篇-postman

接口测试基础-postman 常用的接口有两种&#xff1a;webservice接口和http api接口。 Webservice接口是走soap协议通过http传输&#xff0c;请求报文和返回报文都是xml格式。 http api接口是走http协议&#xff0c;通过路径来区分调用的方法&#xff0c;请求报文都是key-value形…

Python3实现红黑树[上篇]

Python3实现红黑树[上篇]由于时间有限&#xff0c;这次只写了红黑树添加节点&#xff0c;关于节点的删除放在下一讲 https://blog.csdn.net/qq_18138105/article/details/105324025。 关于红黑树的介绍&#xff0c;来由&#xff0c;性质和定义&#xff0c;可以看这篇文章&…

web应用程序并发测试_测试并发应用

web应用程序并发测试本文是我们名为Java Concurrency Essentials的学院课程的一部分。 在本课程中&#xff0c;您将深入探讨并发的魔力。 将向您介绍并发和并发代码的基础知识&#xff0c;并学习诸如原子性&#xff0c;同步和线程安全性的概念。 在这里查看 &#xff01; 目录…

深入理解存储器层次结构

点击蓝字关注我们1概述对于一个简单的计算机系统模型&#xff0c;我们可以将存储器系统看做是一个线性的字节数组&#xff0c;而 CPU 能够在一个常数时间内访问每个存储器的位置。实际上&#xff0c;存储器系统&#xff08;memory system&#xff09;是一个具有不同容量、成本和…

python中可选参数是什么意思_Python如何定义有可选参数的元类

问题 你想定义一个元类&#xff0c;允许类定义时提供可选参数&#xff0c;这样可以控制或配置类型的创建过程。 解决方案 在定义类的时候&#xff0c;Python允许我们使用 metaclass关键字参数来指定特定的元类。 例如使用抽象基类&#xff1a; from abc import ABCMeta, abstra…

C++的一个指针占内存几个字节?

C的一个指针占内存几个字节&#xff1f;结论&#xff1a; 取决于是64位编译模式还是32位编译模式&#xff08;注意&#xff0c;和机器位数没有直接关系&#xff09; 在64位编译模式下&#xff0c;指针的占用内存大小是8字节在32位编译模式下&#xff0c;指针占用内存大小是4字…

jmc线程转储_使线程转储智能化

jmc线程转储很久以前&#xff0c;我了解了一个称为Log MDC的东西&#xff0c;我对此非常感兴趣。 我突然意识到日志文件中发生的一切&#xff0c;并指出了特定的日志条目&#xff0c;并找到了对错&#xff0c;特别是在调试生产中的错误时。 2013年&#xff0c;我受委托从事一个…

【C语言】指针进阶第五站:函数指针!

点击蓝字关注我们函数指针函数也有自己的地址&#xff0c;函数名/&函数名 就是函数的地址1.1基本形式在 数组指针的学习中我们了解到int arr[5]; int (*pa)[5] &arr;//pa是数组指针指针变量pa的类型是int(*)[5]那么函数指针的形式是怎样的呢&#xff1f;void test(cha…

jsp 体检信息查询 绕过用户名验证_一篇彻底搞懂jsp

jsp 实栗 jsp jdbc 实现登录实现思路一个表单页&#xff0c;输入用户登录和密码&#xff0c;然后信息提交到jsp页面进行验证&#xff0c;如果可以服务器跳转到登录成功页&#xff0c;失败&#xff0c;跳转到错误页跳转的时候窗口的URL地址会发生变化代码如下编写登录代码登录&…

Python3求解找到小镇的法官问题

Python3求解找到小镇的法官问题原题 https://leetcode-cn.com/problems/find-the-town-judge/题目&#xff1a; 在一个小镇里&#xff0c;按从 1 到 N 标记了 N 个人。传言称&#xff0c;这些人中有一个是小镇上的秘密法官。 如果小镇的法官真的存在&#xff0c;那么&#xff…

couchbase_具有Rx-Java的Couchbase Java SDK

couchbase关于Couchbase Java SDK的一件整洁的事情是&#xff0c;它建立在出色的Rx-Java库的基础上&#xff0c;这为与Couchbase服务器实例进行交互提供了一种React性的方式&#xff0c;一旦掌握了它&#xff0c;它就非常直观。 考虑一个我打算存储在Couchbase中的非常简单的j…

C/C++与汇编混合编程有什么好处?

点击蓝字关注我们1 导语 当需要C/C与汇编混合编程时&#xff0c;可以有以下两种处理策略&#xff1a;若汇编代码较短&#xff0c;则可在C/C源文件中直接内嵌汇编语言实现混合编程。若汇编代码较长&#xff0c;可以单独写成汇编文件&#xff0c;最后以汇编文件的形式加入项目中&…

centos 7.6安装java_Hadoop的安装

为了方便后面使用Hadoop的shell命令&#xff0c;我先介绍Hadoop的安装。Hadoop有多种安装模式&#xff0c;这里介绍伪分布式的安装。我测试过Ubutun、Centos和WSL&#xff0c;都可以正常安装Hadoop的所有版本。所有一般不会出现版本对应的问题。Hadoop是基于Java语言进行编写的…

Python3 解题:字符串压缩

Python3 解题&#xff1a;字符串压缩原题 https://leetcode-cn.com/problems/compress-string-lcci/题目&#xff1a; 字符串压缩。利用字符重复出现的次数&#xff0c;编写一种方法&#xff0c;实现基本的字符串压缩功能。比如&#xff0c;字符串aabcccccaaa会变为a2b1c5a3。若…

C++软件分析师异常分析工作经验汇总

点击蓝字关注我们最近几年工作当中很大一部分内容是排查软件运行过程中遇到的各种异常&#xff0c;积累了一定的经验&#xff0c;在此给大家分享一下。本文将详细讲述Windows系统中软件异常的分类以及常用的排查方法&#xff0c;给大家提供一个借鉴与参考。1、软件异常的分类常…

java fix_Java中的低延迟FIX引擎

java fix总览 Chronicle FIX是我们的Low Latency FIX引擎和Java数据库。 是什么使它与众不同&#xff1f; 是为Java中的超低GC *设计的。 支持字符串和日期时间的方式可以最大程度地减少垃圾和开销。 可自定义为仅包含您期望的字段。 使用通常在二进制解析器和生成器中使用…