当前位置: 首页 > news >正文

c语言基础------数组指针

在 C 语言中,数组指针是一种特殊的指针类型,它指向一个数组。具体来说,数组指针是指向数组首元素的指针,但它与普通指针有所不同,因为它包含了数组的大小信息。
下面是关于数组指针的一些基本概念和用法:

定义数组指针

数组指针可以通过以下方式定义:

int (*arrayPtr)[10]; // arrayPtr 是一个指向含有10个整数的数组的指针

在这个定义中,arrayPtr 是一个指针,它指向一个有 10 个 int 类型的元素的数组。

初始化数组指针

你可以将数组指针初始化为数组的地址:

int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int (*arrayPtr)[10] = &arr; // 将 arrayPtr 指向数组 arr

使用数组指针

数组指针可以用来访问数组元素,以下是如何使用数组指针来访问和修改数组元素:

// 使用数组指针访问元素
int value = (*arrayPtr)[3]; // 等同于 arr[3]
// 使用指针运算来访问元素
int value2 = *(arrayPtr[0] + 3); // 等同于 arr[3]

在上面的例子中,(*arrayPtr)[3] 表示取 arrayPtr 指向的数组中的第 4 个元素(因为数组索引从 0 开始)。arrayPtr[0] 是指向数组首元素的指针,arrayPtr[0] + 3 是指向数组第 4 个元素的指针,解引用 *(arrayPtr[0] + 3) 将得到该元素的值。
在这里插入图片描述

数组指针与指针数组的区别

数组指针和指针数组是两个不同的概念:

  • 数组指针:是一个指向数组的指针。如上所述,它包含了数组的大小信息。
  • 指针数组:是一个数组,其元素都是指针。
    例如:
int *ptrArray[10]; // ptrArray 是一个包含 10 个 int* 类型指针的数组

在这里,ptrArray 是一个数组,每个元素都是一个指向 int 的指针。

数组指针的应用

数组指针常用于函数参数,特别是当你需要传递一个二维数组给函数时。由于 C 语言不支持直接传递整个二维数组,你可以通过传递一个指向其首行的数组指针来间接实现这一点。

void process2DArray(int (*array)[10], int rows) {// 处理二维数组for (int i = 0; i < rows; ++i) {for (int j = 0; j < 10; ++j) {// 使用 array[i][j] 访问元素}}
}
int main() {int matrix[5][10]; // 假设是 5 行 10 列的二维数组process2DArray(matrix, 5); // 传递二维数组的首行地址和行数return 0;
}

在这个例子中,process2DArray 函数接收一个指向含有 10 个 int 的数组的指针,这样就可以通过这个指针来处理二维数组。

指针数组是一种特殊的数组,其元素都是指针。在 C 语言中,指针数组的表示方法如下:

类型 *指针数组名[数组长度];

这里的“类型”可以是任何有效的数据类型,而“指针数组名”是数组的名称,方括号 [] 中的“数组长度”指定了数组可以存储的指针数量。
以下是一些指针数组的示例:

整型指针数组

int *intPtrArray[10]; // 一个可以存储10个int类型指针的数组

字符型指针数组(常用于字符串数组)

char *charPtrArray[5]; // 一个可以存储5个char类型指针的数组,常用于存储字符串

混合类型指针数组

void *mixedPtrArray[3]; // 一个可以存储3个void类型指针的数组,void指针可以指向任何类型

使用指针数组

指针数组的使用通常涉及以下步骤:

  1. 初始化指针数组,为每个元素分配一个指针。
  2. 使用指针访问或修改所指向的数据。
    以下是一个使用字符型指针数组(字符串数组)的例子:
#include <stdio.h>
int main() {// 初始化指针数组,存储字符串char *stringArray[3] = {"Hello", "World", "!"};// 使用指针数组for (int i = 0; i < 3; i++) {printf("%s ", stringArray[i]); // 输出字符串}return 0;
}

在上面的例子中,stringArray 是一个字符型指针数组,每个元素都指向一个字符串常量。通过遍历数组并打印每个指针所指向的字符串,可以得到输出 Hello World !
指针数组也可以用来存储指向其他类型数据的指针,如下所示:

#include <stdio.h>
int main() {int a = 10, b = 20, c = 30;// 初始化指针数组,存储整数的地址int *intPtrArray[3] = {&a, &b, &c};// 使用指针数组for (int i = 0; i < 3; i++) {printf("%d ", *intPtrArray[i]); // 输出指针所指向的整数值}return 0;
}

在这个例子中,intPtrArray 是一个整型指针数组,每个元素都指向一个 int 类型的变量。通过解引用指针来获取和打印存储在变量中的整数值。

在这里插入图片描述

指向数组的指针变量

