1. 程式人生 > >二維指標、二維陣列、指向陣列的指標 函式引數傳遞

二維指標、二維陣列、指向陣列的指標 函式引數傳遞

 前兩天寫個程式,傳引數的時候想傳個二維陣列進去,結果悲劇了,函式寫成

Fun (int **p){},原來沒有這麼寫過,以為這麼寫也是對的,結果錯了,查了些資料, 做個總結。 Fun (int **p){} 這裡面的int **p //這裡的p不是二維陣列的指標,而是指向指標的指標,即二級指標。 正確的二維陣列的指標應該是: Int a[2][2]; Int (*p)[2];//定義時無論陣列維數,只可忽略第一維 例如: int a[2][2]={0,1,2,3}; int **p=(int**)a;//強制將二維陣列指標轉為指向指標的指標 則此時 p[0]=0; p[1]=1; p[2]=2; p[3]=3; 而 p[0][0]=*(*(p+0)+0)=**p; p[0][1]=*(*(p+0)+1); 對於p[0][0]:由於*p=0; ====> **p=*(0);引用地址為零的記憶體,必然是錯誤的。 對於p[0][1]=*(*p+1)====>*(4),引用了非法記憶體 同樣,對於p[1][0]=*(1),p[1][1]=*(5),均引用了非法記憶體 所以說,二位陣列並不能簡單的轉換成指向指標的指標。 二維陣列其實只是一個指標,而二級指標是指向指標的指標,所以二者並不等價。 如上例所示:int a[2][2]; a是指向整個陣列的首地址,並不是int **; 所以不要指望向函式fun裡面傳實參 p=a;

前兩天寫個程式,傳引數的時候想傳個二維陣列進去,結果悲劇了,函式寫成Fun (int **p){},原來沒有這麼寫過,

以為這麼寫也是對的,結果錯了,查了些資料,做個總結。

Fun (int **p){}這裡面的int **p //這裡的p不是二維陣列的指標,而是指向指標的指標,即二級指標。

正確的二維陣列的指標應該是:Int a[2][2];Int (*p)[2];//定義時無論陣列維數,只可忽略第一維 

例如:int a[2][2]={0,1,2,3};

int **p=(int**)a;//強制將二維陣列指標轉為指向指標的指標

則此時p[0]=0;p[1]=1;p[2]=2;p[3]=3;

而p[0][0]=*(*(p+0)+0)=**p;

p[0][1]=*(*(p+0)+1);

對於p[0][0]:由於*p=0; ====> **p=*(0);引用地址為零的記憶體,必然是錯誤的。

對於p[0][1]=*(*p+1)====>*(4),引用了非法記憶體同樣,

對於p[1][0]=*(1),p[1][1]=*(5),均引用了非法記憶體所以說,二位陣列並不能簡單的轉換成指向指標的指標。  

二維陣列其實只是一個指標,而二級指標是指向指標的指標,所以二者並不等價。如上例所示:int a[2][2];

 a是指向整個陣列的首地址,並不是int **;所以不要指望向函式fun裡面傳實參 p=a;

感謝sld666666,我覺得那個應該是和下面的情況類似把,中間有個強制轉換的過程:

#include <iostream>

void fun(char ** p)

{

char (*p1)[10] = (char(*)[10])p;

std::cout<<p1[0][0]<<std::endl;

}

int main(int argc, char* argv[])

{

char data[][10] = {"abc","def"};

fun((char **)data);

return 0;

}

----------------------------------------------------------------華麗的分割線---------------------------------------------------------------------------------------------------------------------------

<c程式設計語言>中的關於這個的解釋:

Newcomers to C are sometimes confused about the difference between a two-dimensional array and an array of pointers, such as name in the example above. Given the definitions 

   int a[10][20];

   int *b[10];

