指针数组和数组指针(详细解释)

指针数组

指针数组的作用

指针数组和数组指针是C语言中常用的概念,它们分别有不同的作用和用法。

  1. 指针数组: 指针数组是一个数组,其中的每个元素都是指针类型。它可以用来存储多个指针,每个指针可以指向不同的数据类型或者相同的数据类型。指针数组的作用是方便地管理多个指针,可以通过遍历数组来访问每个指针所指向的数据。
int* ptrArray[5];  // 定义一个包含5个指针的指针数组
int a = 1, b = 2, c = 3;
ptrArray[0] = &a;  // 第一个指针指向变量a
ptrArray[1] = &b;  // 第二个指针指向变量b
ptrArray[2] = &c;  // 第三个指针指向变量c

for (int i = 0; i < 3; i++) {
    printf("%d\n", *ptrArray[i]);  // 输出每个指针所指向的值
}

—————————————————————————————————————————————————————————————————————————————————————— 

整形数组 存放整形的数组

字符数组 存放字符的数组

指针数组 存放字符的数组

指针数组是一个数组,其中的每个元素都是指针类型。简单来说,它是一个存储指针的数组。

定义一个指针数组的语法

<数据类型> *<数组名>[<数组大小>];

其中,<数据类型>表示指针所指向的数据类型,<数组名>是数组的名称,<数组大小>表示数组的大小。

指针数组可以存储多个指针,每个指针可以指向不同的内存地址。这使得指针数组非常灵活,可以用于存储不同类型的数据或者不同对象的地址。

例如,定义一个指针数组来存储整型指针:

int *ptrArray[5];

这个指针数组可以存储5个整型指针。每个元素都可以指向一个整型变量或者整型数组。

使用指针数组时,可以通过索引来访问和操作每个指针元素。例如,可以通过ptrArray来访问第一个指针元素,并通过*ptrArray来访问该指针所指向的值。

总结一下,指针数组是一个存储指针的数组,它提供了一种灵活的方式来存储和操作不同类型的指针

下面进行指针数组的举例(参考指针数组模拟二维数组)

指针篇章-(2)-(一级指针和二级指针之间的理解)-CSDN博客

 ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

数组指针 

数组指针的作用

数组指针的作用主要有以下几个方面:

  1. 遍历数组:通过数组指针,可以使用指针算术运算来遍历数组中的元素,实现对数组的遍历操作。
  2. 传递数组给函数:通过将数组指针作为参数传递给函数,可以在函数内部对数组进行操作,而无需复制整个数组。
  3. 动态分配内存:通过数组指针,可以使用动态内存分配函数(如malloc)来动态创建数组,灵活地管理内存空间。

 —————————————————————————————————————————————————————————————————————————————————————

数组指针变量是什么

数组指针是指向数组的指针变量。它可以用来表示数组的首地址,并可以通过指针的偏移来访问数组中的元素。定义数组指针的语法如下:

其中,数据类型表示数组中元素的类型,指针变量名是指针变量的名称,数组长度表示数组的长度。

根本的说

指针数组,是数组

数组指针是指针

数组指针是指向数组的指针,它可以指向数组的首地址。通过数组指针可以访问数组中的元素,可以进行指针运算来遍历数组。例如,int* ptr 表示一个指向 int 类型的数组的指针。

数组指针变量是一个变量,它存储了一个数组指针的地址。它本身并不指向数组,而是指向一个指针,这个指针指向数组的首地址。通过数组指针变量可以间接地访问数组中的元素。例如,int* arrPtr[] 表示一个数组,其中的每个元素都是 int 类型的指针。

不加上括号则p和【】是一体的 加上了 则不是一体 [ ]的优先级更高

—————————————————————————————————————————————————————————————————————————————————————  

数组指针示范1

 这里取出的是整个数组的地址 ,但是他本身代表的的是数组首元素的地址 

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() 
{
    int arr[10] = { 0 };

    int* pl = arr;
    printf("%p\n", pl);
    printf("%p\n", pl + 1);//所以+1 加上的是一个地址大小

    int(*p2)[10] = &arr;//这里取出的是整个数组的地址 ,但是他本身代表的的是数组首元素的地址 
    printf("%p\n", p2);
    printf("%p\n", p2 + 1);//所以+1 加上的是整个地址
    return 0;
}

—————————————————————————————————————————————————————————————————————————————————————  

数组指针语法格式 

数据类型 (*指针变量名)[数组长度];

这里注意要带括号 

int arr[5] = {1, 2, 3, 4, 5};
int (*ptr)[5];  // 定义一个指向整型数组的指针变量
ptr = &arr;     // 将指针指向数组的首地址

—————————————————————————————————————————————————————————————————————————————————————  

数组指针示范 2

#include <stdio.h>

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]);
    }
    return 0;
}
在main函数中,首先定义了一个长度为10的整型数组arr,
并初始化了数组的元素。然后定义了一个指向数组的指针p,
并将其指向数组arr。接下来使用一个循环遍历数组arr,
通过指针p来访问数组元素,并使用printf函数将每个元素打印出来。

—————————————————————————————————————————————————————————————————————————————————————  

