二維陣列作為形參

2021-06-16 09:21:23 字數 2382 閱讀 3428

以下是網上摘抄的一段:

首先,我引用了譚浩強先生編著的《c程式設計》上面的一節原文,它簡要介紹了如何將二維陣列作為引數傳遞,原文如下(略有改變,請原諒):

[原文開始]

可以用二維陣列名作為實參或者形參,在被呼叫函式中對形引數組定義時可以指定所有維數的大小,也可以省略第一維的大**明,如:

void func(int array[3][10]);

void func(int array[10]);

二者都是合法而且等價,但是不能把第二維或者更高維的大小省略,如下面的定義是不合法的:

void func(int array);

因為從實參傳遞來的是陣列的起始位址,在記憶體中按陣列排列規則存放(按行存放),而並不區分行和列,如果在形參中不說明列數,則系統無法決定應為多少行多少列,不能只指定一維而不指定第二維,下面寫法是錯誤的:

void func(int array[3]);實參陣列維數可以大於形引數組,例如實參陣列定義為:

void func(int array[3][10]);

而形引數組定義為:

int array[5][10];

這時形引數組只取實參陣列的一部分,其餘部分不起作用。

[原文結束]

大家可以看到,將二維陣列當作引數的時候,必須指明所有維數大小或者省略第一維的,但是不能省略第二維或者更高維的大小,這是由編譯器原理限制的。大家在學編譯原理這麼課程的時候知道編譯器是這樣處理陣列的:

對於陣列 int p[m][n];

如果要取p[i][j]的值(i>=0 && ip + i*n + j;

從以上可以看出,如果我們省略了第二維或者更高維的大小,編譯器將不知道如何正確的定址。但是我們在編寫程式的時候卻需要用到各個維數都不固定的二維陣列作為引數,這就難辦了,編譯器不能識別阿,怎麼辦呢?不要著急,編譯器雖然不能識別,但是我們完全可以不把它當作乙個二維陣列,而是把它當作乙個普通的指標,再另外加上兩個引數指明各個維數,然後我們為二維陣列手工定址,這樣就達到了將二維陣列作為函式的引數傳遞的目的,根據這個思想,我們可以把維數固定的引數變為維數隨機的引數,例如:

void func(int array[3][10]);

void func(int array[10]);

變為:void func(int **array, int rowsize, int linesize);

*((int*)array + linesize*i + j);即把二維陣列當作一維陣列來處理。

陣列作為形參的問題

1 一維陣列作為函式形參

陣列作為形參時,編譯器通常只會檢查陣列形參關聯的實參,檢查的專案包括實參是不是指標、指標型別和陣列元素的型別是否匹配,但不會檢查陣列的長度。

void print(int *a)

void print(int *a[10])

void print(int *a)

以上三個函式的宣告是等價的。

在很多情況下,將陣列形參直接定義為指標要比使用陣列語法定義方便很多。因為定義為指標後,函式可以借助於指標方便的運算元組元素。

陣列以非引用型別的傳遞時,此時陣列會自動轉換為同型別的指標,即初始化為相應型別實參的副本。

呼叫函式時,函式實際操作的是指標的副本,而不會修改實參指標的值,但是可以通過指標改變陣列元素的值。

2 多維陣列的傳遞

多維陣列的元素本身就是陣列。

和一維陣列一樣,多維陣列也是以0號元素的指標形式傳遞。在傳遞時,必須指定除了第一維以外的所有維的長度,編譯器忽略第一維的長度。

void print(int (*matrix)[10],int rowsize)

10為此二維陣列第二維的大小,rowsize是第一維的大小。

void print(int matrix[10],int rowsize)

對二維陣列的處理可以採用將二維陣列看作一維或者二維陣列來處理,下面兩個例子分別採用了這兩種方法。

例1 將二維陣列當作一維陣列來處理:

#include "stdio.h"

void print(int *p,int rowsize,int linesize)

}void main()

, , };

print( (int *)a ,3,3);

for(i=0;i<3;i++)

}例2 將二維陣列依舊當作二維陣列來處理

下面是乙個字串陣列的引數傳遞程式,實現將字串陣列中的字串按照從小到大的順序進行排序:

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

void wordsort(char p[10],int rowsize)

for(n=0;n<5;++n)

printf("%s\n",p[n]);

}void main()

二維陣列作為形參的傳遞

include include includeusing namespace std void func1 int arr 5 傳遞陣列,需生命陣列第二維的大小 int test int a 3 error cannot convert int 3 to int for argument 1 to ...

c 二維陣列作為形參傳遞引數

在寫 時,有時涉及到二維陣列的形參傳遞,這個問題很小,但是當解決不好時可能會導致程式編寫的複雜程度。因此有必要在這裡重說一下 1.c primer 中給出的方法 void func1 int iarray 10 int main 此時必須給定第二維陣列的值。2.二維陣列引用作為形參 void fun...

二維陣列做形參

來看 c primer 中給出的方法 cpp view plain copy void func1 intiarray 10 intmain 編譯通過,注意形參宣告一定要給出第二個維度的大小,要不編譯不過。cpp view plain copy void func2 int parray 10 vo...