1. 程式人生 > >【 C 】作為函式引數的多維陣列

【 C 】作為函式引數的多維陣列

我們都知道一維陣列作為函式引數的情況,作為函式引數的一維陣列名——實際傳遞的是指向陣列第一個元素的指標。

多維陣列名作為函式引數的傳遞方式和一維陣列名相同——實際傳遞的也是指向第一個元素的指標。

但是,兩者之間不同的是,多維陣列的每個元素本身就是另外一個數組,(例如二位陣列a[m][n]的第一個元素a[0]本身就是一個包含n個元素的一維陣列),這樣的話,編譯器需要知道它的維數,以便為函式形參的下標表達式進行求值。

下面舉兩個例子,說明它們之間的區別:

1)

int vector[10];

...

func1(vector); //函式呼叫

引數vector的型別是指向整型的指標,所以func1的原型可以是下面兩種中的任何一種:

void func1( int *vec );

void func1( int vec[] );

2)

下面涉及指向陣列的指標,如果不懂指向陣列的指標可以參看我的博文:指向陣列的指標

現在我們來觀察另一個矩陣(陣列):

int  matrix[3][10];

...

func2( matrix );

這裡,引數matrix的型別是指向包含10個整型元素的陣列的指標。所以func2的原型應該是下面這個樣子的:

void func2( int (*p)[10] );

void func2( int p[][10] );

即,形參也應該是指向整型陣列的指標,也可以寫成二維陣列的形式,因為(*p)[10 ] 相當於 p[][ 10 ];

在這個函式中,mat的第一個下標根據包含10個元素的整型陣列的長度進行調整,接著第2個下標根據整型的長度進行調整,這和原先的matrix陣列一樣。

這裡的關鍵在於編譯器必須知道第2個及以後各維的長度才能對各下標進行求值,因此在原型中必須宣告這些維的長度。第1維的長度並不重要,因為在計算下標值時用不到它。

在編寫一維陣列形參的函式原型時,你既可以把它寫成陣列的形式,也可以把它寫成指標的形式。但是對於多維陣列,只有第1維可以進行如此選擇。尤其是,把func2寫成下面這樣的函式原型是不正確的:

void func2( int ** mat );

這個例子把mat宣告為一個指向整型指標的指標,和指向整型陣列的指標並不是一回事。

相關推薦

C 作為函式引數陣列

