二維數組和指向指針的指針


一道面試題引發的問題,首先要知道[]的優先級高於*,題目:

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節的小啟發里講的很透徹:(以下這段文字及對比一定要認真分析!)

數組和指針參數是如何被編譯器修改的?

數組名被改寫成一個指針參數”規則並不是遞歸定義的。數組的數組會被改寫成“數組的指針”,而不是“指針的指針”:

實參                                                      所匹配的形參

數組的數組          char c[8][10];                 char (*)[10];          數組指針

指針數組             char *c[10];                   char **c;               指針的指針

數組指針(行指針)  char (*c)[10];                 char (*c)[10];        不改變

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

下面再看一個網友的一段分析相當給力的代碼:

#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;
}


參考資料:

二維數組和指向指針的指針



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: