【 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> //多維陣列的本質就是一個指標陣列,由於多維
【python】numpy庫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函式 && C和C++的相互呼叫
一、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) {