前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【重拾C语言】七、指针(二)指针与数组(用指针标识数组、多维数组与指针、数组指针与指针数组)

【重拾C语言】七、指针(二)指针与数组(用指针标识数组、多维数组与指针、数组指针与指针数组)

作者头像
Qomolangma
发布2024-07-30 08:51:11
1150
发布2024-07-30 08:51:11
举报
文章被收录于专栏:C语言深度学习

前言

在C语言中,指针和数组之间存在着密切的关系,指针可以用来标识和操作数组元素

数组名是数组的首地址,即a[0]的地址(常量);

指针的值也是一个地址(变量

如果一个指针p指向数组a的首地址(即指向a[0]),则p与a表示的是同一个对象。

代码语言:javascript
复制
int a[10]; int *p=a; //int *p=&a[0];

七、指针

7.1~3 指针与变量、指针操作、指向指针的指针

【重拾C语言】七、指针(一)指针与变量、指针操作、指向指针的指针-CSDN博客

https://blog.csdn.net/m0_63834988/article/details/133690334?spm=1001.2014.3001.5501

7.4 指针与数组

7.4.1 用指针标识数组

可以使用指针来标识数组元素。通过将数组名转换为指针,可以通过指针来访问数组中的元素。

数组名是指针(常量),指针也是数组

代码语言:javascript
复制
int  a[5];
int  *p
p=a;     // 也可写成 p=&a[0]

访问数组a的第i个元素,如下操作等价

代码语言:javascript
复制
a[i]
*(a+i)
*(p+i) 
p[i]
7.4.2 应注意的问题

a. 数组名是指针常量

数组名实际上是指向数组首元素的指针常量,它存储了数组的起始地址。由于数组名是常量,因此不能对其进行赋值操作。

  • 指针变量可以参与运算
  • 虽然数组名也是指针,但对数组名却不能这样,因为数组名是指针常量
  • 对数组变量a的增1运算“a++”是非法的

b. 指针变量的当前值

指针变量的当前值是指针所指向的内存地址。指针变量存储了一个地址值,该地址指向内存中的某个位置。通过解引用指针,可以访问或修改指针所指向地址处存储的值。

c. 数组超界

数组超界指的是访问数组元素时超过了数组的有效索引范围。当我们访问数组时,应该确保索引值在合法范围内,即大于等于0且小于数组长度。如果超出了数组的有效索引范围,将会导致未定义的行为,可能会访问到未知的内存区域,从而引发错误或崩溃。

代码语言:javascript
复制
#include <stdio.h>

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int *ptr = arr;  // 数组名作为指针常量

    // 使用指针算术访问数组元素
    printf("数组元素:\n");
    for (int i = 0; i < 5; i++) {
        printf("arr[%d] = %d\n", i, *(ptr + i));  // 指针变量的当前值
    }

    // 超出数组界限
    printf("\n尝试访问数组边界之外的元素:\n");
    printf("arr[5] = %d\n", *(ptr + 5));  // 访问第6个元素

    return 0;
}
7.4.3 多维数组与指针

指针可以用于处理多维数组:多维数组在内存中以连续的方式存储,可以通过指针来依次访问数组中的元素。

以 int 类型二维数组为例:

代码语言:javascript
复制
int arr[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

可以使用指针来表示这个二维数组。对于二维数组,我们需要使用指向数组的指针,即指向一维数组的指针。可以定义一个指针变量,并让它指向二维数组的首地址:

代码语言:javascript
复制
int (*ptr)[4];  // 指向一维数组的指针
ptr = arr;      // 指向二维数组的首地址

使用指针来访问二维数组及其元素。通过逐层解引用指针,我们可以访问每个元素:

代码语言:javascript
复制
// 访问二维数组的元素
int element = ptr[1][2];  // 访问第2行第3列的元素,值为7

// 或者使用指针算术运算来访问元素
int element = *(*(ptr + 1) + 2);  // 与上面的访问方式等效,值为7
  • ptr[1][2]表示访问第2行第3列的元素
  • *(ptr + 1) + 2表示访问第2行第3列的元素地址
  • *(*(ptr + 1) + 2)表示访问第2行第3列的元素值
7.4.4 指针数组

a. 指针数组

指针数组是指一个数组,其中的每个元素都是指针类型。换句话说,指针数组是一个存储指针的数组。每个指针可以指向不同的对象或变量。

指针数组的声明形式为type *arrayName[size],其中type是指针指向的数据类型,arrayName是数组的名称,size是数组的大小。

代码语言:javascript
复制
int *ptrArray[5];  // 声明一个包含5个指针的指针数组

b. 数组指针

数组指针是指一个指针,它指向一个数组。换句话说,数组指针是一个指向数组的指针变量。指向的数组的元素类型是固定的。

数组指针的声明形式为type (*ptrName)[size],其中type是指针指向的数据类型,ptrName是指针变量的名称,size是数组的大小。如上述int (*ptr)[4]:

代码语言:javascript
复制
int (*ptr)[4];  // 声明一个指向包含4个int类型元素的数组的指针

c. 对比总结

  • 指针数组是一个数组,其中的每个元素都是指针类型
  • 数组指针是一个指针,它指向一个数组
  • 指针数组的元素可以指向不同类型的对象或变量,而数组指针指向的数组的元素类型是固定的。
  • 指针数组的大小是数组的大小,而数组指针指向的数组的大小是指针指向的数组的大小。
代码语言:javascript
复制
#include <stdio.h>

int main() {
    int arr[3] = {1, 2, 3};
    int* ptr_arr[3];  // 指针数组,每个元素是一个指向整数的指针
    int (*ptr)[3];    // 数组指针,指向一个包含3个整数的数组

    for (int i = 0; i < 3; i++) {
        ptr_arr[i] = &arr[i];  // 指针数组中的每个元素指向数组arr的对应元素
    }

    ptr = &arr;  // 数组指针指向数组arr的起始地址

    // 通过指针数组访问数组元素
    for (int i = 0; i < 3; i++) {
        printf("%p ", ptr_arr[i]);
        printf("%d\n", *ptr_arr[i]);
    }
    printf("\n");

    // 通过数组指针访问数组元素
    for (int i = 0; i < 3; i++) {
        printf("%p ", ptr[i]);      // 指针的地址值
        printf("%d ", (*ptr)[i]);
        printf("%p\n", &(*ptr)[i]); // 第i个元素的地址
    }
    printf("\n");

    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 七、指针
    • 7.1~3 指针与变量、指针操作、指向指针的指针
      • 7.4 指针与数组
        • 7.4.1 用指针标识数组
        • 7.4.2 应注意的问题
        • 7.4.3 多维数组与指针
        • 7.4.4 指针数组
    相关产品与服务
    对象存储
    对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档