C/C++編程筆記:C數(shù)組、字符串常量和指針!三分鐘弄懂它

想弄懂C語言中數(shù)組和指針的關(guān)系嗎?這篇文章就占據(jù)你三分鐘時間,看完你肯定會有收獲!

數(shù)組
數(shù)組聲明為?數(shù)據(jù)類型?名稱[?constant-size?],并將一個數(shù)據(jù)類型的一個或多個實例分組到一個可尋址的位置
constant-size可能是一個表達(dá)式,但是該表達(dá)式必須求值為常量,例如:
#定義MAX_SIZE 16
...
int列表[MAX_SIZE + 1];
C數(shù)組開始于元素0,所以像陣列定義?int a[3];將創(chuàng)建三個int元件,可尋址如a[0],a[1],和a[2]
????????請注意,即使定義很難說a[3],也沒有名為a[3]
與其他變量一樣,全局和靜態(tài)數(shù)組元素默認(rèn)情況下初始化為0,并且自動數(shù)組元素填充有垃圾值
可以使用大括號中的一個或多個值來初始化數(shù)組,例如:
int a[3] = {5, -2, 17};
????????ANSI C之前的編譯器可能不允許在自動數(shù)組上進(jìn)行初始化
如果存在初始化值列表,但未?指定常量大小,則數(shù)組的大小與初始化值的數(shù)目相同
int q[] = {1, 2, 3};?是相同的
int q[3] = {1, 2, 3};
要聲明對另一個文件中定義的數(shù)組的外部引用,請使用extern int a[];

字符串常量
在C語言中,類型數(shù)組char用于表示字符串,字符串的結(jié)尾由設(shè)置為0的字節(jié)標(biāo)記(也稱為NUL字符)
以下定義都將其數(shù)組設(shè)置為相同的值:
int str1 [] = {'a','b','c','\ 0'};
int str2 [] =“ abc”;
ANSI C還允許定義像int str[3] = "abc";?,其是相同的int str[3] = {'a', 'b', 'c'};?(省略了最終NUL字符)
多維數(shù)組
多維數(shù)組只是數(shù)組的數(shù)組(數(shù)組的數(shù)組...)
類似的多維數(shù)組m[3][2]存儲在連續(xù)的存儲位置中,例如m [0] [0],m [0] [1],m [1] [0],m [1] [1],m [2] [0] ,m [2] [1]

指針
指針是包含變量地址的變量
有兩個與指針關(guān)聯(lián)的運算符:
????????該&操作符返回其參數(shù)的地址
????????該*引用它的參數(shù)通過指針訪問對象指針
指針的一個簡單示例是:
int i,j;
int * p; / *指向'int'的指針* /
我= 6;
p =&i; / *將`p'設(shè)置為`i'的地址* /
j = * p; / *將'j'設(shè)置為6('i'的值)* /
* p = 5; / *將'i'設(shè)置為5 * /
指針可以包含一個地址或一個稱為空指針的特殊值,該值不同于所有有效指針
????????指針上下文中的0將在編譯時轉(zhuǎn)換為空指針
????????還有一個預(yù)處理器宏NULL(在<stdio.h>或中?定義?<stdlib.h>)
????????像expression這樣的表達(dá)式將導(dǎo)致?語句是否為空指針,因為它與相同,?并且由于在指針上下文中將其轉(zhuǎn)換為空指針,因此代碼將與空指針?進(jìn)行隱式比較if (!ptr)?statementptrif (ptr)if (ptr == 0)0ptr
同樣,將評估聲明,如果是不是一個空指針?if (ptr)?statementptr
指針不能指向:
常數(shù)(像3,不const類似s?const int a;)由于值3不具有永久的存儲器地址
register?變量,因為寄存器不在內(nèi)存中,因此沒有內(nèi)存地址
類似的表達(dá)式(8 * k),它們與常量大致相同,因為它們沒有永久的內(nèi)存地址
指針和數(shù)組
指針可以視為數(shù)組
這段代碼:
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]
指針是沒有,不過,同為數(shù)組
這是C語言最令人困惑的部分之一,因此這里有三種不同的方式來說明數(shù)組a?與指向p第一個元素的指針之間的區(qū)別a?:
技術(shù)說明:使用直接尋址訪問數(shù)組,使用間接尋址訪問指針
較少技術(shù)的解釋:a是一個地址,?p是一個保存以下地址的地址a
極其羅嗦解釋:檢索值從?,在計算機(jī)啟動時的地址,移動?過去,并獲取價值從那里;?要從中檢索值,計算機(jī)將從地址開始,獲取存儲在其中的地址并向其添加n,然后從結(jié)果地址中?獲取值a[n]ap[n]p
但是,在大多數(shù)情況下,指針和數(shù)組訪問可被視為具有相同的作用,主要的例外是:
1)sizeof 運算符
sizeof(array)?返回所有元素中使用的內(nèi)存量?array
sizeof(pointer)僅返回pointer變量本身使用的內(nèi)存量
2)&運算符
&array是的別名,&array[0]并返回中第一個元素的地址array
&pointer?返回的地址?pointer
3)字符數(shù)組的字符串文字初始化
char array[] = "abc"將前四個元素設(shè)置?array為'a','b','c'和'\ 0'
char *pointer = "abc"設(shè)置pointer為“ abc”字符串的地址(可能存儲在只讀存儲器中,因此不可更改)
此外,無法調(diào)整數(shù)組大小或重新分配數(shù)組。
另外如果你想更好的提升你的編程能力,學(xué)好C語言C++編程!彎道超車,快人一步!筆者這里或許可以幫到你~

UP在主頁上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會對你有幫助的~
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長比自己琢磨更快哦!
編程學(xué)習(xí)書籍分享:

編程學(xué)習(xí)視頻分享:
