想弄懂C語言中陣列和指標的關系嗎?這篇文章就占據你三分鐘時間,看完你肯定會有識訓!
陣列
陣列宣告為 資料型別 名稱[ constant-size ],并將一個資料型別的一個或多個實體分組到一個可尋址的位置
constant-size可能是一個運算式,但是該運算式必須求值為常量,例如:
#定義MAX_SIZE 16
...
int串列[MAX_SIZE + 1];
C陣列開始于元素0,所以像陣列定義 int a[3];將創建三個int元件,可尋址如a[0],a[1],和a[2]
請注意,即使定義很難說a[3],也沒有名為a[3]
與其他變數一樣,全域和靜態陣列元素默認情況下初始化為0,并且自動陣列元素填充有垃圾值
可以使用大括號中的一個或多個值來初始化陣列,例如:
int a[3] = {5, -2, 17};
ANSI C之前的編譯器可能不允許在自動陣列上進行初始化
如果存在初始化值串列,但未 指定常量大小,則陣列的大小與初始化值的數目相同
int q[] = {1, 2, 3}; 是相同的
int q[3] = {1, 2, 3};
要宣告對另一個檔案中定義的陣列的外部參考,請使用extern int a[];
字串常量
在C語言中,型別陣列char用于表示字串,字串的結尾由設定為0的位元組標記(也稱為NUL字符)
以下定義都將其陣列設定為相同的值:
int str1 [] = {'a','b','c','\ 0'};
int str2 [] =“ abc”;
ANSI C還允許定義像int str[3] = "abc"; ,其是相同的int str[3] = {'a', 'b', 'c'}; (省略了最終NUL字符)
多維陣列
多維陣列只是陣列的陣列(陣列的陣列...)
類似的多維陣列m[3][2]存盤在連續的存盤位置中,例如m [0] [0],m [0] [1],m [1] [0],m [1] [1],m [2] [0] ,m [2] [1]
指標
指標是包含變數地址的變數
有兩個與指標關聯的運算子:
該&運算子回傳其引數的地址
該*參考它的引數通過指標訪問物件指標
指標的一個簡單示例是:
int i,j;
int * p; / *指向'int'的指標* /
我= 6;
p =&i; / *將`p'設定為`i'的地址* /
j = * p; / *將'j'設定為6('i'的值)* /
* p = 5; / *將'i'設定為5 * /
指標可以包含一個地址或一個稱為空指標的特殊值,該值不同于所有有效指標
指標背景關系中的0將在編譯時轉換為空指標
還有一個前處理器宏NULL(在<stdio.h>或中 定義 <stdlib.h>)
像expression這樣的運算式將導致 陳述句是否為空指標,因為它與相同, 并且由于在指標背景關系中將其轉換為空指標,因此代碼將與空指標 進行隱式比較if (!ptr) statementptrif (ptr)if (ptr == 0)0ptr
同樣,將評估宣告,如果是不是一個空指標 if (ptr) statementptr
指標不能指向:
常數(像3,不const類似s const int a;)由于值3不具有永久的存盤器地址
register 變數,因為暫存器不在記憶體中,因此沒有記憶體地址
類似的運算式(8 * k),它們與常量大致相同,因為它們沒有永久的記憶體地址
指標和陣列
指標可以視為陣列
這段代碼:
int main(void){
int a [3] = {6,3,7};
int * p =&a [0]; / *將`p'指向`a'的第一個元素* /
if(a [0] == p [0] && a [1] == p [1] && a [2] == p [2])
return 1;
else
return 0;
}
將回傳1,因為指向 n的所有有效值p[n]a[n]
指標是沒有,不過,同為陣列
這是C語言最令人困惑的部分之一,因此這里有三種不同的方式來說明陣列a 與指向p第一個元素的指標之間的區別a :
技術說明:使用直接尋址訪問陣列,使用間接尋址訪問指標
較少技術的解釋:a是一個地址, p是一個保存以下地址的地址a
極其羅嗦解釋:檢索值從 ,在計算機啟動時的地址,移動?過去,并獲取價值從那里; 要從中檢索值,計算機將從地址開始,獲取存盤在其中的地址并向其添加n,然后從結果地址中 獲取值a[n]ap[n]p
但是,在大多數情況下,指標和陣列訪問可被視為具有相同的作用,主要的例外是:
1)sizeof 運算子
sizeof(array) 回傳所有元素中使用的記憶體量 array
sizeof(pointer)僅回傳pointer變數本身使用的記憶體量
2)&運算子
&array是的別名,&array[0]并回傳中第一個元素的地址array
&pointer 回傳的地址 pointer
3)字符陣列的字串文字初始化
char array[] = "abc"將前四個元素設定 array為'a','b','c'和'\ 0'
char *pointer = "abc"設定pointer為“ abc”字串的地址(可能存盤在只讀存盤器中,因此不可更改)
此外,無法調整陣列大小或重新分配陣列,
另外如果你想更好的提升你的編程能力,學好C語言C++編程!彎道超車,快人一步!筆者這里或許可以幫到你~
C語言C++編程學習交流圈子,QQ群1090842465【點擊進入】微信公眾號:C語言編程學習基地
分享(原始碼、專案實戰視頻、專案筆記,基礎入門教程)
歡迎轉行和學習編程的伙伴,利用更多的資料學習成長比自己琢磨更快哦!
編程學習書籍分享:
編程學習視頻分享:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/235906.html
標籤:其他
下一篇:探索ArrayList底層實作