我們都知道一維陣列作為函式引數的情況,作為函式引數的一維陣列名——實際傳遞的是指向陣列第一個元素的指標。 多維陣列名作為函式引數的傳遞方式和一維陣列名相同——實際傳遞的也是指向第一個元素的指標。 但是,兩者之間不同的是,多維陣列的每個元素本身就是另外一個數組,(例如二位陣

強化C陣列作為函式引數-陣列的本質

#include <stdio.h> #include <stdlib.h> #include <string.h> //多維陣列的本質就是一個指標陣列,由於多維

pythonnumpy庫ndarray陣列的的運算:np.abs(x)、np.sqrt(x)、np.modf(x)等

numpy庫提供非常便捷的陣列運算,方便資料的處理。 1、陣列與標量之間可直接進行運算 In [45]: a Out[45]: array([[ 0, 1, 2, 3], [

C++物件函式的覆蓋、過載、

覆蓋 Coverage 在基類中定義了一個非虛擬函式,然後在派生類中又定義了一個同名同參數同返回型別的函式,既是覆蓋 在派生類物件上直接呼叫這個函式名,則只會呼叫派生類中的同名函式 #include <iostream> using namespace std;

C++inline函式 && CC++的相互呼叫

一、inline函式 (佔用太大空間) 在編譯時處理。呼叫點把程式碼直接展開 注意* 是以程式碼膨脹為代價 當函式堆疊的開銷>函式執行的開銷(建議使用inline函式) 一般寫在標頭檔案下 inline函式          

C程式設計--指標(用 “ 函式 ” 對 “ 陣列 ” 進行操作)

用指向陣列的指標做函式的引數 問題描述 有一個班,3個學生,各4門課,計算總平均分以及第n個學生的成績。 程式碼實現 #include<stdio.h> void average(float *p,int n);//

C 初識函式指標

函式指標,顧名思義,也就是指標,不過這個指標是指向函式的指標。 接下來的一個宣告更有趣,但也更容易讓人疑惑: int (*f)(); 確定括號的含義是分析這個宣告的一個重要步驟。這個宣告有兩個括號,每對的含義各不相同。第2個括號是函式呼叫操作符,第1個括號只起到聚

C++函式返回結構體的程式碼 及 字串常量傳入子函式的指標實現

說明: 1. 下面的子函式 getStu 裡,傳入了三個引數: 字串指標 char * name 整型變數 int k_year; char * k_sex; 2. 當把字串作為引數傳遞給子函式時,主程式中可以使用字串常量,但子函式的形參只能使用字元型指標 char

C#— 基礎函式、運算子和表示式

從前人(學習完這個專案的人)那裡聽說傳智播客是北京最大計算機培訓班黑馬的前身,感覺對他的興趣又深了。只要對它有了興趣自然學的就會快了。看C#視訊有一段時間了,小楊老師講課很有意思,一點也不枯燥,幽默風趣還有一點點自戀哈哈哈,好像他快禿頂了。 對於C#視訊就像是我才來提高班學

C/C++用指標實現二陣列的傳遞、使用的4種示例,及各種變形。

請看例程。 #include <stdio.h> #include <stdlib.h> /* *func1:用int a[]傳遞二維陣列 *func2:用int a[][10]傳遞二維陣列 *func3:用int *a[10]傳遞二維 *

C#建構函式疑問點總結

前言 在學習C#的過程中,建構函式中的很多知識細節我感覺還是有必要總結一下的。 問題總結 一、建構函式的作用是什麼? 建構函式的主要作用是在建立物件(宣告物件)時初始化物件,一個類被定義時至少要有一個建構函式,如果定義類時沒有宣告建構函式,則系統會提供一個預設的無參建構函式。 二、如何理

C++引用作為函式引數

一. 值傳遞1. 利用值傳遞方式,實際上是把實參的內容複製到形參中,實參和形參是存放在兩個不同的記憶體空間中。在函式體內對形參的一切修改對實參都沒有影響2. 如果形參是類的物件,利用值傳遞的話每次都要呼叫類的建構函式構造物件,效率比較低二. 指標傳遞(地址傳遞)1. 當進行指標傳遞的時候,形參是指標變數,實參

C++ format 函式詳解

Format是一個很常用,卻又似乎很煩的方法,以下是它的完整概貌,以供大家查詢之用:一、字串首先看它的宣告:function Format(const Format: string; const Args: array of const): string; overload;事實上Format方法有兩個種形式

C++成員函式過載二元和一元運算子

過載雙目運算子時,運算子函式中應該具有兩個引數,若運算子函式作為類的成員函式(當運算子過載函式作為類的成員函式時,要求運算元左邊必須是一個物件,而函式的引數可以是同類的物件也可以是普通的變數),則只需要一個引數。 雙目運算子 雙目運算子就是具

C++函式呼叫this

再一次面試中,被問到,函式呼叫時是怎麼知道物件的成員資訊的,用vs除錯了一把:#include "stdafx.h" #include <string> #include <iostr

C#Excel動態匯入張表

前言     昨天去一家公司面試,專案經理提了一個專案很緊的專案需求,Excel動態匯入多張表,同時根據給出公式做表內及表間的資料校驗,晚上回來之後一直到今天下午就一直再搗鼓著,不過遺憾的是沒能完美實現上述功能。不過卻實現了簡單實現了Excel的多表匯入。下面是我的程式碼思

C++accumulate函式的用法(STL)

在標頭檔案#include <numeric> 裡(但是我用的時候在PAT裡面不寫標頭檔案似乎也沒關係……)主要是用來累加容器裡面的值,比如int、string之類,可以少寫一個for迴圈比

C#AddHandler可重複次新增事件處理器的問題

問題:在專案中發現,可以重複多次新增同一個Handler,導致觸發時執行多次的問題。 這個現象也很好測試: 前臺準備一個Label文字 <Label x:Name="label" Content="測試重複多次AddHandler點選事件" Wi

C++關於字串引數傳遞的小技巧

在對函式進行字串傳遞操作時,一次不要傳遞太多的字串。可以先傳遞一個字串,然後在函式中將該字串複製給其他字串。 如對於下面的函式: void turn_ps(string password,str

C++模板函式及模板類

常用模板類的情況#include<iostream> using namespace std; //模板函式,一個模板引數 template<typename T> T fun1(T a,T b){ if(a>b) {