C语言:数组指针

简介: 数组指针本质是一个指针,该指针存放的是数组的地址。int nums[10] = { 1,2,3,4,5,6,7,8,9,10 };int(*p)[10] = &nums;

一、数组指针本质


数组指针本质是一个指针,该指针存放的是数组的地址。


二、数组指针类型


int nums[10] = { 1,2,3,4,5,6,7,8,9,10 };

int(*p)[10] = &nums;


对于数组指针p来说,其指针类型是 int (*) [10]


char arr[5] = { 'a','b','c','d','e' };

char(*q)[5] = &arr;


对于数组指针q来说,其指针类型是 char (*) [5]


在定义数组指针时,(*变量名),因为 [ ] 的优先级比 * 高,如果不用括号,则变量名先与[ ]结合,这样就变成了一个数组,用括号则先与 * 结合,这样才是一个指针。


以 int(*p)[10] = &nums 为例,(*p)表明p是一个指针,[10]表明指针p指向一个元素个数为10的数组,int 表明该数组是int型数组。


char* arr[5];

char* (*p1)[5] = &arr;


p1是数组指针,指向一个指针数组,该数组存放的是5个char型指针


int nums[] = { 1,2,3 };

int(*p2)[3] = &nums;


p2是数组指针,指向一个int型数组,该数组存放的是3个int型数据


(注意:定义数组指针时 [常量]不可省略,即使数组没有表明元素个数,自己数也要数出来,填入常量 )


三、数组指针的用法


数组指针有什么用处?难道仅仅是存放一下数组的地址吗?

int nums[5] = { 1,2,3,4,5 };
int(*p)[5] = &nums;
for(int i = 0; i < 5; i++)
{
    printf("%d ", (*p)[i]);//(*p)相当于数组名nums,(*p)[i]相当于*(*p+i)
}

如果仅仅是这样,那不如直接用普通指针变量来接收数组的地址

int nums[5] = { 1,2,3,4,5 };
int* p = nums;
for (int i = 0; i < 5; i++)
{
  printf("%d ", p[i]);//p[i]相当于*(p+i)
}

显然数组指针的用处绝不是如此使用。


数组指针其实是在当二维数组需要传参时,用于接收二维数组的,因为数组传参时传的都是数组首元素地址,一维数组首元素地址是第一个元素的地址,而二维数组的首元素地址是一第一行的地址,第一行其实就是一个一维数组,因此可以用数组指针接收。

void Print(int(*p)[5], int r, int c)
{
  for (int i = 0; i < r; i++)
  {
  for (int j = 0; j < c; j++)
  {
    printf("%d ", p[i][j]);//p[i]相当于*(p+i),p[i][j]相当于*(*(p+i)+j)
  }
  printf("\n");
  }
}
int main()
{
  int nums[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
  Print(nums,3,5);
  return 0;
}

四、小练习:区分下列是指针还是数组


int arr1[5]    是数组,存放的是5个int型数据


int *arr2[10]    是指针数组,存放的是10个指针,每个指针指向的是int型数据


int (*arr3)[10]    是数组指针,存放的是一个数组的地址,该数组中存放的是10个int型数据


int (*arr4[10])[5]    是数组,存放的是10个数组指针,每个数组指针指向一个存放5个int型数据的数组

目录
相关文章
|
1月前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
104 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
1月前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
88 9
|
1月前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
53 7
|
1月前
|
传感器 算法 安全
【C语言】两个数组比较详解
比较两个数组在C语言中有多种实现方法,选择合适的方法取决于具体的应用场景和性能要求。从逐元素比较到使用`memcmp`函数,再到指针优化,每种方法都有其优点和适用范围。在嵌入式系统中,考虑性能和资源限制尤为重要。通过合理选择和优化,可以有效提高程序的运行效率和可靠性。
152 6
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
89 5
|
2月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
2月前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
180 3
|
2月前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
2月前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
57 1
|
2月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。