指向数组的指针
指向数组的指针也是一个指针,和之前的指针不同的是它指向的是一个数组。这样可以像指针那样访问数组,通过指向数组的指针访问数组,在操作指针的时候和之前的指针不一样。
先看一个数组
int a[] = {1, 2, 3, 4, 5, 6};
在访问数组元素的时候,通常是通过数组变量加上元素下标来访问,如a[i], i=0,1,2,3,...,n。a表示分配给数组的一块连续内存空间的起始地址,所以也可以像指针那样访问,如*(a+i), i=0,1,2,3,...n。
int *p = a;
这里将a直接赋值给指针p,所以也可以像指针那样访问,如*(p+i), i=0,1,2,3,...n。。这和之前的没什么不一样。
int (*p)[6] = &a;
这里的p也是一个指针,这个指针和之前的指针就不一样了。
int a[][6] =
{{1, 2, 3, 4, 5, 6},
{11,12,13,14,15,16},
{21,22,23,24,25,26},
{31,32,33,34,35,36},
{41,42,43,44,45,46},
{51,52,53,54,55,56}};
int (*p)[6] = a;
int (*p)[6][6] = &a;
先看如下代码:
函数matrix_from_n原型为:
int matrix_from_n(matrix *matrix, int n, int** data);
函数matrix_from_n的第3个参数为int **类型。但在调用matrix_from_n函数的时候传的是int matrix_data[][6]。
int matrix_data[][6] = {{0, 50, 75, 80, 0, 30}, {50, 0, 35, 0, 0, 0}, {75, 35, 0, 40, 0, 90}, {80, 0, 40, 0, 45, 60}, { 0, 0, 0, 45, 0, 15}, {30, 0, 90, 60, 15, 0}}; matrix_from_n(&matrix, 6, matrix_data);
上述代码会提示一个警告:
warning: passing argument 3 of ‘matrix_from_n’ from incompatible pointer type
note: expected ‘int **’ but argument is of type ‘int (*)[6]’
也就是虽然matrix_data定义的是int matrix_data[][6]类型,但是在传递的时候其实是int (*)[6]类型,这也是一种指针类型,它是一个指向一维数组的指针类型,具体点应该是指向6个元素的一维数组的指针类型。虽然也是指针类型,但和int **也是不一样的。
将上述代码改为如下:
int matrix_data[][6] = {{0, 50, 75, 80, 0, 30}, {50, 0, 35, 0, 0, 0}, {75, 35, 0, 40, 0, 90}, {80, 0, 40, 0, 45, 60}, { 0, 0, 0, 45, 0, 15}, {30, 0, 90, 60, 15, 0}}; int (*p)[6] = matrix_data; matrix_from_n(&matrix, 6, p);
这段代码其实和上面的代码是一样的,同样会提示上面的警告:
warning: passing argument 3 of ‘matrix_from_n’ from incompatible pointer type
note: expected ‘int **’ but argument is of type ‘int (*)[6]’
继续,将上述代码改为如下:
int matrix_data[][6] = {{0, 50, 75, 80, 0, 30}, {50, 0, 35, 0, 0, 0}, {75, 35, 0, 40, 0, 90}, {80, 0, 40, 0, 45, 60}, { 0, 0, 0, 45, 0, 15}, {30, 0, 90, 60, 15, 0}}; int **p = matrix_data; matrix_from_n(&matrix, 6, p);
因为要求的是int **类型,所以这里将matrix_data赋值给int **类型的指针:int **p = matrix_data;但在这个地方也会提示警告。在int **p = matrix_data;处提示如下:
warning: initialization from incompatible pointer type
这里其实就是试图将int (*)[6]类型转换为int **类型。问题本质上和上面的一样。
所以
int matrix_data[][6]
这个数组类型定义除了按照数组的方式访问,如果按照指针的方式去访问的话,matrix_data其实是一个指向6个元素的一维数组的指针类型,其定义形式为:int (*matrix_data)[6]。
继续,将上述代码改为如下:
int matrix_data[] = { 0, 50, 75, 80, 0, 30, 50, 0, 35, 0, 0, 0, 75, 35, 0, 40, 0, 90, 80, 0, 40, 0, 45, 60, 0, 0, 0, 45, 0, 15, 30, 0, 90, 60, 15, 0}; matrix_from_n(&matrix, 6, matrix_data);
提示如下:
warning: passing argument 3 of ‘matrix_from_n’ from incompatible pointer type
note: expected ‘int **’ but argument is of type ‘int *’
也就是现在将matrix_data定义为int matrix_data[]类型,但是在传递的时候其实是int *类型,也就是matrix_data按照指针的方式访问的话其实是int *类型。
继续,将上述代码改为如下:
int matrix_data[] = { 0, 50, 75, 80, 0, 30, 50, 0, 35, 0, 0, 0, 75, 35, 0, 40, 0, 90, 80, 0, 40, 0, 45, 60, 0, 0, 0, 45, 0, 15, 30, 0, 90, 60, 15, 0}; matrix_from_n(&matrix, 6, &matrix_data);
提示如下:
warning: passing argument 3 of ‘matrix_from_n’ from incompatible pointer type
note: expected ‘int **’ but argument is of type ‘int (*)[36]’
也就是现在将matrix_data定义为int matrix_data[]类型,但是在传递的时候传的是&matrix_data,&matrix_data其实是int (*)[36]类型,其实是一个指向36个元素的一维数组的指针类型,其定义形式为:int (*matrix_data)[36]。
int (*p)[6];
这是一个指向6个元素的一维数组的指针。
例子:
int matrix_data[][6]
int (*matrix_data_p)[6] = matrix_data;
另外:
int matrix_data[] = {...}
如果按照指针的方式去访问的话,如果是直接matrix_data,其定义形式为:int *matrix_data。如果是&matrix_data,其实是一个指向一维数组的指针类型,其定义形式为:int (*matrix_data)[N], N为{...}中实际指定的元素的个数。
int matrix_data[6];
int *matrix_data_p1 = matrix_data;
int (*matrix_data_p2)[6] = &matrix_data;
相关推荐
### C程序设计课件:第五章 数组与指针 #### 5.1 数组 - **5.1.1 数组、数组元素及其存储方式** - **数组的定义**: - 数组是一种顺序容器,由单一类型元素组成的一个有序集合。 - 示例:`int fibon[10]={0,1,...
在C++编程中,数组和指针是两个非常重要的概念,尤其在第五章"数组与指针"中,我们将深入探讨这两个主题。数组是存储同类型数据的有序集合,而指针则是用来存储变量地址的数据类型,使得我们可以直接操作内存。 5.1...
当我们谈论“数组指针”时,实际上是指一个指针变量指向数组的首元素地址。这种概念在处理大型数据集或者需要高效地遍历数组时非常有用。 数组本身在内存中是连续存储的,每个元素都有自己的地址。当我们声明一个...
在C语言中,指针和数组是两种非常重要的数据结构,它们可以组合成“指针数组”或“数组指针”,这为处理复杂的数据结构提供了灵活性。本文将深入讲解这两种概念。 一、数组指针与指针数组的区别 1. 数组指针:数组...
数组名在大多数情况下可以被看作指向数组第一个元素的指针。例如,`int *p = A;`在这里,`p`指向`A`数组的第一个元素。通过指针可以遍历整个数组,例如`for (int i = 0; i ; i++) printf("%d ", p[i]);`。 数组和...
- 指针可以指向数组的任意位置,而数组名始终指向数组的第一个元素。 2. **灵活度**: - 指针提供了更大的灵活性,可以通过指针指向不同类型的数据结构。 - 数组则更加固定,一旦声明,其大小和类型就不可改变。...
在 Turbo C 中,可以定义指向一个由 n 个元素所组成的数组指针,例如 int (*p)[3];。这种数组指针不同于整型指针,进行地址加 1 运算时,地址值增加了 6(放大因子为 2x3=6)。 对于指向二维数组的指针,需要了解...
数组名实际上是一个指向数组首元素的指针,这意味着我们可以使用指针来遍历和操作数组。例如: ```c int *ptr = a; // ptr 指向 a 的第一个元素 for (int i = 0; i ; i++) { printf("%d ", ptr[i]); // 使用指针...
- 当数组作为函数参数时,会退化为指向数组首元素的指针。 3. **函数**: - 函数可以接受指针作为参数,这样可以间接操作数组或其他变量。 - 在函数内部,数组名和指针在某些情况下表现一致,但它们在内存布局和...
2. **数组指针**:也称为指针到数组,例如`int (*parr)[5]` 定义了一个指针,它指向一个包含5个整型元素的数组。这意味着`parr`是一个指针,它存储了数组的起始地址,而不是单个元素的地址。这种类型的指针通常用于...
数组和指针是C/C++编程语言中的两个核心概念,它们在程序设计中扮演着至关重要的角色。数组是一组相同类型的元素集合,而指针则是存储内存地址的变量,可以用来间接访问这些元素。理解它们之间的关系对于编写高效且...
表示将数组 a 的第 k+2 个元素的值赋给数组指针 p 所指向的元素。 指针数组是数组中的每个元素都为指针的数组。例如,unsigned char *p[3];其中,p 是一个包含 3 个指针元素的数组。每个指针元素可以指向不同的...
在第四章“数组与指针”中,我们首先了解了数组及其简单应用。数组是一种数据结构,允许程序员存储一组具有相同类型的值。在C++中,数组的定义通常包括类型、数组名和数组的大小。例如,`int a[10];`定义了一个包含...
在函数声明和定义中,数组名被视为指向数组首元素的指针。因此,形参数组和实参数组之间的结合是通过指针实现的。 9.4.2 二维数组作为函数参数 传递二维数组给函数时,数组名被视为指向第一维的指针。在函数内部,...
【C语言程序设计:第7章 数组】 数组在C语言中是基本的数据结构,它是一片连续存储单元中有序的、非空的、具有相同数据类型并由一个名字标识的数据集合。数组中的每一个成员被称为数组元素。数组分为一维数组和多维...
第7章主要讲解了数组的概念、一维数组、二维数组以及字符和字符串处理,还有高级话题如指针数组和动态数组。 7.1 数组概念: 数组是由相同类型的数据元素组成的集合,这些元素在内存中占据连续的存储空间。数组具有...
`将数组名赋值给指针,`p`现在指向数组的第一个元素。 9. **标准库中的数组工具**: C++标准库提供了一些容器,如`std::vector`,它提供了更灵活的数组功能,包括动态调整大小和迭代器。 10. **数组的应用**: ...
在C语言中,数组名本质上是一个指向数组第一个元素的指针。因此,我们可以利用指针来操作和访问二维数组。 - **行指针**:`a`本身可以被视为一个指向含有3个整型元素的数组的指针。 - 示例代码: ```c int (*p)...
此外,指针也可以用来访问数组元素,例如`a[i]`等价于`*(a + i)`,这是因为数组名在C语言中实际上是一个指向数组首元素的指针。 数组指针是一个指针变量,它指向一个一维数组的首地址。例如,如果有一个整型数组`...