C語言中的指標加減偏移量
原文地址:http://blog.csdn.net/dobest9014/article/details/5369728
首先看一段程式:
- #include <stdio.h>
- int main()
- {
- int a[5] = {1, 2, 3, 4, 5};
- int* p = (int*)(&a + 1);
- printf("%d, %d /n", *(a + 1), *(p - 1));
- return 0;
- }
輸出結果為:
2, 5
#include <stdio.h>
int main()
{
int a[5] = {1, 2, 3, 4, 5};
int* p = (int*)(a + 1);
printf("%d, %d /n", *(a + 1), *(p - 1));
return 0;
}
第一個結果好說,a+1後指標指向了陣列中的‘2’。 而第二個為什麼輸出‘5’呢。 原理是c語言中的指標加減後,會根據指標的型別採用不同的偏移量。
比如, int* a; int* b = a+1; 則 b - a = sizeof(int)
char* a; char* b = a+1; 則b - a = sizeof (char)
將上述程式改寫如下,更容易認識其本質
- int main()
- {
- int a[5] = {1, 2, 3, 4, 5};
- int (*ptr)[5] = &a + 1;
- //int* p = (int*)(&a + 1);
- int* p = (int*)ptr;
- printf("%d, %d /n", *(a + 1), *(p - 1));
- return 0;
- }
其中只是引入了一箇中間變數 ptr指標, ptr指標的型別是 指向陣列長度為5的指標, 所以 ptr + 1 其實是加了sizeof(a)的位元組量,
ptr+1後指向了從a後面,即a開始數第6個位元組。
注意指向陣列指標的寫法。括號不能丟。
int a[n], 則a是一個陣列型別,而不是int型了,要注意正確對待。
a與&a的值一樣,但意義不一樣, a+1的偏移量為一個int,相當於&a[0], &a+1的偏移量為真個陣列。是陣列型別的指標。
相關文章
- 你正真瞭解C語言中的指標嗎C語言指標
- C 語言中的指標和記憶體洩漏指標記憶體
- C++語言中陣列指標和指標陣列徹底分析(系列一) (轉)C++陣列指標
- 補充內容:C++語言中陣列指標和指標陣列徹底分析 (轉)C++陣列指標
- c語言中通過函式指標實現函式過載C語言函式指標
- C語言(指標)C語言指標
- C語言指標C語言指標
- C語言:指標,C的靈魂C語言指標
- C語言 C語言野指標C語言指標
- C語言指標(三):陣列指標和字串指標C語言指標陣列字串
- C語言-指標操作C語言指標
- C語言指標(二) 指標變數 ----by xhxhC語言指標變數
- 指標——C語言的靈魂指標C語言
- C語言知識彙總 | 51-C語言字串指標(指向字串的指標)C語言字串指標
- C語言中的#和##C語言
- C語言指標安全及指標使用問題C語言指標
- c語言指標彙總C語言指標
- C語言指標學習C語言指標
- c語言指標詳解C語言指標
- C語言之字串與指標C語言字串指標
- C語言基礎-指標C語言指標
- C語言 函式指標C語言函式指標
- C語言指標筆記C語言指標筆記
- Swift中使用C語言的指標SwiftC語言指標
- 走下“神壇”的C語言指標C語言指標
- c語言中的&的用法C語言
- C語言中的標頭檔案中的巨集定義C語言
- C語言中sync()C語言
- C語言中有C語言
- 解析C語言中的sizeofC語言
- C語言中extern的用法C語言
- C語言中&&,||,&,| 的區別C語言
- c語言中的作用域C語言
- 搞清楚C語言指標C語言指標
- C語言 指標與陣列C語言指標陣列
- C語言指標基本知識C語言指標
- C語言指標詳解(一)C語言指標
- C語言指標詳解(二)C語言指標