then a[3][4] and b[3][4] are both syntactically legal references to a single int. But a is a true two-dimensional array: 200 int-sized locations have been set aside, and the conventional rectangular subscript calculation 20 * row +col is used to find the element a[row,col]. For b, however, the definition only allocates 10 pointers and does not initialize them; initialization must be done explicitly, either statically or with code. Assuming that each element of b does point to a twenty-element array, then there will be 200 ints set aside, plus ten cells for the pointers. The important advantage of the pointer array is that the rows of the array may be of different lengths. That is, each element of b need not point to a twenty-element vector; some may point to two elements, some to fifty, and some to none at all. 

Although we have phrased this discussion in terms of integers, by far the most frequent use of arrays of pointers is to store character strings of diverse lengths, as in the function month_name. Compare the declaration and picture for an array of pointers: 

   char *name[] = { "Illegal month", "Jan", "Feb", "Mar" };

with those for a two-dimensional array: 

   char aname[][15] = { "Illegal month", "Jan", "Feb", "Mar" };

//我的理解是,當是指標陣列的時候,可以直接傳,如果是普通的二維陣列的話應該就進行上面的轉換。

相關推薦

指標陣列指向陣列指標 函式引數傳遞

 前兩天寫個程式,傳引數的時候想傳個二維陣列進去,結果悲劇了,函式寫成 Fun (int **p){},原來沒有這麼寫過,以為這麼寫也是對的,結果錯了,查了些資料, 做個總結。 Fun (int **p){} 這裡面的int **p //這裡的p不是二維陣列的指標,而是指向指標的指標,即二級指標。

陣列作為函式引數傳遞(C++)

