先看代碼:
#include<stdio.h>
int main(void){
int a = 5;
int b = 10;
int *c;
//輸出每個變量的地址
printf("a的地址是 %p\n",&a);
printf("b的地址是 %p\n",&b);
printf("c的地址是 %p\n",&c);
/*將a的地址賦予c*/
c = &a;//此處需用到 ”&“來得到a的地址
printf("c修改後的地址爲 %p\n",c);
/* 通過c輸出a的內容*/
printf("*c ---->%d\n",*c);
/* 通過c修改a的內容*/
*c = 10;
printf("a---->%d\n",a);
return 0;
}
然後我們看運行結果
我們首先聲明瞭int型變量 a,b 然後聲明瞭”指向int 的指針“類型的變量c
我們暫且先將c理解爲指向int 的指針
再看初始化完後內存中保存的樣子
在c語言中,會存在 int類型,double類型,等。。同樣,c語言中也存在指針類型這樣的類型。
指針類型並不是單獨存在的,而是由其他類型派生出來的。。
由引用類型T派生的指針類型有時候稱爲’(指向)T的指針‘
因爲指針類型是類型,所以他也像其他類型一樣,有“指針類型的值和指針類型變量”,但有時,我們將“指針類型”,“指針類型變量”,“指針類型的值”簡單統稱爲—指針
因此 c就是一個指針類型變量-----指向int的指針,但此時併爲對它賦值。
接下來我們將a的地址賦予了c,此時c的值就是a的地址
接下來:
在指針前面加*,可以表示指針指向的變量,因爲現在c指向a,所以c就等同於a。同理,修改c就相當於修改了a的值。
這是對後兩行輸出做的解釋
補充:
如果說c是 指向int的指針,但我們聲明變量時一般要遵循:
類型 變量名
因此,我們似乎聲明瞭一個名爲*c的變量。
所以我們可以寫成 int* c的形式。這樣更符合 類型 變量名 的形式。
但之後就會出現問題:
數組也是C語言的一種類型。。如果按上述所說的話。
C語言聲明數組時應該是:
int[] array;
很明顯,會報錯。這就產生了矛盾。。
反而,Java中可以這麼寫,但是Java爲了讓C程序員更好的轉向Java。也兼容了c語言定義數組的寫法。。
在這裏需要插一句:
C語言的語法本來就是不自然的,奇怪的而又變態的。
之後我會出一篇關於C語法的博客專門研究這“變態的”c語法。。。
歡迎吐槽評論