C語言中數(shù)組和指針是兩個(gè)常用的變量
數(shù)組:
C語言中定義一個(gè)數(shù)組a時(shí),如:int a[5];編譯器根據(jù)指定的元素個(gè)數(shù)和元素的類型分配確定大小(元素類型大小元素個(gè)數(shù))的一塊內(nèi)存骏融,并把這塊內(nèi)存的名字命名為a析苫。名字a一旦與這塊內(nèi)存匹配就不能被改變。
a[0],a[1]等是a的元素潭千,但并非元素的名字谱姓。數(shù)組的每一個(gè)元素都是沒有名字的。不能把數(shù)組當(dāng)一個(gè)整體來進(jìn)行讀寫操作刨晴。數(shù)組可以以指針的形式訪問(a+i);也可以以下標(biāo)的形式訪問屉来,如:a[i]路翻。但其本質(zhì)都是a所代表的數(shù)組首元素的首地址加上 i*sizeof(類型)個(gè) byte 作為 數(shù)據(jù)的真正地址。
比如:
/*這種做法是錯(cuò)誤的茄靠,s作為右值時(shí)其意義與&s[0]是一樣茂契,代表的是數(shù)組首元素的首地址,
但s不能作為左值,我們只能訪問數(shù)組的某個(gè)元素而無法把數(shù)組當(dāng)一個(gè)總體進(jìn)行訪問慨绳。
所以a[i]當(dāng)成左值是沒問題的*/
char s[8];
s = "Good!";
//下面這種方法是對(duì)的掉冶,聲明了字符指針和一個(gè)匿名的字符串,s里面存的是一塊內(nèi)存的首地址
char *s;
s="good!";
//還有種寫法也是正確的
char s[8] = "Good!";
指針:
在 32 位系統(tǒng)下脐雪,不管什么樣的指針類型厌小,其大小都為 4byte≌角铮可以測試一下 sizeof(void *)
指針和數(shù)組:
#include "stdio.h"
int main(int argc, char const *argv[])
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1); //a表示的是數(shù)組的首地址
printf("%d,%d\n",*(a+1),*(ptr-1));
return 0;
}
上面代碼的結(jié)果是2璧亚,5,對(duì)指針進(jìn)行加 1 操作脂信,得到的是下一個(gè)元素的地址癣蟋,而不是原有地址值直接加1。
所以吉嚣,一個(gè)類型為 T 的指針的移動(dòng)梢薪,以 sizeof(T) 為移動(dòng)單位。
因此尝哆,對(duì)上題來說秉撇,a 是一個(gè)一維數(shù)組,數(shù)組中有 5 個(gè)元素; ptr 是一個(gè) int 型的指針秋泄。
&a + 1: 取數(shù)組 a 的首地址琐馆,該地址的值加上 sizeof(a) 的值,即 &a + 5*sizeof(int)恒序,也 就是下一個(gè)數(shù)組的首地址瘦麸,顯然當(dāng)前指針已經(jīng)越過了數(shù)組的界限。
(int *)(&a+1): 則是把上一步計(jì)算出來的地址歧胁,強(qiáng)制轉(zhuǎn)換為 int * 類型滋饲,賦值給 ptr。
注意
a喊巍、&a的區(qū)別:
a,&a的值是一樣的屠缭,但意思不一樣,a是數(shù)組首元素的首地址崭参,也就是a[0]的首地址呵曹,&a是數(shù)組的首地址。
同理:a+1 是數(shù)組下一元素的首地址,即 a[1]的首地址,&a+1 是下一 個(gè)數(shù)組的首地址
指針數(shù)組和數(shù)組指針:
指針數(shù)組:首先它是一個(gè)數(shù)組奄喂,數(shù)組的元素都是指針铐殃,數(shù)組占多少個(gè)字節(jié)由數(shù)組本身
決定。它是“儲(chǔ)存指針的數(shù)組”的簡稱跨新。
數(shù)組指針:首先它是一個(gè)指針富腊,它指向一個(gè)數(shù)組。在32位系統(tǒng)下永遠(yuǎn)是占4個(gè)字節(jié)玻蝌, 至于它指向的數(shù)組占多少字節(jié)蟹肘,不知道词疼。它是“指向數(shù)組的指針”的簡稱俯树。
下面到底哪個(gè)是數(shù)組指針,哪個(gè)是指針數(shù)組呢:
A)贰盗,int * p1[10];
B)许饿,int (p2)[10];
“[]”的優(yōu)先級(jí)比“”要高。p1 先與“[]”結(jié)合舵盈,構(gòu)成一個(gè)數(shù)組的定義陋率,int* 修飾的是數(shù)組的內(nèi)容,即數(shù)組的每個(gè)元素秽晚。那現(xiàn)在我們清楚瓦糟,這是一個(gè)數(shù)組,其包含10個(gè)指向int 類型數(shù)據(jù)的指針赴蝇,即指針數(shù)組菩浙。
在這里“()”的優(yōu)先級(jí)比“[]”高,“*”號(hào)和p2構(gòu)成一個(gè)指針的定義句伶,指針變量名為p2劲蜻,int 修飾的是數(shù)組的內(nèi)容,即數(shù)組的每個(gè)元素考余。數(shù)組在這里并沒有名字先嬉,是個(gè)匿名數(shù)組。那現(xiàn)在我們清楚p2是一個(gè)指針楚堤,它指向一個(gè)包含10個(gè)int類型數(shù)據(jù)的數(shù)組疫蔓,即數(shù)組指針。
#include "stdio.h"
int main(int argc, char const *argv[])
{
char a[5]={'A','B','C','D'};
char (*p)[5];
p = &a;
printf("%c,%c\n",*a,*(*p+1));//**p+1是錯(cuò)的
return 0;
}