在 C 语言中,指向数组的指针变量是指一个指针,它存储了数组的地址,通常是指向数组第一个元素的地址。下面是关于指向数组的指针变量的几个要点和示例。

定义指向数组的指针变量

指向数组的指针变量的定义方式如下:

类型 (*指针变量名)[数组的大小];

这里的 类型 是数组中元素的类型,指针变量名 是你为指针变量选择的名称,数组的大小 是数组中元素的数量。

初始化指向数组的指针变量

你可以通过以下方式初始化指向数组的指针变量:

类型 数组名[数组的大小] = {初始化值列表};
类型 (*指针变量名)[数组的大小] = &数组名;

示例

下面是一个示例,展示了如何定义和初始化一个指向数组的指针变量:

#include <stdio.h>
int main() {int arr[5] = {1, 2, 3, 4, 5}; // 定义并初始化一个整数数组int (*ptr)[5]; // 定义一个指向包含5个整数的数组的指针变量ptr = &arr; // 将 ptr 初始化为数组 arr 的地址// 使用指针变量访问数组元素for (int i = 0; i < 5; i++) {printf("%d ", (*ptr)[i]); // 输出数组元素}return 0;
}

在这个例子中,ptr 是一个指向包含 5 个整数的数组的指针变量。通过 &arr,我们得到了数组 arr 的地址,并将其赋值给 ptr。然后,我们使用 (*ptr)[i] 来访问和打印数组中的每个元素。
注意,(*ptr)[i] 是一种语法糖,它等价于 *(ptr[i])。这里,ptr[i] 是一个指向数组第 i 个元素的指针,解引用它将得到该元素的值。

使用指向数组的指针变量

指向数组的指针变量通常用于以下场景:

  • 作为函数参数,允许函数接收整个数组作为参数。
  • 在多维数组中,用于传递和操作子数组。
    下面是一个使用指向数组的指针变量作为函数参数的例子:
