1. 程式人生 > >二維陣列和二級指標的傳遞問題

二維陣列和二級指標的傳遞問題

再次看這篇文章,感覺說的好多都是廢話,在文章最前面補充一句話:
[]的優先順序高於*”,大家可以帶著這句話看下面的~~~
========================
再一次的見證了自己的基礎不牢靠。。。幸好發現得早,看見網上說,華為的一個面試題就考了這個方面的。

借那道華為的面試題引出問題,題目:

char **p, a[16][8];  問:p=a是否會導致程式在以後出現問題?為什麼?

可能有一部分朋友會回答正確,這裡他們認為,a[]是一級指標,a[][]就是二級指標。那這個到底對不對呢?

OK,用事實說話:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Author: Tanky Woo
// Blog:    www.WuTianQi.com
// Note:   驗證二維陣列與二級指標的傳遞問題
#include <iostream> 
using namespace std; 
 
void Test(char **p) 
{ 
    cout << p[0][0] << endl; 
} 
 
int main() 
{ 
    char a[2][3]; 
    Test(a); 
    return 0; 
}

結果報錯:

1
2
// error C2664: “Test”: 不能將引數 1 從“char [2][3]”轉換為“char  **”
//                          與指向的型別無關;轉換要求 reinterpret_cast、C 樣式轉換或函式樣式轉換

於是乎,我看了下《C專家程式設計》裡10.5節—使用指標向函式傳遞一個多維陣列

方法一:

函式是:

1
void fun1(int arr[2][3]);

這種方法導致只能處理2行3列的int型陣列。

方法二:

可以省略第一維的長度。

函式是:

1
void fun2(int arr[][3]);

這種方法的限制略微寬鬆了一些,但是還是隻能處理每行是3個整數長度的陣列。

函式也可以寫成:

1
void
fun2_2(int (*arrr)[3]);

方法三:

建立一個一維陣列,陣列中的元素是指向其他東西的指標。也可以說是二級指標。

函式是:

1
int fun3(int **arr);

注意:只有把二維陣列改為一個指向向量的指標陣列的前提下才可以這麼做!

比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream> 
using namespace std; 
 
void test(char **ptr) 
{ 
    cout << *ptr << endl; 
} 
 
int main() 
{ 
    char *p[3] = {"abc", "def", "ghi"}; 
    test(p); 
    return 0; 
}

在《C專家程式設計》10.3節的小啟發裡講的很透徹:(以下這段文字及對比一定要認真分析!)

陣列和指標引數是如何被編譯器修改的?

陣列名被改寫成一個指標引數”規則並不是遞迴定義的。陣列的陣列會被改寫成“陣列的指標”,而不是“指標的指標”:

實參                                                     所匹配的形參

陣列的陣列          char c[8][10];                  char (*)[10];          陣列指標

指標陣列             char *c[10];                     char **c;               指標的指標

陣列指標(行指標)  char (*c)[10];                  char (*c)[10];        不改變

指標的指標           char **c;                         char **c;               不改變

我在CSDN上專門為這個問題提問過:

最後我總結下討論結果:

只要實參的型別與形參的型別一致(或可轉換)就行。

為什麼這麼說呢?

piaojun_pj朋友給了一段程式碼,分析得很給力:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// VectorTest.cpp : 定義控制檯應用程式的入口點。 
// 
 
#include "stdafx.h" 
#include <iostream> 
using namespace std; 
 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int arr1[3]; 
    int arr2[3]; 
    int arr3[3]; 
    int * ptr; 
    // ptr1是一個指向 int [3] 的指標,即ptr的型別和&arr1的型別是一樣的,注意:arr1指向的記憶體區域定長 
    int ptr1[3][3]={{1,2,3},{1,2,3},{1,2,3}}; 
    // ptr2是一個指向 int * 的指標,即ptr2的型別和&ptr是一樣的,注意:ptr指向的記憶體區域不定長 
    int * ptr2[3]={arr1,arr2,arr3}; 
    // ptr3是一個指向 int [3] 的指標,即ptr3的型別和&arr1的型別是一樣的,注意:arr1指向的記憶體區域定長 
    int(* ptr3)[3]=&arr1; 
    ptr3=ptr1; // 沒錯,他們的型別相同 
    // ptr3=ptr2;//error 無法從“int *[3]”轉換為“int (*)[3] 
    // ptr4是一個指向 int * 的指標,即ptr4的型別和&ptr是一樣的,注意:ptr指向的記憶體區域不定長 
    int ** ptr4; 
    //ptr4=&arr1; //error 無法從“int (*)[3]”轉換為“int ** 
    ptr4=ptr2; // 沒錯,他們的型別相同 
    //ptr4=ptr3; // error 無法從“int (*)[3]”轉換為“int ** 
    return 0; 
}
» 知識共享許可協議本部落格採用署名 2.5 中國大陸許可協議進行許可。本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。
具體操作方式可參考此處。如您有任何疑問或者授權方面的協商,請給我留言。