有時候我們也許會不明白為什麼C++中的陣列宣告的時候下標是需要一個常數,而不能是一個變數吶?也許STL模板庫中的向量可以解決變數作為下標的陣列宣告方式,為了節約一些記憶體或者是提高一些效能,也為了功能不重複,故而陣列中的下標採取了常量的方式。 int a[

C++中函式引數傳遞(值傳遞指標傳遞,引用傳遞

今天想寫一個函式,從函式中把我需要的兩個值傳出來,由於傳出來的值比較多,所以不考慮用return來返回,需要通過引數把修改後的值拉出來供我使用,很當然的就想到了用指標,但是值就是傳不出來;使我對原有的大腦中指標的思維產生混沌感,今天一上午才把函式傳遞又走了

指標陣列指向陣列指標

指標陣列定義 int *p[n]; []優先順序高,先與p結合成為一個數組,再由int*說明這是一個整型指標陣列,它有n個指標型別的陣列元素。這裡執行p+1時,則p指向下一個陣列元素,這樣賦值是錯誤的:p=a;因為p是個不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它們

Python基礎筆記_Day07_函式引數傳遞關鍵字引數預設引數匿名函式裝飾器

Day07_函式引數傳遞、關鍵字引數、預設引數、匿名函式、裝飾器 07.01_Python基礎語法(函式的引數的傳遞)(掌握) 07.02_Pythony語言基礎(關鍵字引數)(掌握) 07.03_Pythony語言基礎(預設引數/預設引數)(掌握) 07.04_Pythony語言基礎(

陣列指標函式引數傳遞

#include<iostream> using namespace std; void callByValue(int arr[], int n) { printf("\ncallByValue:"); for (int i = 0;i < 10;

C++ 指標陣列指向陣列指標

指標陣列:array of pointers,即用於儲存指標的陣列,也就是陣列元素都是指標 陣列指標:a pointer to an array,即指向陣列的指標 還要注意的是他們用法的區別,下面舉例說明。 int* a[4]     指標陣列         

C語言結構體內含有陣列,該結構體作為引數傳遞時需用指標,否則對陣列的修改不會被記錄

    在C語言程式設計時,常常會定義結構體,而且結構體裡面常常會有陣列,比如如下所示: typedef struct {int data[MAX_HEAP_SIZE];unsigned int heap_size;}HeapType;     這是一個堆的資料結構,包含堆

C語言指標作為函式引數傳遞學習(一)

1. 一維指標做函式引數 傳入的指標為NULL 比如下面的例子,很多人都會理解錯: #include <stdio.h> void test(char *string) { string = "hello world"; } int main() { cha

c語言之函式引數傳遞陣列

在VC中寫程式都習慣了,一般陣列作為函式實參時,最常用的方法就是引用和指標的方法,但是到C語言中就沒有引用了,還有一種比較常用的方法: #include <stdio.h>void sort(int array[],int n)...{int i,j,k,t;f

c++之指標作為函式引數傳遞的問題

轉自:http://blog.csdn.net/fjb2080/article/details/5623427   原創文章,轉載請註明出處,謝謝! 作者:清林,部落格名:飛空靜渡   部落格地址:http://blog.csdn.net/fjb2080 &n

指標作為函式引數傳遞 (轉載)

這幾天在學習C過程中,在使用指標作為函式引數傳遞的時候出現了問題,根本不知道從何得解:原始碼如下:    createNode(BinNode *tree,char *p)    {        tree = (BinNode *) malloc(sizeof(BinNo

結構體變數和結構體指標變數作為函式引數傳遞的問題

/*2015年8月28日13:20:28通過函式完成對結構體變數的輸入和輸出*/# include <stdio.h># include <string.h>struct Student{int age;char sex;char name[100];

陣列作為函式引數傳遞

陣列有兩個特殊的性質。一是不能複製陣列;二是使用陣列名字時,陣列會自動轉化為指向其第一個元素的指標。由於陣列不能複製,所以無法編寫使用陣列型別形參的函式,因為陣列會被自動轉化為指標。 一、一維陣列 1.三種定義形式: void printvalues(int *); vo

【轉】C++函式引數傳遞中的一級指標和二級指標【【**】】

主要內容: 1、一級指標和二級指標 2、函式指標傳遞的例子 3、什麼時候需要傳遞二級指標? 4、二級指標在連結串列中的使用 1、一級指標和二級指標 一級指標:即我們一般說的指標,就是記憶體地址; 二級指標:指向指標的指標,就是

一級指標域二級指標函式引數傳遞

/*初始化單鏈表*/ /********************************************************   *  函式名:int InitList(LinkList *L)   *  函式功能: 初始化單鏈表   *  輸入引數:LinkList *L   *  輸出引數:i

菜鳥學習-C語言函式引數傳遞詳解-結構體與陣列

C語言中結構體作為函式引數,有兩種方式:傳值和傳址。 1.傳值時結構體引數會被拷貝一份,在函式體內修改結構體引數成員的值實際上是修改呼叫引數的一個臨時拷貝的成員的值,這不會影響到呼叫引數。在這種情況下,涉及到結構體引數的拷貝,程式空間及時間效率都會受到影

指標作為函式引數傳遞的問題

今天程式設計時遇到了一個問題,就是想寫一個函式,讓這個函式通過引數返回記憶體某一個緩衝區的首地址。在網上找了找,發現以下這段程式碼比較有代表性, 於是複製過來作為一個總結說明。 下面這段程式碼是正確的,這段程式碼通過函式申請一片記憶體區,並將申請到的記憶體首地址返回給呼叫函

結構體指標作為函式引數傳遞卻無法傳值的有關問題

今天做C++作業遇到一個問題,需要寫一個函式(在連結串列中新增新的節點)將結構體指標作為形參,結果發現傳遞之後無法改變結構體的值,連結串列的長度還是沒變。通過查詢資料,發現把形參改為對結構體指標的應用即可解決問題。 原始碼: struct Tnode { strin

C語言中如何將陣列作為函式引數傳遞

今天覆習到c語言的陣列,看到這麼一個問題: 現在,你的程式要讀入兩個多項式,然後輸出這兩個多項式的和,也就是把對應的冪上的係數相加然後輸出。 程式要處理的冪最大為100。 輸入格式: 總共要輸入兩個多項式,每個多項式的輸入格式如下: 每行輸入兩個數字,第一個表