C 28 指標和陣列分析

2021-10-01 04:26:47 字數 2444 閱讀 1140

問題:

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...