相關推薦

陣列二級指標傳遞問題

再次看這篇文章,感覺說的好多都是廢話,在文章最前面補充一句話: “[]的優先順序高於*”,大家可以帶著這句話看下面的~~~ ======================== 再一次的見證了自己的基礎不牢靠。。。幸好發現得早,看見網上說,華為的一個面試題就考了這個方面的

陣列指向指標指標

一道面試題引發的問題,首先要知道[]的優先順序高於*,題目: char **p,a[6][8]; 問p=a是否會導致程式在以後出現問題?為什麼? 直接用程式說明: #include<stdio.h> void main() {     char **p,a[

C/C++中陣列指標關係分析

        在C/c++中,陣列和指標有著密切的關係,有很多地方說陣列就是指標式錯誤的一種說法。這兩者是不同的資料結構。其實,在C/c++中沒有所謂的二維陣列,書面表達就是陣列的陣列。我猜想是為了表述方便才叫它二維陣列。       在本文中,我也就叫它二維陣列。在C/C

陣列指標指標陣列的區別; 陣列指標的關係

指標和陣列的區別 C++/C程式中,指標和陣列在不少地方可以相互替換著用,讓人產生一種錯覺,以為兩者是等價的。   陣列要麼在靜態儲存區被建立(如全域性陣列),要麼在棧上被建立。陣列名對應著(而不是指向)一塊記憶體,其地址與容量在生命期內保持不變,只有陣列的內容可以改變。

陣列模型之指標陣列

#include <stdio.h> #include <stdlib.h> #include <string.h> #if 0 int main(int agrc, char *argv[]) { int i = 0; for(; i<

C語言二級陣列二級指標

轉載部落格:https://www.cnblogs.com/zou107/p/4909847.html   一、關於二維陣列和二維陣列區別 (1)一維陣列在記憶體中是連續分佈儲存的,同樣,二維陣列也是在記憶體連續儲存的。所以從記憶體的角度來分析,一維陣列和二維陣列其實沒有本質區

“全棧2019”Java第三十一章:陣列陣列詳解

難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第三十一章:二維陣列和多維陣列詳解 下一章 “全棧2019”Java第三十二章:增強for迴

Java 學習筆記 陣列物件陣列

定義二維陣列 int[][] a = new int[4][5]; 可以不指定列數 int[][] a = new int[4][]; 獲取行 int i = a.length(); 如果使用第一個例子,這裡就是返回4 獲取列 int i = a[0].length();使用第一個例子,這裡就是

初見dfs,用dfs計算陣列

原題的網址(一道很水的題) 程式碼如下 #include<bits/stdc++.h> using namespace std; int sum=0,num[100][100],jz[100][100],n; void dfs(int x,int y) { for(int

劍指off:在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣一個二維陣列和一個整數,判斷陣列中是否含有該整數

題目描述 在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 思路: 從左下角x開始尋找,x為此列最大數字,此行最小數字。如果目

java 劍指offer 第一題:在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。

我用了三種解法,全部都可以在牛客網上通過。 第一種解法是最簡單的,遍歷整個二維陣列找那個整數; 第二種和第三種都是根據二維陣列有序的特性進行查詢,第二種方法是從左下角開始查詢,大於左下角刪除一行,小於左下角刪除一列;第三種是從右上角開始查詢,大於右上角刪除一行,小於右上角的

陣列與雙重指標

一、簡介 1、二維陣列     int array[10][10]; 函式宣告: void fun(int a[][10])    函式呼叫:fun(array);   訪問: 一般使用a[i]

題目:在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。(Python實現)

''' 題目: 在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。 請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 ''' '''

·在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。

題目 在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 分析 例如這樣一個數列:   要在裡面查詢是否存在7。按照平常的思維

Python實遍歷二維陣列題目一:在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。

在準備國網的過程中,仍要刷題,程式設計題。痛並快樂著。喜歡Python語言,所以用Python進行敲磚頭。劍指offer題目一:在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列