二维数组传参的本质

一维数组和二维数组

指针指向第一行的五个元素的数组

一次跳过一行

j是二维数组里面的一维数组的每个元素

二维数组传参可以写成数组也可以写成指针的形式

补充

这里详细介绍二维数组和一维数组以及指针的的关系,在指针5里面会进行详细介绍

这里可以先进行学习一下 这里主要是讲解的是数组名的代表的分别是什么

sizeof和strlen的详细万字解读-CSDN博客 

——————————————————————————————————————————————————————————————————————————————————————

指针数组和数组指针二者的区别总结

  1. 数组指针(Array Pointer): 数组指针是指向数组的指针变量。它可以用来访问数组中的元素。数组指针的语法格式如下:

    数据类型 (*指针变量名)[数组长度];
    这里的数据类型表示数组中元素的类型,指针变量名是指向数组的指针变量的名称,数组长度表示数组的长度。例如,如果要定义一个指向整型数组的指针变量,可以使用以下语法:
    
    int (*ptr)[5];
    这样就定义了一个指向包含5个整型元素的数组的指针变量ptr。

  2. 指针数组(Array of Pointers): 指针数组是一个数组,其中的每个元素都是指针。它可以存储多个指针值。指针数组的语法格式如下:

    数据类型 *指针数组名[数组长度];
    这里的数据类型表示指针所指向的数据类型,指针数组名是指针数组的名称,数组长度表示数组的长度。例如,如果要定义一个包含3个整型指针的指针数组,可以使用以下语法:
    
    
    int *arr[3];
    这样就定义了一个包含3个整型指针的指针数组arr。

实例剖析 

指针篇章-(冒泡排序详解)-CSDN博客 

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

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

相关文章

Pytorch学习 day08(最大池化层、非线性激活层、正则化层、循环层、Transformer层、线性层、Dropout层)

最大池化层 最大池化&#xff0c;也叫上采样&#xff0c;是池化核在输入图像上不断移动&#xff0c;并取对应区域中的最大值&#xff0c;目的是&#xff1a;在保留输入特征的同时&#xff0c;减小输入数据量&#xff0c;加快训练。参数设置如下&#xff1a; kernel_size&#…

类与对象-对象特性

师从黑马程序员 对象的初始化和清理 构造函数和析构函数 用于完成对象的初始化和清理工作 如果我们不提供构造和析构&#xff0c;编译器会提供编译器提供的构造函数和析构函数是空实现 构造函数&#xff1a;主要用于创建对象时为对象的成员属性赋值&#xff0c;构造函数由编…

了解华为(PVID VLAN)与思科的(Native VLAN)本征VLAN的区别并学习思科网络中二层交换机的三层结构局域网VLAN配置

一、什么是二层交换机&#xff1f; 二层交换机&#xff08;Layer 2 Switch&#xff09;是一种网络设备&#xff0c;主要工作在OSI模型的数据链路层&#xff08;第二层&#xff09;&#xff0c;用于在局域网内部进行数据包的交换和转发。二层交换机通过学习MAC地址表&#xff0…

毅速3D打印随形透气钢:模具困气排气革新之选

在注塑生产过程中&#xff0c;模具内的气体若无法有效排出&#xff0c;往往会引发困气现象&#xff0c;导致产品表面出现气泡、烧焦等瑕疵。这些瑕疵不仅影响产品的美观度&#xff0c;更可能对其性能造成严重影响&#xff0c;甚至导致产品报废&#xff0c;从而增加生产成本。 传…

政安晨:【深度学习处理实践】(四)—— 实施一个温度预测示例

在开始使用像黑盒子一样的深度学习模型解决温度预测问题之前&#xff0c;我们先尝试一种基于常识的简单方法。 它可以作为一种合理性检查&#xff0c;还可以建立一个基准&#xff0c;更高级的机器学习模型需要超越这个基准才能证明其有效性。对于一个尚没有已知解决方案的新问…

Linux之生产消费者模型

