日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言-二维数组做函数的参数

發(fā)布時間:2025/6/17 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言-二维数组做函数的参数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 1 引例
  • 2 觀點1 這種使用方法是錯誤的
  • 3 觀點2 根本不需要這么做
  • 4 二維數(shù)組做函數(shù)參數(shù)的方法
    • 4.1 方法1
    • 4.2 方法2
    • 4.3 方法3
  • 5 與Java的不同

1 引例

下面的程序很簡單,定義了一個PrintMatrix函數(shù)將一個二維數(shù)組以矩陣的形式打印出來。

#include <stdio.h> #define SIZE (4)void PrintMatrix(int **arr) {for (int i = 0; i < SIZE; i++) {for (int j = 0; j < SIZE; j++) {printf(" %d", arr[i][j]);}printf("\n");} }int main(void) {int matrix[SIZE][SIZE] = {{1, 2, 3, 4},{5, 6, 7, 8},{1, 2, 3, 4},{5, 6, 7, 8}};PrintMatrix(matrix);return 0; }

當我們編譯這個程序的時候會出現(xiàn)下面的錯誤信息:

error: cannot convert 'int (* )[4]' to 'int**'

按理來說,一維數(shù)組對應著一級指針,就像我們經(jīng)常使用的,作為函數(shù)參數(shù)的時候也不理外:

int arr[4] = {1, 2, 3, 4}; int *p = arr;

那么二維數(shù)組對應著二級指針怎么就出錯了呢?

要想解釋清楚這個問題,首先需要知道二級指針和二維數(shù)組的定義:

  • 二維數(shù)組:二維數(shù)組本質(zhì)上是以數(shù)組作為數(shù)組元素的數(shù)組,即“數(shù)組的數(shù)組”;
  • 二級指針:指向指針的指針。

下面將會從兩種觀點來分析這個問題。

2 觀點1 這種使用方法是錯誤的

舉一個簡單的例子,定義一個二維數(shù)組。

int a[2][2] = {1, 2, 3, 4};

假如用一個二級指針指向它。

int **p = a;

運行如下代碼(打印了a的值和a,a[0],a[0][0] 的地址):

printf("%#x \n", a);printf("%#x \n", &a);printf("%#x \n", &a[0]);printf("%#x \n", &a[0][0]);

運行的結(jié)果是輸出的四行結(jié)果是完全一樣的(不同計算機輸出的地址可能不同):

0x9ffe40 0x9ffe40 0x9ffe40 0x9ffe40

既然 int **p = a;,可以推出 p 保存的是 a[0][0] 的地址,那么用 * 號可以對其解引用指針而取出地址的內(nèi)容,于是測試以下代碼:

printf("%d \n", *&a[0][0]);

為 p 指針進行了一次解引用,和預期的一樣,輸出了二維數(shù)組 a 的第一個元素 1,理所當然的 p 是二級指針,那么也可以對其進行二次解引用,當我們對其進行二次解引用的時候,編譯器報錯了:

error: invalid type argument of unary '*' (have 'int')

還有一點值得注意的是,在二維數(shù)組中,a + 1,可以移動一個元素的位置(也就是移動一個一維數(shù)組的大小),而用二級指針,p + 1 永遠移動一個 sizeof(int) 的大小(本例中)。

3 觀點2 根本不需要這么做

學過 C/C++ 的朋友應該都知道,一位數(shù)組在內(nèi)存中是線性排列的,那么二維數(shù)組也不理外,它也是線性排列的。

假如只知道 arr 的地址,那么能得到 arr[1][1] 的地址嗎?
答案是可以的,因為數(shù)組在內(nèi)存中是線性排列,那么就代表著只要知道數(shù)組的起始地址,就可以通過一次取址獲得任意元素的位置,所以根本不需要二次取址。

這也就解釋了為什么聲明二維數(shù)組的時候,編譯器根本“不關(guān)心”一維的大小,以至于可以省略掉它,如:

int a[][2];

4 二維數(shù)組做函數(shù)參數(shù)的方法

4.1 方法1

void fun(int arr[2][2]);

這種方法導致只能處理2行2列的int型數(shù)組,即固定了數(shù)組大小。

4.2 方法2

void fun(int arr[][2]);

可以省略一維的大小,這種方法的限制略微寬松了一些,但是還是只能處理每行是2個整數(shù)長度的數(shù)組。

4.3 方法3

void fun(int (*arr)[2]);

這個方法需要重點討論,這里引入了一個新的概念叫做數(shù)組指針。

int (*arr)[2];

在解釋這個概念之前要比較一下數(shù)組指針和指針數(shù)組的不同,以防止混淆:

  • 指針數(shù)組(array of pointers):即用于存儲指針的數(shù)組,也就是數(shù)組元素都是指針,如 int* a[4],表示數(shù)組 a 中的元素都為 int 型指針;
  • 數(shù)組指針(a pointer to an array):即指向數(shù)組的指針,如 int (*a)[4],表示指向數(shù)組 a 的指針。

通過上述概念就知道了應該用數(shù)組指針指向一個二維數(shù)組,以下是正確的示例:

int a[2][2] = {1, 2, 3, 4}; int (*p)[2] = a;

5 與Java的不同

Java中聲明一個二維數(shù)組:

int[][] arr = new int[2][2];

不同于 C/C++ 中的:

int arr[2][2];

也不同與 C/C++ 中的:

int (*p)[2] = new int[2][2];

在 Java 中則是分配了一個包含 2 個指針的數(shù)組,指針數(shù)組的每個元素包含一個一維數(shù)組,在 C++ 中的聲明如下:

int **p = new int *[2];

總結(jié)

以上是生活随笔為你收集整理的C语言-二维数组做函数的参数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。