問題:
a+1的意義是什麼?結果是什麼?
指標運算的意義是什麼?結果是什麼?
程式設計分析 a+1 示例
#include int main()
; int* p = null;
printf("a = 0x%x\n", (unsigned int)(a));
printf("a + 1 = 0x%x\n", (unsigned int)(a + 1));
// 陣列名看著常量指標的話,這裡其實也是指標的運算
printf("p = 0x%x\n", (unsigned int)(p));
printf("p + 1 = 0x%x\n", (unsigned int)(p + 1));
return 0;
}
執行結果
a = 0xffffaca0
a + 1 = 0xffffaca4
p = 0x0
p + 1 = 0x4
使用指標運算分析運算結果
p + n >>> (unsingned int)p + n*sizeof(*p);
int* p = null;
p+1 >>> 0 + 1*sizeif(*p) >>> 0 + 1*sizeof(int) >>> 0 + 4 >>> 4;
a = 0xbfa00f38;
a + 1 >>> 0xffffaca0+ 1*sizeof(*a) >>> 0xffffaca0+ 1*sizeof(a[0])
>>> 0xffffaca0+ 1*4 >>> 0xffffaca0+ 4 = 0xffffaca4
p+n >>> (unsigned int )p + n*sizeof(*p)
p1 - p2 <-->( (unsigned int)p1 - (unsigned int)p2) / sizeof(type);
注意:
只有當兩個指標指向同乙個陣列中的元素時,指標想減才有意義,其意義為指標所指元素的下標差
當兩個指標指向的元素不在同乙個陣列中時,結果未定義
指標運用初探示例
#include int main()
; int i = 0;
char s2 = ;
char* p0 = s1;
char* p1 = &s1[3];
char* p2 = s2;
int* p = &i;
printf("%d\n", p1 - p0);
printf("%d\n", p0 + p2); // error
printf("%d\n", p0 - p2); // 結果未定義
printf("%d\n", p0 - p); // error
printf("%d\n", p0 * p2); // error
printf("%d\n", p0 / p2); // error
return 0;
}
輸出結果:
3
-16
分析:
p0 和 p2 指向的是不同的陣列,相互相減, 結果未定義。語法是合格的,但是結果是多少沒法分析!
指標運算運用
#include #define dim(a) (sizeof(a) / sizeof(*a))
int main()
; char* pbegin = s;
char* pend = s + dim(s); // key point
// pend指向陣列靠外的虛擬位址(擦邊球)
char* p = null;
printf("pbegin = %p\n", pbegin);
printf("pend = %p\n", pend);
printf("size: %d\n", pend - pbegin);
for(p=pbegin; p運算結果:
pbegin = 0x7ffbffffacb0
pend = 0x7ffbffffacb5
size: 5
hello
分析:
pend 指標指向陣列最後一位的資料的後一位的邊界位置,我們可以認為這個指標是合法的,可以進行指標的比較運算,減法運算等。這乙個特性很重要。
小貼士:
宣告不同型別的指標的作用:規定指標在記憶體中每次移動的位元組數。
不同型別的指標的作用是指標在記憶體中每次移動的位元組數不同
26 指標和陣列分析(上)
1 陣列的本質 提出問題 假設a是乙個陣列,a 1 假設a是乙個指標,a 1 指標運算的意義是什麼?結果又是什麼?指標 n 的本質就是指標所指向的位址 指向資料的型別佔的記憶體大小 n include int main int p null printf a 0x x n unsigned int ...
29 指標和陣列分析(下)
注 部落格中內容主要來自 狄泰軟體學院 部落格僅當私人筆記使用。測試環境 ubuntu 10.10 gcc版本 4.4.5 一 問題 陣列名可以當做指標常量使用,那麼指標是否也可以當做陣列名來使用呢?二 陣列的訪問方式 1 以下標的形式訪問陣列中的元素 int main a 1 3 a 2 5 re...
複習c語言深度剖析 28 指標和陣列分析(上)
陣列的本質 陣列是一段連續的記憶體空間 陣列的空間大小為sizeof array type array size 陣列名可看做指向陣列第乙個元素的指標常量。問題 a 1的意義是什麼?結果是什麼?指標運算的意義是什麼?結果是什麼?include int main int p null printf a...