(&#xff61;&#xff65;∀&#xff65;)&#xff89;&#xff9e;嗨&#xff01;你好这里是ky233的主页&#xff1a;这里是ky233的主页&#xff0c;欢迎光临~https://blog.csdn.net/ky233?typeblog 点个关注不迷路⌯▾⌯ 我们在条件满足的时候&#xff0c;唤醒指定的线程&a…

超越Chain-of-Thought LLM 推理

原文地址&#xff1a;Beyond Chain-of-Thought LLM Reasoning 2024 年 2 月 13 日 介绍 最近的一项研究解决了需要增强大型语言模型 (LLM) 的推理能力&#xff0c;超越直接推理 (Direct Reasoning&#xff0c;DR) 框架&#xff0c;例如思想链和自我一致性&#xff0c;这些框架可…

分割模型TransNetR的pytorch代码学习笔记

这个模型在U-net的基础上融合了Transformer模块和残差网络的原理。 论文地址&#xff1a;https://arxiv.org/pdf/2303.07428.pdf 具体的网络结构如下&#xff1a; 网络的原理还是比较简单的&#xff0c; 编码分支用的是预训练的resnet模块&#xff0c;解码分支则重新设计了。…

HTML入门:属性

你好&#xff0c;我是云桃桃。今天来聊一聊 HTML 属性写法和特点。 HTML 属性是用于向 HTML 标签&#xff08;也叫 HTML 元素&#xff09;提供附加信息或配置的特性。 如果说&#xff0c;把HTML 标签比作一个房子&#xff0c;HTML 标签定义了房子的结构和用途&#xff0c;比如…

基于SpringBoot的闲置房屋搜索平台设计与实现

目 录 摘 要 I Abstract II 引 言 1 1相关技术 3 1.1 jQuery技术简介 3 1.2 SpringBoot框架简介 3 1.3 Bootstrap框架简介 4 1.4 ECharts框架简介 4 1.5 百度地图API简介 4 1.6 Ajax技术简介 5 1.7 MySQL数据库简介 5 1.8本章小结 6 2系统分析 7 2.1功能需求 7 2.2非功能需求 …

微软财务GPT Excel Copilot for Finance使用攻略

功能本身不收费&#xff0c;但是这个功能需要微软的商业版office账号才能使用&#xff0c;如果你没有账号&#xff0c;可以直说。 在桌面Excel软件中登录账号后&#xff0c;点击“copilot for finance”按钮&#xff0c;如果没有出现&#xff0c;则点击“加载项”&#xff0c;…

2024 年中国高校大数据挑战赛赛题 D:行业职业技术培训能力评价完整思路以及源代码分享

中国是制造业大国&#xff0c;产业门类齐全&#xff0c;每年需要培养大量的技能娴 熟的技术工人进入工厂。某行业在全国有多所不同类型&#xff08;如国家级、 省级等&#xff09;的职业技术培训学校&#xff0c;进行 5 种技能培训。学员入校时需要 进行统一的技能考核&#xf…

简述epoll实现

所有学习笔记&#xff1a;https://github.com/Dusongg/StudyNotes 文章目录 epoll数据结构的选择&#xff1f;以tcp为例&#xff0c;网络io的可读可写如何判断&#xff1f;epoll如何做到线程安全&#xff1f;LT和ET如何实现&#xff1f;tcp状态和io的读写有哪些关系&#xff1…

文本生成视频:从 Write-a-video到 Sora

2024年2月15日&#xff0c;OpenAI 推出了其最新的文本生成视频模型——Sora。Sora 能够根据用户的指令生成一分钟长度的高质量视频内容。这一创新的发布迅速在社会各界引发了广泛关注与深入讨论。本文将围绕本实验室发表于SIGGRAPH AISA 的 Write-a-video和 Sora 展开&#xff…

CPU设计实战-协处理器访问指令的实现

目录 一 协处理器的作用与功能 1.计数寄存器和比较寄存器 2.Status寄存器 3.Cause寄存器(标号为13) 4.EPC寄存器(标号为14) 5.PRId寄存器(标号为15) 6.Config 寄存器(标号为16)-配置寄存器 二 协处理器的实现 三 协处理器访问指令说明 四 具体实现 1.译码阶段 2.执行…

git命令行提交——github

1. 克隆仓库至本地 git clone 右键paste&#xff08;github仓库地址&#xff09; cd 仓库路径&#xff08;进入到仓库内部准备提交文件等操作&#xff09; 2. 查看main分支 git branch&#xff08;列出本地仓库中的所有分支&#xff09; 3. 创建新分支&#xff08;可省…

Edu18 -- Divide by Three --- 题解

目录 Divide by Three&#xff1a; 题目大意&#xff1a; ​编辑​编辑思路解析&#xff1a; 代码实现&#xff1a; Divide by Three&#xff1a; 题目大意&#xff1a; 思路解析&#xff1a; 一个数字是3的倍数&#xff0c;那么他的数位之和也是3的倍数&#xff0c;所以我…

安信可IDE(AiThinker_IDE)编译ESP8266工程方法

0 工具准备 AiThinker_IDE.exe ESP8266工程源码 1 安信可IDE&#xff08;AiThinker_IDE&#xff09;编译ESP8266工程方法 1.1 解压ESP8266工程文件夹 我们这里使用的是NON-OS_SDK&#xff0c;将NON-OS_SDK中的1_UART文件夹解压到工作目录即可 我这里解压到了桌面&#xff0c…

WiFi模块助力少儿编程:创新学习与实践体验

随着科技的飞速发展&#xff0c;少儿编程已经成为培养孩子们创造力和问题解决能力的重要途径之一。在这个过程中&#xff0c;WiFi模块的应用为少儿编程领域注入了新的活力&#xff0c;使得学习编程不再是单一的代码教学&#xff0c;而是一个充满创新与实践的综合性体验。 物联网…

Redis作为缓存的数据一致性问题

背景 使用Reids作为缓存的原因&#xff1a; 在高并发场景下&#xff0c;传统关系型数据库的并发能力相对比较薄弱&#xff08;QPS不能太大&#xff09;&#xff1b; 使用Redis做一个缓存。让用户请求先打到Redis上而不是直接打到数据库上。 但是如果出现数据更新操作&#xff…