1. 程式人生 > >c/c++---之用二級指標操作二維陣列

c/c++---之用二級指標操作二維陣列

通過二級指標去訪問二維陣列需要先給二級指標分配等同於二維陣列行數的一維陣列指標,然後把二維陣列的每行首地址賦值給對應位置的一維指標上。之後就可以通過二維指標直接訪問了。

參考程式碼如下,可以看具體註釋輔助理解。

 

#include <stdio.h>//輸入輸出標頭檔案。

#include <stdlib.h>//本程式需要用到malloc/free函式,引用該標頭檔案。

int main()

{

    int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; //定義二維陣列a,並賦值從1-12.

    int ** p = NULL;//定義二維指標。

    int i, j;

     

    p = (int **)malloc(sizeof(int *) *3);//要訪問的陣列有三行,所以申請三個一維指標變數。

    for(i = 0; i < 3; i ++)

    {

        p[i] = a[i];//將二維陣列行地址賦值到對應的一維指標上。

    }

     

    for(i = 0; i < 3; i ++)

    {

        for(j = 0; j < 4; j ++)

            printf("%d ", p[i][j]); //用指標輸出元素。p[i][j]這裡也可以寫作*(*(p+i) + j)。

        printf("\n"); //每行輸出後加一個換行

    }

     

    free(p);//釋放申請的記憶體。

     

    return 0;

}

需要動態申請的啊,堆疊上面的陣列是不能直接返回的會在函式退出的時候銷燬掉

#include<stdio.h>

int **returnNum()

{

  int **a,i,j;

  a = (int**)malloc(5*sizeof(int*));

  for(i=0;i<5;++i)

  {

      a[i] = (int*)malloc(5*sizeof(int));

    for(j=0;j<5;++j)

     {

      a[i][j]=i;

      }

 }

  return a;//error: cannot convert `int (*)[5]' to `int**' in return

} 

int main()

{

  //int cpy[5][5]=returnNum; // error: invalid initializer

  int **cpy=returnNum();

  int i,j;

  for(i=0;i<5;++i)

  {

     for(j=0;j<5;++j)

     {

       printf("%d ", cpy[i][j]);

      }

     printf("\n");

     free(cpy[i]);

 }

 free(cpy);

   

  return 0;

}

用二維指標訪問二維陣列多用於函式呼叫。

對於一維陣列,如果函式引數為一維指標可以直接用陣列名當做函式引數。但是如果函式引數為二維指標,直接用二維陣列名做引數會出現訪問出錯,是因為二維指標和二維陣列的訪問方式不同造成的,需要如示例程式碼中做轉換。

另外一種常用的方法是利用二維陣列的記憶體連續性將二維陣列轉為一維陣列處理,與本題無關,不做更多描述。

轉載:https://zhidao.baidu.com/question/585729445.html

轉載:https://zhidao.baidu.com/question/982964612995123859.html

 

注意:

1.二級指標運算元組,要到申請相對於二維陣列行數的一級指標的記憶體。

2.直接將陣列首地址賦值給2維指標就可以了不需要挨個賦值。