陣列的本質
陣列是一段連續的記憶體空間;
陣列的空間大小為sizeof(array_type)*array_size;
陣列名可看做指向陣列第乙個元素的指標常量。
問題: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));
}
執行結果:
%p是列印位址的,%x是以十六進製制形式列印,完全不同!另外在64位下結果會不一樣(%x在64位系統輸出還是32位的)。
2. 指標的運算
指標是一種特殊的變數,與整數的運算規則為 :
p + n; — (unsigned int)p + n * sizeof( *p );
結論:當指標p指向—個同型別的陣列的元素時: p+1 將指向當前元素的下—個元素;p -1將指向當前元素的上—個元素。
指標之間只支援減法運算 , 參與減法運算的指標型別必須相同,運算規則為 : 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", p0 - p1);
//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.程式設計實驗
指標運算的運用
#include
#define dim(a) (sizeof(a) / sizeof(*a))
int main()
;char *pbegin = s;
char *pend = s + dim(s); // key point
char *p = null;
printf("pbegin = %p\n", pbegin);
printf("pend = %p\n", pend);
printf("size: %d\n", pend - pbegin);
for (p = pbegin; p < pend; p++)
printf("\n");
return 0;
}
執行結果:
4.小結
《c語言深度剖析》讀書筆記(四)指標和陣列
本文是自己讀書的時候一些關於該書的重點及感悟 目錄 1 指標 2 陣列 3 指標和陣列的關係 4 指標陣列和陣列指標 5 多維資料和多維指標 6 陣列引數和指標引數 7 函式指標 1 指標,即存放記憶體位址的變數,長度固定,32位系統中長度為4,說白了就是定址位數。當然,指標是變數,那麼免不了被訪問...
C 28 指標和陣列分析
問題 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 陣列名看著常...
C語言複習(三) 指標(一)
指標在c語言中是比較重要的,個人認為,c語言中最重要的是記憶體,如何操作記憶體是至關重要的,指標是c語言的精華,學好了指標才可以說c語言入了門。接下來認真總結一下c語言中指標的用法。資料型別的本質是固定大小記憶體塊的別名,指標毫無例外,指標也是占有記憶體空間的,在32位機器中,指標是佔4個位元組的,...