C語言學習筆記 指標和陣列的關係

2022-06-25 21:18:11 字數 3777 閱讀 4012

(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 int

main()

;

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 int

main()

;

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是...