首页 > 其他分享 >c语言基础------数组指针

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

时间:2024-08-20 19:58:57浏览次数:6  
标签:10 指向 int 元素 数组 ------ 指针

在 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数组中的每个元素
}

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

在这里插入图片描述

标签:10,指向,int,元素,数组,------,指针
From: https://blog.csdn.net/yuanbenshidiaos/article/details/141366637

相关文章

  • 软考-软件设计师(信息安全习题)
       ......
  • c语言基础--------字符串指针
    在C语言中,字符串指针是一个指向字符类型的指针,通常用于指向字符串的第一个字符。字符串在C语言中通常表示为字符数组,而字符串指针则是用来存储这种字符数组首地址的变量。定义字符串指针字符串指针的定义方式如下:char*stringPtr;这里的char*表示stringPtr是......
  • 2024浙江省信息通信行业职业技能竞赛信息安全测试员竞赛CTF比赛
    浙江省信息通信行业职业技能竞赛信息安全测试员竞赛CTF比赛MISC部分Author:Ns100kUpFrom:极安云科-服务中心Data:2024/08/07Copyright:本内容版权归属极安云科,未经授权不得以任何形式复制、转载、摘编和使用。培训、环境、资料、考证公众号:Geek极安云科网络安全群:62403......
  • Postman中Body添加注释后请求报错问题解决【保姆级教程!!!】
    本文介绍关于Postman中Body添加注释后请求报错问题解决方法如:请求返回下述报错操作失败!系统异常,JsonParseException:Unexpectedcharacter(‘/’(code47)):maybea(non-standard)comment?(notrecognizedasonesinceFeature‘ALLOW_COMMENTS’notenabled......
  • 汇编世界的桥梁:链接器与加载器的奥秘
    标题:汇编世界的桥梁:链接器与加载器的奥秘在计算机程序的生命周期中,链接器(Linker)和加载器(Loader)扮演着至关重要的角色。它们是汇编语言程序从源代码到可执行程序过程中的关键环节。本文将深入探讨链接器和加载器的作用、工作原理以及它们在程序运行中的重要性。一、链接器(L......
  • 【Azure Fabric Service】Service Fabric部署失败问题 Provisioning of VM extension
    问题描述ServiceFabric部署失败,错误信息:ProvisioningofVMextensionConfigureVMhastimedout.  Extensionprovisioninghastakentoolongtocomplete.Theextensiondidnot reportamessage.Moreinformationontroubleshootingisavailableat https://aka......
  • CVE-2021-21315漏洞复现
    一、基本信息攻击机:kaliIP:192.168.100.60靶机:CentOS7IP:192.168.100.40二、攻击过程下载node.js环境wgethttps://nodejs.org/dist/v12.18.4/node-v12.18.4-linux-x64.tar.xztar-xvfnode-v12.18.4-linux-x64.tar.xzmvnode-v12.18.4-linux-x64nodejsmvnodejs......
  • Netty 异步任务模型 及 Future-Listener 机制
    https://cloud.tencent.com/developer/article/2246990一、Netty模型二、异步模型三、Future-Listener机制四、Future-Listener机制代码示例 以服务器端为例1.线程池:Netty模型核心就是两个线程池,BossGroup线程池和WorkerGroup线程池;①BossGroup......
  • Swift操作符重载:编程语言的瑞士军刀
    标题:Swift操作符重载:编程语言的瑞士军刀在Swift编程语言中,操作符重载是一种强大的特性,它允许开发者为自定义类型提供已有操作符的新实现。这不仅提升了代码的可读性,还增加了Swift语言的表达力。本文将深入探讨Swift中操作符重load的机制,并展示如何通过代码示例来实现它。......
  • 针对ShotGun的ServerRewind
    区别虽然也是HitScane,但其可以对多个角色或者多个部位造成伤害更改首先是之前在FFramePackage结构体中,需要增添一个成员变量,用来表示该结构体中的BoxCollision属于哪个敌人。而之前使用的ConfirmHit返回的校验击中头部和身体的结构体,需要为ShotGun创建类似的,其内有两个TMap类......