指標以更接近機器的方式表示位址,所以會更有效率
首先是指標的概念:
int* p; //定義乙個指向int的指標
int n = 3;
p = &n; //賦值
printf("p=%x\n&p=%x\n*p=%d\n&n=%x\nn=%d",p,&p,*p,&n,n );
p=eff7ac //指標的值是所指向物件的位址
&p=eff7b8 //指標本身的位址
*p=3
//指向物件的值
&n=eff7ac //物件的位址
n=3//物件的值
陣列的指標表示法:更接近機器表示
int
s[4] = ;
printf("s[2]=%d\n*(s+2)=%d\n&s[2]=%x\ns+2=%x",
s[2], *(
s + 2), &s[2], s + 2);
s[2]=1
//陣列表示法
*(s+2)=1
//注意*(s+2)和*s+2的區別,且只有s是指標變數才有s++這樣的表示式
&s[2]=d5fcd8
s+2=d5fcd8
陣列可以用指標表示,但不代表陣列名就是指標,指標可以代表陣列名,例如:
int
s[4] = ;
int* p = s;
printf("size of s:%d\n",sizeof(s));
printf("size of p:%d", sizeof(p));
p並不是陣列本身,而是指向s陣列的指標
size of s:16
size of p:4
注意:
int
s[4] = ;
int* p = s;
printf("%d", *p++);
12
//*和++優先順序相同,但是結合律從右往左,所以先求p++,但是這個操作要到printf("%d",
*p++);整條語句結束才會生效,所以*p的值依舊是12,
再看乙個:
int
s[4] = ;
int* p = s;
printf("%d
%d", *p++, *++p);
51
printf("%d
%d", *++p,*p++);
112
我用的是vs2017,不同系統可能會有所不同吧
從這兩個語句大概猜出了printf函式的工作原理:應該是乙個棧,從右到左入棧,期間計算p,
再出棧輸出,這樣就能解釋的通了,這種語句以後還是少寫
指標與多維陣列
int
s[4][2] = ,,, };
printf("%p
%p%p
%p", s,s[0],*s,&s[0][0]);
004ff7f8 004ff7f8 004ff7f8 004ff7f8
之前說過s是陣列首元素的位址,s的首元素是乙個內含2個int的子陣列,s[0]是乙個占用乙個
int大小物件的位址,由於陣列都開始與用乙個位址,即s[0]和s的值相同
*s就就表示陣列首元素的值(s[0]),s[0]本身就是int型別值的位址,該值位址就是&s[0][0]
再看乙個例子:
int s[4][2] = ,,, };
printf("%d", *(*(s + 2) + 1));
8
其實&和*就像是**服和穿衣服似的關係 指標與陣列,指標陣列 陣列指標
int a 10 print n a p,a p a,a print n a 1 p,a 1 p a 1,a 1 a做乙個指標,步長為4,指向乙個元素,a做乙個指標,步長為40,指向乙個維陣列 int b 3 4 print n b p,b p,b p b,b,b print n b 1 p,b 1...
指標陣列與陣列指標
1.指標陣列 指標陣列中每乙個元素都是乙個指標,也既是存放字串的首位址。所以指標陣列適合處理若干個長度不等的字串。定義的一般形式為 型別說明符 指標陣列名 陣列長度 例如 int p 3 宣告乙個陣列,指標陣列p,由3個int型別指標變數元素組成 從運算子的優先順序分析,由於 的優先順序大於 所以p...
指標陣列與陣列指標
呵呵,實在是厭倦了繞口的解釋。指標陣列,故名思義,就是指標的陣列,陣列的元素是指標 陣列指標,同樣,就是直想陣列的指標。簡單舉例說明 int p 2 首先宣告了乙個陣列,陣列的元素是int型的指標。int p 2 宣告了乙個指標,指向了乙個有兩個int元素的陣列。其實這兩種寫法主要是因為運算子的優先...