`
lobin
  • 浏览: 417396 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

C: 第5章 指向数组的指针

 
阅读更多

指向数组的指针

指向数组的指针也是一个指针,和之前的指针不同的是它指向的是一个数组。这样可以像指针那样访问数组,通过指向数组的指针访问数组,在操作指针的时候和之前的指针不一样。

先看一个数组

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;

0
0
分享到:
评论

相关推荐

    C 程序设计课件:第五章 数组与指针.ppt

    ### C程序设计课件:第五章 数组与指针 #### 5.1 数组 - **5.1.1 数组、数组元素及其存储方式** - **数组的定义**: - 数组是一种顺序容器,由单一类型元素组成的一个有序集合。 - 示例:`int fibon[10]={0,1,...

    C++ 程序设计课件:第五章 数组与指针.ppt

    在C++编程中,数组和指针是两个非常重要的概念,尤其在第五章"数组与指针"中,我们将深入探讨这两个主题。数组是存储同类型数据的有序集合,而指针则是用来存储变量地址的数据类型,使得我们可以直接操作内存。 5.1...

    C语言数组指针(指向数组的指针)_C语言中文网1

    当我们谈论“数组指针”时,实际上是指一个指针变量指向数组的首元素地址。这种概念在处理大型数据集或者需要高效地遍历数组时非常有用。 数组本身在内存中是连续存储的,每个元素都有自己的地址。当我们声明一个...

    c语言指针数组-·详解数组指针与指针数组

    在C语言中,指针和数组是两种非常重要的数据结构,它们可以组合成“指针数组”或“数组指针”,这为处理复杂的数据结构提供了灵活性。本文将深入讲解这两种概念。 一、数组指针与指针数组的区别 1. 数组指针:数组...

    C语言程序设计第4章数组和指针

    数组名在大多数情况下可以被看作指向数组第一个元素的指针。例如,`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 程序设计讲义:第六章 利用数组处理批量数据.ppt

    数组名实际上是一个指向数组首元素的指针,这意味着我们可以使用指针来遍历和操作数组。例如: ```c int *ptr = a; // ptr 指向 a 的第一个元素 for (int i = 0; i ; i++) { printf("%d ", ptr[i]); // 使用指针...

    全国计算机二级:C语言之指针、数组和函数.pdf

    - 当数组作为函数参数时,会退化为指向数组首元素的指针。 3. **函数**: - 函数可以接受指针作为参数,这样可以间接操作数组或其他变量。 - 在函数内部,数组名和指针在某些情况下表现一致,但它们在内存布局和...

    指针与数组.docx 指针数组:数组类型 *数组名数组长度

    2. **数组指针**:也称为指针到数组,例如`int (*parr)[5]` 定义了一个指针,它指向一个包含5个整型元素的数组。这意味着`parr`是一个指针,它存储了数组的起始地址,而不是单个元素的地址。这种类型的指针通常用于...

    数组与指针详解

    数组和指针是C/C++编程语言中的两个核心概念,它们在程序设计中扮演着至关重要的角色。数组是一组相同类型的元素集合,而指针则是存储内存地址的变量,可以用来间接访问这些元素。理解它们之间的关系对于编写高效且...

    C51单片机C语言编程数组指针和指针数组应用.doc

    表示将数组 a 的第 k+2 个元素的值赋给数组指针 p 所指向的元素。 指针数组是数组中的每个元素都为指针的数组。例如,unsigned char *p[3];其中,p 是一个包含 3 个指针元素的数组。每个指针元素可以指向不同的...

    C++第4章_数组与指针(C++课件,中南大学)

    在第四章“数组与指针”中,我们首先了解了数组及其简单应用。数组是一种数据结构,允许程序员存储一组具有相同类型的值。在C++中,数组的定义通常包括类型、数组名和数组的大小。例如,`int a[10];`定义了一个包含...

    C语言程序设计:第9章 数组.pdf

    在函数声明和定义中,数组名被视为指向数组首元素的指针。因此,形参数组和实参数组之间的结合是通过指针实现的。 9.4.2 二维数组作为函数参数 传递二维数组给函数时,数组名被视为指向第一维的指针。在函数内部,...

    C语言程序设计:第7章 数组.ppt

    【C语言程序设计:第7章 数组】 数组在C语言中是基本的数据结构,它是一片连续存储单元中有序的、非空的、具有相同数据类型并由一个名字标识的数据集合。数组中的每一个成员被称为数组元素。数组分为一维数组和多维...

    C语言程序设计:第7章 数组

    第7章主要讲解了数组的概念、一维数组、二维数组以及字符和字符串处理,还有高级话题如指针数组和动态数组。 7.1 数组概念: 数组是由相同类型的数据元素组成的集合,这些元素在内存中占据连续的存储空间。数组具有...

    C++程序设计:第七章 数组.ppt

    `将数组名赋值给指针,`p`现在指向数组的第一个元素。 9. **标准库中的数组工具**: C++标准库提供了一些容器,如`std::vector`,它提供了更灵活的数组功能,包括动态调整大小和迭代器。 10. **数组的应用**: ...

    C语言数组和指针详解

    这个代码将数组a的第0个元素的地址赋给指针p,然后将指针p指向下一个元素,并将该元素的值赋给变量b。 四、注意事项 在使用指针和数组时,需要注意以下几点: * 指针和数组名之间的区别,指针是一个变量,而数组...

    C语言PPT数组与指针

    在C语言中,数组名本质上是一个指向数组第一个元素的指针。因此,我们可以利用指针来操作和访问二维数组。 - **行指针**:`a`本身可以被视为一个指向含有3个整型元素的数组的指针。 - 示例代码: ```c int (*p)...

    指针数组与数组指针与二级指针

    此外,指针也可以用来访问数组元素,例如`a[i]`等价于`*(a + i)`,这是因为数组名在C语言中实际上是一个指向数组首元素的指针。 数组指针是一个指针变量,它指向一个一维数组的首地址。例如,如果有一个整型数组`...

Global site tag (gtag.js) - Google Analytics