(1)陣列是一段連續的記憶體空間
(2)陣列的空間大小:sizeof(array_type)*array_size;
(3)陣列名可看做指向陣列第乙個元素的常量指標
(4)陣列宣告時編譯器自動分配一片連續的記憶體空間 ,而指標宣告時只分配了用於容納位址值的 4 位元組空間
(1)指標是一種特殊的變數,與整數的運算規則為:
p + n == (unsigned int)p + n * sizeof(*p);
當指標 p 指向乙個同型別的陣列的元素時,p+1 指向當前元素的下乙個元素,p-1 指向
上乙個元素。
(2)指標之間只支援減法運算且參與減法運算的指標型別必須相同。
p1 - p2 = ((unsigned int)p1 – (unsigned int)p2)/sizeof(type)
①只有當兩個指標指向同乙個陣列中的元素時,指標相減才有意義,其意義為指標所指元 素的下標差。
②當兩個指標指向的元素不在同乙個陣列中時,結果未定義。
指標運算的應用
#include //統計元素的個數
#define dim(a) (sizeof(a) / sizeof(*a))
intmain()
;//棧
char* pbegin =s;
char* pend = s + dim(s); //
關鍵點,陣列名 + n
char* p =null;
printf(
"pbegin = %p\n
",pbegin); //
第 1 個元素的位址
printf("
pend = %p\n
",pend); //
最後 1 個元素的位址
printf("
size: %d\n
",pend - pbegin); //
5
//在同一行中列印出:hello
for (p = pbegin;p < pend; p++)
printf("\n
");return0;
}
(1)以下標的形式訪問陣列中的元素:如 a[i];
(2)以指標的形式訪問陣列中的元素:如*(a+i)
(3)下標形式與指標形式的轉換:a[n]==*(a+n)==*(n+a)==n[a];
#include intmain()
;
int* p =a;
int i = 0
;
for(i=0; i<5; i++)
for(i=0; i<5; i++)
for(i=0; i<5; i++)
for(i=0; i<5; i++)
return0;
}
指標和陣列不同
//ext.c
//本檔案應為.c,而不能是標頭檔案。因為標頭檔案會被直接包含在相應檔案中,而.c 檔案是分別編譯的
int a[5] = ; //
在該檔案中,a 被看作乙個陣列
#include //編譯這兩個檔案:gcc test.c ext.c
intmain()
;extern
int a; //
本檔案,如果這樣宣告,a 仍被看作乙個陣列
printf("
&a = %p\n
", &a); //
這裡的&a 為整個陣列的位址
printf("
a = %p\n
",a); //
a 為首元素的位址,數值上等於&a
printf("
*a = %d\n
",*a); //
列印出第 1 個元素,即 1
/*extern int* a; //如果這樣宣告,編譯器將 a 當成是乙個 int 型的指標來使用。
printf("&a = %p\n", &a); //會從符號表中查到指標 a 的位址,指向陣列
printf("a = %p\n",a); //從指標 a 處,取乙個 int 型的資料,即第 1 個元素,為 1
printf("*a = %d\n",*a); //試圖從位址 0x01 處取出資料,違規記憶體訪問錯誤。
*/return0;
}
(1)a 為陣列首元素的位址
(2)&a 為整個陣列的位址,即可將陣列看成是一種資料結據。如 int[5];
(3)a 和&a 的區別在在指標運算
a + 1 == (unsigned int)a + sizeof(*a);//a 代表首元素位址,*a 表示第 1 個元素
&a + 1 == (unsigned int)(&a) + sizeof(*&a) == (unsigned int)(&a) +
sizeof(a);
指標運算經典問題
#include intmain()
;
int* p1 = (int*)(&a + 1); //
指向陣列最後面,即第5個元素的後面
int* p2 = (int*)((int)a + 1);//
指向陣列的起始位址+1byte偏移處
int* p3 = (int*)(a + 1); //
指向第2個元素
printf(
"p1[-1] = %d\n
",p1[-1]);//
輸出第5個元素
//
//01 00 00 00,02 00 00 00,03 00 00 00,04 00 00 00,05 00 00 00
//p2指向陣列起始位址+1位元組的偏移處,即01的後面,從這個地方開始讀
//出4個位元組,00 00 00 02,根據小端模式規則,該值為0x02 00 00 00,
printf("
p2[0] = 0x%x,p2[0] = %d\n
",p2[0],p2[0]);//
0x02000000==33554432
printf(
"p3[1] = %d\n
",p3[1]); //
輸出第3個元素,即3
return0;
}
(1)陣列作為函式引數時,編譯器將其編譯為對應的指標。因此,一般情況下,當定義的函
數中有陣列引數時,需要定義另乙個引數來標示陣列的大小。
void f(int a)等價於 void f(int* a);
void f(int a[5])等價於 void f(int* a); //就是乙個指標,丟失了陣列長度的資訊
#include void func1(char a[5]) //編譯時,a被編譯為乙個指標,丟失了陣列長度的資訊
void func2(char b) //
b被編譯成乙個指標,與陣列小大有沒有被指定無關。
intmain()
; func1(array);
printf(
"array[0] = %c\n
",array[0]); //
array[0] = a;
func2(array);
printf(
"array[0] = %c\n
",array[0]); //
array[0] = b;
return0;
}
C語言學習筆記之陣列與指標的關係
首先,大家先需知道乙個關於基型別的概念 基型別 組成乙個新型別的基礎型別 這句話是什麼意思呢?舉個例子 int a 3 上面是由三個int型別的數組成乙個新的型別也就是陣列,所以基型別是int int a 2 2 上面是由兩個一維陣列型別組成乙個二維陣列,所以基型別是一維陣列 有了上面兩個例子,相信...
C語言學習筆記 指標 指標陣列與陣列指標
指標陣列 是乙個陣列,陣列元素為指標 陣列指標 是乙個指標,指向陣列的指標 例如 int p1 5 int p2 5 對於語句int p1 5 因為 的優先順序要比 要高,所以 p1 先與 結合,構成乙個陣列的定義,陣列名為 p1,而 int 修飾的是陣列的內容,即陣列的每個元素。也就是說,該陣列包...
《C語言筆記 指標陣列和陣列指標》
一,從字面意思來理解指標陣列和陣列指標 1,指標陣列 實質是乙個陣列,這個陣列裡存放的元素是指標。2,陣列指標 實質是乙個指標,這個指標指向乙個陣列。二,分析指標陣列和陣列指標的表示式 int p 5 int p 5 int p 5 1,先說說一般規律。int p p是乙個指標 int p 5 p是...