看如下**:
int array[5];
int matrix[2][3];
int* pa=array;
int* pb=matrix;
思考問題:
都知道,一位陣列名array
代表陣列首元素位址,那麼二維陣列名
matrix
代表什麼?也是首元素位址麼?
array和
&array
的值相同,它們的意義不同,表現在它們的指標運算方式不同,為什麼會有不同?指向它們的指標型別相同嗎?
要回答第乙個問題,必須要簡單回顧一下二維陣列;
定義方式:
型別說明符 陣列名[例如:int matrix[2][3];常量表示式
][常量表示式
];
表示定義了乙個2行
3列存放整型資料的陣列;
c語言中對二維陣列採用這種定義方式,使得二維陣列可被看作是一種特殊的一維陣列,即是這個一維陣列的每乙個元素又是乙個一維陣列;如下int matrix[2][3]
的**:
首先把matrix
看作乙個一維陣列,它有兩個元素:
每個元素又是乙個包含3
個元素的一維陣列:
儲存方式:
c語言中,二維陣列中的元素排列順序是按行存放的,即在記憶體中先順序存放第一行的元素,接著再存放第二行的元素。
從二維陣列的角度看,matrix確實也代表二維陣列首元素的位址,而現在首元素的位址不是乙個簡單的整型元素,而是由
3個整型元素所組成的一維陣列;因此,
matrix
代表的是首行元素的首位址,它是首行
3個元素所在記憶體這一整體的首位址,雖然在值上和
matrix[0][0]
元素的位址相同,但是意義不同;如果此時
matrix+1
,則表示
matrix第1
行元素的首位址;
c語言中,陣列有自己特定的型別,這個型別由元素型別和陣列大小共同決定;例如:int array[5]
的型別為
int[5]
實際上本質的原因是array與&array
所屬的指標型別不一樣,
array
屬於int*
型別因為它是陣列首元素位址,
&array
屬於int (*)[5]
,因為它指向陣列,而陣列的型別為
int[5]
例如編譯如下的**,會得到注釋中的警告資訊
#include int main()
1.4中簡單介紹了陣列型別,這個型別寫起來還是有點彆扭,通常用typedef
為其重新命名:
typedef arraytype(newname)[size];
如:typedef int(int5)[5];
然後就可以使用它定義陣列了:
int5 a;
陣列指標用於指向乙個陣列;陣列名是陣列首元素位址,不是陣列的起始位址,雖然它們值相同!
通過將取位址符&
作用於陣列名可以得到陣列的起始位址;
可通過重新命名的陣列型別定義陣列指標:
typedef int(int5)[5];
int5 array;
int5* pa=&array;
也可以直接定義:type (*pointer)[n];如:int array[5];
int (*pa)[5];
pa=&array;
指標陣列也算是乙個普通的陣列,只不過陣列中每個元素為乙個指標;指標陣列的定義:
type * parray[n];
例如:int* p[5];//
陣列中將存放5個
int*
型的位址
#include #include #define dim(array) (sizeof(array)/sizeof(*array))
int lookup_keyworld(const char* key, const char* table, const int arraysize)
{int ret = -1;
int i = 0;
for (i = 0; i
C語言 指標陣列和指標陣列
本質是陣列 只不過呢,它裡面存放的資料型別不是int,也不是char這類基本型別,而是乙個指標型別,說白了就是位址,所以叫指標陣列!記住 是存放指標的陣列!int p n 本質是指標 只不過是指向乙個陣列的指標,也稱之為 行指標 int p n p是乙個指標,指向乙個int型別的一位陣列,這個一位陣...
C語言複習 指標和陣列
include include 陣列是一塊連續的記憶體空間 陣列名 就是記憶體空間的首位址 陣列名 i 陣列名 i main printf a 0 d n arr 0 printf a 4 d n arr 4 邏輯上是錯誤的 陣列下標越界 printf a 5 d n arr 5 windows x...
c語言複習 指標和陣列
注 本文是對蘇小紅版c語言程式設計第11章的筆記 陣列名代表陣列元素的連續儲存空間的首位址,即指向陣列中的第乙個元素的指標常量。e.g.a a 0 a i a i 不能對陣列名執行增1或減1的操作 a是指標常量 p 1 和p 本質上是不同的操作 雖然二者都對指標變數p進行加1運算,但p 1不改變指標...