大话C语言:第33篇 数组指针

数组指针是一个指针变量,其值是一个数组的首地址,即数组中第一个元素的地址。数组指针与指向单个元素的指针不同,它指向整个数组,并允许通过指针运算来访问数组中的各个元素。

数组指针的声明通常包括指针的类型和它所指向的数组的类型。数组指针的定义,语法格式:

// 指向一维数组的数组指针
数据类型 数组名[n] = {初始值};
数据类型 (*指针名)[n] = &数组名
    
// 指向二维数组的数组指针
数据类型 数组名[n][m] = {初始值};
数据类型 (*指针名)[m] = 数组名;

其中,指向一维数组的数组指针,代码示例:

// 数组指针指向一维数组的代码示例
#include <stdio.h>  
  
int main() 
{  
    // 声明一个一维数组  
    int arr[] = {1, 2, 3, 4, 5};  
      
    // 声明一个指向整数的指针(这不是数组指针,只是一个普通指针)  
    int *ptr = arr;  
      
    // 使用指针访问数组元素  
    for (int i = 0; i < 5; i++) 
    {  
        printf("%d ", ptr[i]); // 或者 (*ptr + i)  
    }  
    printf("\n");  
      
    // 现在,如果我们想要一个真正的数组指针,对于一个一维数组来说其实意义不大,  
    // 因为数组名本身就是指向数组首元素的指针。但为了演示,我们可以这样声明:  
    int (*array_ptr)[5] = &arr; // 指向一个包含5个整数的数组的指针  
      
    // 使用数组指针访问数组元素  
    for (int i = 0; i < 5; i++) 
    {  
        printf("%d ", (*array_ptr)[i]); // 解引用数组指针,然后访问元素  
    }  
    printf("\n");  
      
    return 0;  
}

其中,指向二维数组的数组指针,代码示例:

// 数组指针指向二维数组的代码示例
#include <stdio.h>  
  
int main() 
{  
    int arr[3][4] = 
    {  
        {1, 2, 3, 4},  
        {5, 6, 7, 8},  
        {9, 10, 11, 12}  
    };  
      
    // 声明一个指向包含4个整数的数组的指针  
    int (*ptr)[4] = arr;  
      
    // 使用指针访问二维数组的元素  
    printf("%d\n", (*ptr)[0]); // 输出第一行第一列的元素,即1  
    printf("%d\n", (*ptr)[1]); // 输出第一行第二列的元素,即2  
    printf("%d\n", ptr[1][0]); // 输出第二行第一列的元素,即5  
      
    // 通过指针运算访问其他行  
    ptr++; // 现在ptr指向第二行  
    printf("%d\n", (*ptr)[0]); // 输出第二行第一列的元素,即5  
    printf("%d\n", (*ptr)[1]); // 输出第二行第二列的元素,即6  
      
    return 0;  
}

数组指针常用于以下情况:

  • 处理二维数组:在C语言中,二维数组在内存中是连续存储的,行与行之间紧密排列。通过数组指针,你可以方便地访问二维数组中的元素,而不需要使用嵌套循环。

  • 动态内存分配:当你需要动态地创建一个数组时,你可以使用 malloc 或其他内存分配函数,并通过数组指针来访问和操作这个动态数组。

  • 函数参数传递:当你想将一个数组作为参数传递给一个函数时,你通常会传递一个数组指针,而不是整个数组。这样可以避免复制整个数组,提高程序的效率。

其中,数组名做函数参数,函数的形参本质上就是指针。例如:

#include <stdio.h>

// 下面3种写法完全等价
// void PrintArrary(int arr[10], int len)
// void PrintArrary(int arr[], int len)
void PrintArrary(int *arr, int len) 
{
    for (int index = 0; index < len; ++index) 
    {
        printf("%d, ", arr[index]);
    }
    
    printf("\n");
}

int main() 
{
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int len = sizeof(arr) / sizeof(int]);

    // 数组名做函数参数
    PrintArrary(arr, len);

    return 0;
}

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值