C說話中二維數組指針的扼要解釋。本站提示廣大學習愛好者:(C說話中二維數組指針的扼要解釋)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話中二維數組指針的扼要解釋正文
C說話中,指針是一個龐雜但又靈巧多變的常識點,我們曉得,在一維數組中,關於一個數組a[],*a,a,&a,都表現a的首地址,但假如與二維數組混雜應用,就顯得更加龐雜了。例如關於一個二維數組
a[2][4]={{1,2.3},{4,5,6}} a+i,&a[i],*(a+i),a[i],
這四個表達式究竟表現甚麼呢?
先告知謎底吧,其實這幾個表達式都是指向統一個地址的,或許你會很驚訝,也會很困惑,怎樣會是如許呢!!現實證實就是如許的,
C說話中,指針是一個龐雜但又靈巧多變的常識點,我們曉得,在一維數組中,關於一個數組a[],*a,a,&a,都表現a的首地址,但假如與二維數組混雜應用,就顯得更加龐雜了。例如關於一個二維數組
a[2][4]={{1,2.3},{4,5,6}} a+i,&a[i],*(a+i),a[i],
這四個表達式究竟表現甚麼呢?
先告知謎底吧,其實這幾個表達式都是指向統一個地址的,或許你會很驚訝,也會很困惑,怎樣會是如許呢!!現實證實就是如許的。
來看一道標題:
char **p,a[6][8]; 問p=a能否會招致法式在今後湧現成績?為何?
直接用法式解釋:
#include<stdio.h> void main() { char **p,a[6][8]; p = a; printf("\n"); }
編譯,然後就會發明通不外,報錯:毛病 1 error C2440: “=”: 沒法從“char [6][8]”轉換為“char **”
因而乎,我看了下《C專家編程》裡10.5節—應用指針向函數傳遞一個多維數組。
辦法一,函數是 void fun(int arr[2][3]); 這類辦法只能處置2行3列的int型數組。
辦法二,可以省略第一維的長度。函數是 void fun(int arr[][3]);這類方法固然限制寬松了一些,然則照樣只能處置每行是3個整數長度的數組。
或許寫成這類情勢 void fun(int (*arr)[3]);這是一個數組指針或許叫行指針,arr和*先聯合使得arr成為一個指針,這個指針指向具有3個
int類型數據的數組。
辦法三,創立一個一維數組,數組中的元素是指向其他器械的指針,也即二級指針。函數是 int fun(int **arr);這類辦法可以靜態處置各行各列紛歧樣長度的數據。
留意:只要把二維數組改成一個指向向量的指針數組的條件下才可以這麼做!好比上面的法式可以正常輸入abc:
#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節的小啟示裡講的很透辟:(以下這段文字及比較必定要賣力剖析!)
數組和指針參數是若何被編譯器修正的?
“數組名被改寫成一個指針參數”規矩其實不是遞歸界說的。數組的數組會被改寫成“數組的指針”,而不是“指針的指針”:
上面再看一個網友的一段剖析相當給力的代碼:
#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; }