--事物的難度遠遠低於對事物的恐懼!
這章我們來分析下指標和陣列,在前兩章我們談了陣列和指標,我們知道:
陣列的本質:
-陣列是一段連續的記憶體空間
-陣列的空間大小為sizeof(array_type) *
array_size
-陣列名可看做指向陣列第乙個元素的常量指標
那麼我們來看乙個問題:對於乙個陣列 int array,array + 1是什麼?這個運算的意義代表什麼?
下邊以**來展示一下
#include int main()
; int i=0;
for(i=0; i<5; i++)
printf("**************\n");
printf("array + 1 = 0x%p\n*(array + 1) = %d\n", array + 1, *(array + 1));
return 0;
}
編譯執行的結果如下:
從輸出結果來看,我們可以知道array + 1 == &array[1],*(array + 1) == array[1]。
為了弄清楚上邊的兩個等式,我們首先來了解下指標的運算:
-c語言中的指標是一種特殊的變數,它與整數的運算規則為:
p+n->(unsigned int)p + n*sizeo(*p)
-同理可引申出:p + i將指向當前元素之後的第i個元素;p - 將指向當前元素之前的第i個元素
所以對於以上**中的array + 1,array是陣列首元素的位址,那麼 array + 1則指向了陣列首元素的下乙個元素,就是array[1],所以就有了array + 1 == &array[1],*(
array + 1) == array[1],同理可以推導:array + i == &array[i],*(
array + i) == array[i](i為陣列下標)
上邊我們只說了指標與整數之間的運算,那麼指標和指標之間可不可以進行運算?在c語言中
-指標與指標之間只支援減法運算
-參與減法運算的指標型別必須相同
p1 - p2 -> ((unsigned int)p1-(unsigned int)p2) /sizeof(type)
其中需要注意的是:
-只有當兩個指標指向同乙個陣列中的元素時,指標相減才有意義,其意義為指標所指元素的下標差
-當兩個指標指向的元素不在同乙個陣列中時,結果未定義
指標的比較運算:
-指標也可以進行關係運算( , >=)
-指標關係運算的前提是同時指向同乙個陣列中的元素
-任意兩個指標之間的比較運算(==, !=)無限制,而這樣的比較運算也沒什麼實際意義
-參與比較運算的指標型別必須相同
總結:
-陣列宣告時編譯器自動分配一片連續的記憶體空間
-指標宣告時只分配了用於容納位址值的4位元組 空間
-指標和整數可以進行運算,運算
結果為指標
-指標之間只支援減法運算,其
結果為陣列元素下標差
-指標之間支援比較運算,同時指標
型別必須相同
C語言中指標和陣列分析 下
事物的難度遠遠低於對事物的恐懼!陣列名可以當做常量指標使用,那指標是否也可以當做陣列名來使用呢?為了說明這個問題,我們先來看看陣列的兩種訪問方式,對於陣列int array 5 訪問方式有 下標形式 array 1 2 指標形式 array 1 2 兩種訪問方式的比較 指標以固定增量在陣列中移動是,...
C語言中指標和陣列
首先,明確乙個概念,指標是什麼,一旦提到這個老生常談且富有爭議性的話題,那真是1000個人有1000種看法。在國內的很多教材中,給出的定義一般就是 指標就是位址 從初步理解指標的角度來說,這種說法是最容易理解的,但是這種說法明顯有它的缺陷所在。指標就是位址 這種說法相當於 指標 字面值位址 或者說乙...
指標和陣列分析(上)
陣列是一段連續的記憶體空間 陣列的空間大小為sizeof arrary type arrary size 陣列名可看做指向陣列第乙個元素的常量指標 a 1的意義是什麼?結果是什麼?指標運算的意義是什麼?結果又是什麼?1 include 2 intmain 3 5int p null 6 printf...