C语言——数组指针

数组指针

数组指针是指向一个数组的指针。在C语言中,数组名在大多数情况下会退化为指向其首元素的指针,但这并不直接等同于数组指针。一个真正的数组指针是指向一个固定大小的数组类型的指针。然而,C语言标准并不直接支持指向未知大小的数组的指针(除了通过指针和长度参数手动管理,如字符串和malloc分配的内存那样)。但是,你可以通过指向具有已知大小的数组类型的指针来模拟这一行为。

数组指针的使用

假设我们有一个二维数组 int a[3][4];,我们可以这样使用数组指针:

#include <stdio.h>

int main() {
    int a[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    
    // 将数组名作为指针使用
    int (*p)[4] = a; // p 是一个指向 int[4] 的指针,指向第一行的首地址

    // 使用数组指针访问元素
    printf("%d\n", *(*(p + 1) + 2)); // 输出第二行第三列的值,即7

    // 使用数组名和下标访问元素
    printf("%d\n", a[1][2]); // 也是输出7

    return 0;
}

解释

  1. int (*p)[4] = a;: 这里 p 是一个指向整型数组(每个数组有4个元素)的指针。a 是数组名,指向数组的第一个元素(即 a[0] 的首地址)。
  2. *(*(p + 1) + 2): 这里 p + 1 移动指针到第二行的首地址(即 a[1] 的首地址)。然后 *(p + 1) 解引用指针,获取第二行的首地址。最后 + 2 进行索引操作,访问第二行第三列的元素。

数组指针的运算

  • p[n]: 访问第 n 行的首地址。
  • *(p + n): 也是访问第 n 行的首地址。
  • *(p[n] + m): 访问第 n 行第 m 列的元素。

示例:输出二维数组任意行列的数

#include<stdio.h>

void inputArr(int *pm,int *pn)
{
	printf("请输入行列值:\n");
	scanf("%d%d",pm,pn);
}

int getData(int (*p)[4],int row,int list)  //定义了一个数组指针用来接收arr
{
	int data;
	data = *(*(p+row)+list);
	return data;
}

int main()
{
	int row,list;
	int arr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
	int data;
	
	inputArr(&row,&list);  //保证调用的函数内的操作可以保留在main函数中,传递地址作为参数
	data = getData(arr,row,list);
	printf("%d行%d列的值是:%d",row,list,data);
	return 0;
}

相关推荐

  1. C语言 数组指针

    2024-07-21 20:22:04       61 阅读
  2. C语言指针数组

    2024-07-21 20:22:04       30 阅读
  3. C语言——数组指针

    2024-07-21 20:22:04       20 阅读
  4. C语言指针数组 指针的运算

    2024-07-21 20:22:04       65 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-21 20:22:04       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-21 20:22:04       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-21 20:22:04       45 阅读
  4. Python语言-面向对象

    2024-07-21 20:22:04       55 阅读

热门阅读

  1. 【Golang 面试基础题】每日 5 题(一)

    2024-07-21 20:22:04       20 阅读
  2. npm小记

    2024-07-21 20:22:04       15 阅读
  3. 【busybox记录】【shell指令】df

    2024-07-21 20:22:04       20 阅读
  4. C语言之封装,继承,多态

    2024-07-21 20:22:04       23 阅读
  5. 【广告&推荐】首选积分墙:试玩星shiwanxing.com

    2024-07-21 20:22:04       18 阅读
  6. 大模型的短期记忆和长期记忆各自的使用场景

    2024-07-21 20:22:04       20 阅读
  7. 深入探索Flutter中的状态管理:使用Provider库

    2024-07-21 20:22:04       17 阅读
  8. 认识一下哈希函数

    2024-07-21 20:22:04       18 阅读
  9. 在 CentOS-Stream-9 中使用 network 代替 NetworkManager

    2024-07-21 20:22:04       16 阅读
  10. 目标检测算法

    2024-07-21 20:22:04       20 阅读
  11. 在澳大利亚留学,论文应该怎么写?

    2024-07-21 20:22:04       19 阅读