二維數組的兩種訪問方式


例1: 
int arr[4][5];  
int *p; 
p=arr[0];//正確

arr[0]是int一維數組,arr[0]這個一維數組的各元素才是基本的int數據類型

 

下面的寫法: 
char arr[4][5]={"abc","def","ghi","jkl","mno"}; 
char *p=arr[0]; 
for(i=0;i<20;i ) 
printf("%c", *(p i) ); //仔細觀察輸出的值是怎樣變化的 

 

1、必須使這個指針指向與其對應的字符型數據類型; 

 

2、指針每增加一個單位的地址值

 

printf()語句輸出的結果為" abcdefghijklmno"   

下面舉一個整型指針的例子: 
int arr[3][3]={ {1,2,3},{4,5,6},{7,8,9}}; 
int *p=arr[0]; 
for(i=0;i<9;i ) 
printf("%d", *(p i)); // 逐個的輸出數組元素

 

一個二維數組的指針它有哪些特點: 
一個二維數組,它的每一個數組元素都是一個一維數組,

 

一個整型二維數組可以寫為: 
int arr[3][3]; 即 {arr[0], arr[1], arr[2] } 
指針 p指向arr[0],  指針 p +1 指向arr[1] ,指針 p +2指向arr[2],

 

也就是指針每移動一個單位的地址就指向下一個一維數組,

 

實際上移動一個一維數組的長度即3個整型量。

 

那么這個指針可定義為如下形式: 
int (* p) [3] ; // 定義了一個指向二維數組的指針,這個二維數組中的一維 數組有3個元素。
 
p=arr; // 把二維數組的地址賦給指針 p 
char arr[3][4]={"abc","def","ghi"}; 
*(p +0) //是數駔 a[0] 的首地址 printf("%s", *p); 輸出字符串 “"abc" 
*(p +1) //數組a[1]的首地址 printf("%s", *(p 1)); 輸出字符串 "def" 
*(p +2) //數組 a[2]的首地址 printf("%s",*(p 2)); 輸出字符串 "ghi"

 

如果要用這個二維數組的指針逐個的輸出字符可以寫為: 
*(*(p +0) +0) //第一個字符 a 
*(*(p +0)+ 1) //第二個字符 b 
*(*(p +0) +2) //第三個字符 c 
*(*(p +0) +3) //第四個字符 d 
*(*(p +0) +4) //第五個字符 e 
.................. 依此類推

 

 

 

當指針指向結構時的情形。。。

 

一個結構數組,三個結構: 
struct student

 

 

 

 

int a;char *b;

 

 

 

}stru[3]={{1,"abc"},{2,"def"},{3,"ghi"}}; 


struct student *p=stru;

 

 

 

p 0 //第一個結構的地址 
p 1 //第二個結構的地址 
p 2 //第三個結構的地址

 

  

 

定義一個二維數組: 
inta[3][4];
表示二維數組有三行四列共12個元素,在內存中按行存放,每行四個元素
a是二維數組的首地址,

&a[0][0]既可以看作數組0行0列的首地址,同樣還可以看作是二維數組的首地址,

a[0]是第0行的首地址,當然也是數組的首地址。

同理a[n]就是第n行的首址;&a[n][m]就是數組元素a[n][m]的地址。
把二維數組看成是由n行一維數組構成,將每行首地址傳遞給指針變量,行中的其余元素均可由指針來表示。

用地址法來表示數組各元素的地址。對元素a[1][2],&a[1][2]是其地址,a[1]+2也是其地址。

分析a[1]+1與a[1]+2的地址關系,它們地址的差並非整數1,而是一個數組元素的所占位置2,原因是每個數組元素占兩個字節。
對0行首地址與1行首地址a與a+1來說,地址的差同樣也並非整數1,是一行,四個元素占的字節數8。
由於數組元素在內存的連續存放。給指向整型變量的指針傳遞數組的首地址,則該指針指向二維數組。
int *ptr,a[3][4]; 
若賦值:ptr=a;則用ptr++就能訪問數組的各元素。


//用地址法輸入輸出二維數組各元素。
#include
main()
{
     int a[3][4];
     int i,j;
     for(i=0;i<3;i++)
          for(j=0;j<4;j++)
               scanf("%d",a[i]+j);/*地址法*/先輸行,一行滿了之后再輸下一行
     for(i=0;i<3;i++)
    {
         for(j=0;j<4;j++)
         printf("%4d",*(a[i]+j));/**(a[i]+是j地)址法所表示的數組元素*/
         printf("\n");
     }
}
運行程序:
輸入:1 2 3 4 5 6 7 8 9 10 11 12

輸出:

1 2 3 4
5 6 7 8
9 10 11 12

 

//用指針法輸入輸出二維數組各元素。

//把二維數組看作是展開的一維數組
#include
main()
{
       int a[3][4],*ptr;
       int i,j;
       ptr=a[0];
       for(i=0;i<3;i++)
           for(j=0;j<4;j++)
               scanf("%d",ptr++);/*指針的表示方法*/
       ptr=a[0];  //重新指向數組第0行
       for(i=0;i<3;i++)
       {
            for(j=0;j<4;j++)
                printf("%4d",*ptr++);
            printf("\n");
       }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM