C语言指针

什么是数组指针

数组指针是指向数组的指针。它是一个指针变量,可以存储数组的地址,并可以通过指针来访问数组的元素。

在C语言中,可以使用以下方式声明和定义数组指针:

type (*ptrName)[size];

其中,type 是数组元素的类型,ptrName 是指针的名称,size 是数组的大小。

例如,以下是一个声明和定义指向整数数组的指针的例子:

int (*ptr)[5];

可以使用数组名或者取地址运算符 & 来将数组的地址赋值给数组指针。例如:

int arr[5] = {1, 2, 3, 4, 5};
int (*ptr)[5] = &arr;

要访问数组指针指向的数组元素,可以使用指针解引用运算符 * 结合索引。例如,要访问数组指针 ptr 指向的第一个元素,可以使用 (*ptr)[0]

示例代码:

int arr[5] = {1, 2, 3, 4, 5};
int (*ptr)[5] = &arr;

printf("%d\n", (*ptr)[0]);  // 输出第一个元素的值

需要注意的是,数组指针可以指向多维数组。例如,可以声明一个指向二维数组的指针:

int matrix[3][4];
int (*ptr)[4] = matrix;  // 指向二维数组的指针

数组指针在某些情况下可以用于传递多维数组的参数,以及动态分配多维数组的内存空间。它提供了一种灵活的方式来处理多维数组。

数组是数组首元素的地址,但是有两个意外

  1. 当数组名作为函数参数传递时,它会退化为指向数组首元素的指针。这意味着在函数内部,无法获取数组的长度信息。例如:

    void foo(int arr[]) {
        // 在这里,arr 是一个指向数组首元素的指针
    }
    
    int main() {
        int arr[5] = {1, 2, 3, 4, 5};
        foo(arr);  // 传递数组 arr,实际上是传递了指向 arr[0] 的指针
        return 0;
    }
    

    在函数 foo 中,参数 arr 被视为指向数组首元素的指针,而不是一个完整的数组。因此,无法通过 sizeof(arr) 来获取数组的长度。

  2. 当使用 sizeof 运算符应用于数组名时,它返回整个数组的大小,而不仅仅是指向首元素的指针的大小。例如:

    int arr[5] = {1, 2, 3, 4, 5};
    int size = sizeof(arr);  // 返回整个数组的大小,通常是元素大小乘以数组长度
    

    sizeof(arr) 返回的是整个数组的字节大小,而不仅仅是指向首元素的指针的大小。

需要注意的是,这两种情况是特殊的,仅在这些情况下数组名的行为有所不同。在大多数其他情况下,数组名确实表示数组首元素的地址。

数组指针的例子

以下是一个使用数组指针的示例:

#include <stdio.h>

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int (*ptr)[5] = &arr;  // 声明并初始化一个指向整数数组的指针

    // 使用指针访问数组元素
    for (int i = 0; i < 5; i++) {
        printf("%d ", (*ptr)[i]);  // 输出数组元素的值
    }
    printf("\n");

    return 0;
}

在这个示例中,我们声明并初始化了一个指向整数数组的指针 ptr,并将其指向数组 arr 的地址。然后,我们使用指针 ptr 访问数组元素。通过解引用指针并使用索引,我们可以访问数组的每个元素并打印出其值。

输出结果为:

1 2 3 4 5

这个示例展示了如何使用数组指针来访问数组的元素。通过使用指针,我们可以灵活地操作数组的数据。

int (*parr[10])[5];是什么?

int (*parr[10])[5]; 是一个包含 10 个指向长度为 5 的整型数组的指针的数组。

具体解析如下:

  • parr 是一个数组,包含 10 个元素。
  • 每个元素都是一个指针,指向一个长度为 5 的整型数组。
  • (*parr[10]) 中的括号是为了明确指针的优先级,表示 parr 是一个指针数组。
  • *parr[10] 表示数组元素的解引用,即指向长度为 5 的整型数组。
  • int (*parr[10])[5]; 声明了一个名为 parr 的数组,其元素为指向长度为 5 的整型数组的指针。

可以使用 parr 数组来存储指向长度为 5 的整型数组的指针,并通过索引访问和操作这些指针指向的数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值