#include <stdio.h>
// 函数原型,接受一个指向包含5个整数的数组的指针
void printArray(int (*array)[5]);
int main() {int arr[5] = {10, 20, 30, 40, 50};printArray(&arr); // 调用函数,传递数组的地址return 0;
}
void printArray(int (*array)[5]) {for (int i = 0; i < 5; i++) {printf("%d ", (*array)[i]); // 输出数组元素}printf("\n");
}

在这个例子中,printArray 函数接受一个指向包含 5 个整数的数组的指针,然后遍历并打印数组中的每个元素。通过这种方式,我们可以避免在函数调用时复制整个数组,而是仅仅传递一个指针。

在这里插入图片描述

数组指针

在 C 语言中,数组指针是一个指向数组的指针。它是一个特殊类型的指针,其指向的是一个数组,而不是数组中的单个元素。数组指针通常用于处理二维数组或传递数组给函数。

定义数组指针

定义数组指针的语法如下:

类型 (*指针名)[数组的大小];

这里的 类型 是数组中元素的类型,指针名 是你为指针变量选择的名称,而 数组的大小 是数组中的元素数量。

示例

以下是如何定义一个指向具有 10 个整数的数组的指针:

int (*arrayPtr)[10];

在这个定义中,arrayPtr 是一个指向具有 10 个 int 类型的元素的数组的指针。

初始化数组指针

你可以将数组指针初始化为数组的地址:

int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int (*arrayPtr)[10] = &arr; // 将 arrayPtr 指向数组 arr

使用数组指针

数组指针可以用来访问数组元素。以下是如何使用数组指针来访问和修改数组元素:

// 使用数组指针访问元素
int value = (*arrayPtr)[3]; // 等同于 arr[3]
// 使用指针运算来访问元素
int value2 = *(arrayPtr[0] + 3); // 等同于 arr[3]

在上面的例子中,(*arrayPtr)[3] 表示取 arrayPtr 指向的数组中的第 4 个元素(因为数组索引从 0 开始)。arrayPtr[0] 是指向数组首元素的指针,arrayPtr[0] + 3 是指向数组第 4 个元素的指针,解引用 *(arrayPtr[0] + 3) 将得到该元素的值。

数组指针作为函数参数

数组指针常用于函数参数,特别是当你需要传递一个二维数组给函数时。由于 C 语言不支持直接传递整个二维数组,你可以通过传递一个指向其首行的数组指针来间接实现这一点。

void process2DArray(int (*array)[10], int rows) {// 处理二维数组for (int i = 0; i < rows; ++i) {for (int j = 0; j < 10; ++j) {// 使用 array[i][j] 访问元素printf("%d ", array[i][j]);}printf("\n");}
}
int main() {int matrix[5][10]; // 假设是 5 行 10 列的二维数组// 初始化 matrix...process2DArray(matrix, 5); // 传递二维数组的首行地址和行数return 0;
}

在这个例子中,process2DArray 函数接收一个指向含有 10 个 int 的数组的指针,这样就可以通过这个指针来处理二维数组。在函数内部,array 被视为一个二维数组的指针,可以通过 array[i][j] 的方式访问数组元素。

指针数组和数组指针区别

数组指针和指针数组在 C 语言中是两个不同的概念,它们的区别主要体现在以下几个方面:
在这里插入图片描述

定义和用途

  1. 数组指针
    • 定义:数组指针是一个指向数组的指针。它指向的是整个数组,而不是数组中的单个元素。
    • 用途:常用于处理多维数组,尤其是在函数参数中传递多维数组时。
      定义示例:
    int (*arrayPtr)[10]; // arrayPtr 是一个指向含有10个整数的数组的指针
    
  2. 指针数组
    • 定义:指针数组是一个数组,其元素都是指针。
    • 用途:常用于存储一系列的地址,例如,字符串数组。
      定义示例:
    int *ptrArray[10]; // ptrArray 是一个包含10个int*类型指针的数组
    

访问方式

  1. 数组指针

    • 访问方式:通过解引用数组指针,可以获取整个数组的引用,然后可以使用下标来访问数组中的元素。

    示例:

    int value = (*arrayPtr)[index]; // 访问数组中的第index+1个元素
    
  2. 指针数组

    • 访问方式:通过下标直接访问数组中的指针,然后通过解引用这些指针来访问它们所指向的数据。

    示例:

    int value = *ptrArray[index]; // 访问第index+1个指针所指向的int值
    

存储内容

  1. 数组指针
    • 存储内容:存储的是数组的地址,通常是第一个元素的地址,但它表示的是整个数组。
  2. 指针数组
    • 存储内容:存储的是一系列指针,每个指针都可以指向不同或相同类型的变量。

示例对比

假设我们有以下定义:

int arr[10];          // 一个含有10个整数的数组
int *ptrArray[10];    // 一个包含10个int*类型指针的数组
int (*arrayPtr)[10];  // 一个指向含有10个整数的数组的指针

以下是如何使用它们:

// 初始化指针数组
for (int i = 0; i < 10; i++) {ptrArray[i] = &arr[i]; // 将ptrArray的每个元素设置为arr数组中对应元素的地址
}
// 使用指针数组访问arr数组中的元素
for (int i = 0; i < 10; i++) {printf("%d ", *ptrArray[i]); // 输出arr数组中的每个元素
}
// 初始化数组指针
arrayPtr = &arr; // 将arrayPtr设置为arr数组的地址
// 使用数组指针访问arr数组中的元素
for (int i = 0; i < 10; i++) {printf("%d ", (*arrayPtr)[i]); // 输出arr数组中的每个元素
}

总结来说,数组指针是一个指向整个数组的指针,而指针数组是一个数组,其元素是指针。这两个概念虽然相似,但在使用时有着本质的区别。

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++入门:C语言到C++的过渡
  • Spring理论知识(Ⅰ)——Spring分层结构,Spring模块数据访问与继承
  • JavaScript - Api学习 Day02(事件监听、流、委托)
  • iPaaS丨API低代码平台适用的业务场景
  • 如何有效防止PCDN中的流量攻击?
  • 游戏引擎phaser.js3的使用之玩家的添加和图片的点击事件
  • vue3 组合式API
  • 【大数据】基础认知入门
  • 嵌入式开发就业方向有哪些?前景未来可期!
  • transformer-explainer
  • laravel 大数据分块导出,避免内存溢出
  • 【Python】生成二维迷宫的算法
  • C语言---栈
  • 【Unity基础】Unity中的Tag、Layer和Sorting Layer
  • 【Linux】1.Linux环境搭建
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【node学习】协程
  • ES6之路之模块详解
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Java多态
  • mysql innodb 索引使用指南
  • Vue全家桶实现一个Web App
  • web标准化(下)
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 从零搭建Koa2 Server
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 计算机在识别图像时“看到”了什么?
  • 前端设计模式
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 入手阿里云新服务器的部署NODE
  • 微信开源mars源码分析1—上层samples分析
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 一个SAP顾问在美国的这些年
  • 阿里云服务器购买完整流程
  • ​ssh免密码登录设置及问题总结
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • ​虚拟化系列介绍(十)
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #includecmath
  • (2)nginx 安装、启停
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (Git) gitignore基础使用
  • (LeetCode 49)Anagrams
  • (附源码)ssm高校实验室 毕业设计 800008
  • (实战篇)如何缓存数据
  • (四)stm32之通信协议
  • (算法)Travel Information Center
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • **python多态
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET C# 使用 iText 生成PDF
  • .NET MVC 验证码
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .net 托管代码与非托管代码