二維數組,指針數組和數組指針

二維數組,指針數組和數組指針

http://www.cnblogs.com/birduu/archive/2013/04/04/2999185.html

一、指針數組和二維數組
  我們來定義一個字符型指針數組 p:char* p[3]; 定義之後的內存示意如下:
      
  對於二維數組 char birduu[3][16] = { "birduu.com" , "course textbook" , "free" }; 來說,birduu[0] 的值是字符串 "birduu.com" 的首地址,也就是說,birduu[0] 可以理解成指向字符串 "birduu.com" 第一個元素 'b '的字符型指針。對於指針數組 p 來說,p[0] 是字符型指針,p[0] 的基類型是字符型,它和 birduu[0] 的基類型同爲字符型,就可以這樣賦值: p[0] = birduu[0]; 此時,p[0] 就指向了字符串 "birduu.com"。同理,執行 p[1] = birduu[1]; p[2] = birduu[2]; 後,p[1] 指向了字符串"course textbook",p[2] 指向了字符串"free"。內存示意圖如下:

      此後,就可以用 p 來操作二維數組 birduu 了,如示例欄中所示。
  注意 p 是一個指針數組,數組名是不可以被賦值的,不要寫成:p = birduu;

程序實例:

#include<stdio.h>
void main()
{
char birduu[3][16] = {"birduu.com","course textbook","free"};
char* p[3];
p[0]=birduu[0];
p[1]=birduu[1];
p[2]=birduu[2];

printf("%s\n",p[0]);
printf("%c\n",p[0][1]);
printf("%c\n",*(*(p+2)+3));
}

輸出爲:
birduu.com
i
e

 

二、數組指針和二維數組

數組指針就是指向數組的指針,先來定義一個數組指針變量 p: char (*p)[16]; 
  *p 說明 p 是一個指針變量,char [16] 說明 p 的基類型是包含16個字符型元素的一維數組,也就是說 p 可以指向一個包含16個字符型元素的一維數組。 
  下面來看看怎麼用數組指針操作二維數組。我們在 http://birduu.com/260.html 節講過,可以把二維數組名理解爲指向第一個行數組元素的指針變量。二維數組 char birduu[3][16] = { "birduu.com" , "course textbook" , "free" }; 的第一個行數組元素是包含16個字符型元素的一維數組,所以可以把二維數組名 birduu 理解爲:指向一維數組 birduu[0] 的指針,其基類型爲包含16個字符型元素的一維數組,birduu 的值就爲一維數組 birduu[0] 的地址。
  從以上分析我們可以看到,指針 birduu 和 p 的基類型是相同的,因此可以這樣賦值:p = birduu; 此時 p 就指向了 birduu[0],由於 p 的基類型是包含16個字符型元素的一維數組,所以指針 (p + 1) 指向 birduu[1],指針 (p + 2) 指向 birduu[2]。內存示意圖如下:

 

此後,就可以用 p 來操作二維數組 birduu 了,由於 p 是一個指針變量,所以它引用數組元素時無論用指針法、下標法還是混合法都可以。

程序實例:

#include<stdio.h>

void main()
{
char birduu[3][16] = { "birduu.com" , "course textbook" , "free" };
char (*p)[16];

p = birduu;

printf( "%s\n" , p[0] );
printf( "%c\n" , p[0][1] );
printf( "%c\n" , *( *( p + 2 ) + 3 ) );
printf( "%c\n" , *( p[2] + 3 ) );
printf( "%s\n" , *( p + 1 ) );
}

輸出爲:

birduu.com
i
e
e
course textbook

發佈了20 篇原創文章 · 獲贊 12 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章