天天看點

c語言中指針用法初級,C語言中指針的用法

#include

void main( void )

{

int a[5]={1,2,3,4,5};

int *ptr=(int *)(&a+1);

printf("%d,%d",*(a+1),*(ptr-1));

return;

}

代碼的輸出是: 2, 5

這是C語言裡一個比較容易搞混的地方,很多人直接把數組名當成數組第一個元素的位址,其實兩者間有一點差異的。大多情況下,數組名确實可以當做數組第一個元素的位址,但這隻是因為當數組名在表達式中使用時,被轉換成了第一個元素的位址。

我記得沒錯的話,在兩種情況下,資料名必須被當成具有數組類型的變量: 一個是對數組取位址得到的是指向一個數組的指針,第二是 sizeof(a) 的得到的是數組所占的位元組數。

是以對于(&a + 1), &a得到的是數組指針,數組指針加一就等于 (char*)&a + sizeof(a), 得到的的是一個緊靠數組後的一個位址,然後對這個位址進行類型轉換成int 的指針,對這個指針加一就得數組最後一個元素的位址。

正是因為數組這種特點,比較好的做法是用 &a[0] 來表示數組第一個元素的位址。

其實函數名和數組一樣具有這種特點,例如對于函數 void func(), 一般情況下 &func 和 func 是可以互用的。

記住: 取位址符  &  ,是把符号後面元素的整個對象作為一個整體, 深刻了解  &a[0]  與 &a

#include

int main()

{

int a[5]={1,2,3,4,5};

int *ptr= (int *)(int *)(&a);

int *ptr2 = a;          //數組a的首個元素的位址,相當于 &a[0]--->把單個元素作為對象

int *ptr3 = (int *)&a;  //數組a的指針,把整個數組a作為對象, (int *)(&a+1)代表把整個數組作為對象,指針向後移動,代表的是a[5]的位址

printf("*ptr=%d  *ptr2=%d   ptr3=%d\n",*ptr,*ptr2,*ptr3);

}

輸出最終結果是一樣的!