2017-11-18 87 views
-1
#include<stdio.h> 

void display(int (*p)[3],int,int); 

int main() 
{ 
    int a[3][4] = {1,2,3,4, 
        5,6,7,8, 
        9,0,1,6}; 

    display(a,3,4); 
} 

void display(int (*p)[3],int r,int c) 
{ 
    int i,j,*q; 
    for(i=0;i<r;i++) 
    { 
     q=p+i; 
     for(j=0;j<c;j++) 
     printf("%d",*(q+j)); 
     printf("\n"); 
    } 
} 

这并不工作,但如果我们写 空隙DIS(INT(* P)[4],INT,INT); 它的工作原理 也就是说,如果我们有一个数组的指针数组的指针作为数组中的元素数1-d指针2-d阵列

+1

它是传统的,包括一个问题在问题职位。 –

回答

0

数组自然衰减到指向其第一个元素的指针。也就是说,a将衰减到指向a[0]的指针,即&a[0]

什么是a[0]?这是一组四个int元素。因此&a[0]是指向四个int元素或int (*)[4]的数组的指针。

0

你应该写出这样的void display(int(* p)[4],int,int)。 ,因为当你写int [3] [4] c时,看起来就像三个指向3个4个元素的数组。

1

表达式中罕有异常的数组被转换为指向其第一个元素的指针。

从C标准(6.3.2.1左值,数组和功能指示器)

3除了当它是sizeof操作或一元& 操作者的操作数,或是字面使用的字符串为了初始化一个数组,一个 表达式的类型为'''的数组被转换为 表达式,该表达式的类型''指针指向类型'',指向数组对象的初始 元素并且不是左值。如果数组对象 具有寄存器存储类,则行为未定义。

因此,如果你有一个数组声明如下

T a[N]; 

其中T是某种类型和N是一些积分表达式则阵列可以被转换为一个指针通过以下方式。

,首先让我们来重写声明如下方式

T (a[N]); 

我们得到的指针刚刚替补的声明符括号a[N]*p。例如

T (a[N]); 
T (*p) = a; 

因此,如果你有这样

T a[N1][N2]; 

一个多维数组然后指针到它的第一元件可以被定义如下方式

T (a[N1])[N2]; 
T (*p)[N2] = a; 

在一般情况下可以使用规则

T a[N1][N2]...[Nn]; 

相当于

T (a[N1])[N2]...[Nn]; 

和指针的定义如下

T (a[N1])[N2]...[Nn]; 
T (* p)[N2]...[Nn] = a; 

在你的程序中,有报关

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

可以改写成以上已经显示像

int (a[3])[4] = {1,2,3,4, 
    5,6,7,8, 
    9,0,1,6}; 

所以指针数组的第一个元件将具有int (*)[4] 因此该函数应至少声明如下

void display(int (*)[4], int, int); 

类型考虑到该函数内

void display(int (*p)[4],int r,int c) 
{ 
    int i,j,*q; 
    for(i=0;i<r;i++) 
    { 
     q=p+i; 
     for(j=0;j<c;j++) 
     printf("%d",*(q+j)); 
     printf("\n"); 
    } 
} 

有一个不兼容的类型

q=p+i; 

表达p + i的分配的类型为int (*)[4],而指针q的类型为int *

应当写入

q = *(p + i); 

在这种情况下,表达*(p + i)具有int *

此外,根据C标准不带参数的函数main被隐式转换的类型的指针类型int[4]应声明为

int main(void) 

如果使用只有指针而不是索引来访问所述阵列的元件则该函数可以看看下面的方式,因为它是在示范程序中所示

#include <stdio.h> 

#define COLS 4 

void display(int (*)[COLS], size_t); 

int main(void) 
{ 
    int a[][COLS] = 
    { 
     { 1, 2, 3, 4 }, 
     { 5, 6, 7, 8 }, 
     { 9, 0, 1, 6 } 
    }; 

    const size_t ROWS = sizeof(a)/sizeof(*a); 

    display(a, ROWS); 
} 

void display(int (*p)[COLS], size_t rows) 
{ 
    for (int (*p_row)[COLS] = p; p_row != p + rows; ++p_row) 
    { 
     for (int *p_col = *p_row; p_col != *p_row + COLS; ++p_col) 
     { 
      printf("%d ", *p_col); 
     } 

     putchar('\n'); 
    } 
} 

它的输出是

1 2 3 4 
5 6 7 8 
9 0 1 6