新手在C語言的學習過程當中遇到的最頭疼的知識點應該就是指針了,指針在C語言中有很是大的用處。下面我就帶着問題來寫下我對於指針的一些理解。數組
指針是什麼? 函數
指針自己是一個變量,它存儲的是數據在內存中的地址而不是數據自己的值。它的定義以下: 學習
int a=10,*p; p=&a int a=10; int *p=&a;
首先咱們能夠理解 int* 這個是要定義一個指針p,而後由於這個指針存儲的是地址因此要對a取地址(&)將值賦給指針p,也就是說這個指針p指向a。spa
不少新手都會對這兩種定義方法感到迷惑,其實他倆的意思是同樣的。第一種定義方法定義了int型的變量a和指針p,而後將a的地址賦給p。第二種是在定義指針p的同時將a的地址賦給指針p。咱們姑且理解爲" int * "是定義指針的標誌。指針
指針有什麼用?code
這樣咱們就能夠經過*p來找到指針所指向的變量a的地址,而後對地址中的值(值是10)進行操做。blog
//接着上面的代碼 printf("%p",p) //結果是一個地址(p指向的變量a的地址)。 printf("%d",*p) //結果是10,變量a的值。 printf("%d",&p) //結果是一個地址(指針p的地址,由於指針也是一個變量本身也有地址的)
數組名和指針的區別?內存
數組名是一個地址,它能夠被理解爲一個常指針(它只能指向本數組首元素的地址)。而指針能夠指其餘的變量等等。class
int str[5]={1,2,3,4,5}; int *p=str; printf("%d",*p); //輸出爲1,數組的首元素。 printf("%d",*str); //輸出爲1,數組的首元素。 printf("%d",str[0]); //輸出爲1,數組的首元素。 printf("%p",p); //輸出爲地址,數組的地址。 printf("%p",str); //輸出爲地址,數組的地址。 printf("%d",*(p+1)); //輸出爲2,數組的第二個元素。 printf("%d",*(srt+1)); //輸出爲2,數組的第二個元素。
對照代碼你們能夠很清晰的看到數組名在對內存中存儲的數據進行操做的方法和結果是同樣,可是數組名存儲本身數組自己的首地址。變量
什麼是空指針,野指針?
在函數內部對指針進行賦值操做後,在函數執行完畢後,該指針就成了一個空指針(變量從棧中彈出)。可是經過動態地址分配(堆空間)的指針不會有上述問題。
free(p)後釋放內存的指針爲野指針。
關於const對於指針的限制問題
int a=10,b=20; int * const p=&a; //沒法使p指向其餘地址。 p=&b; //這樣的操做是不容許的。 *p=20; //能夠這樣操做。 const int * p=&a; //p能夠指向其餘地址。 p=&b; //能夠操做。 *p=10; //操做不被容許。 const int * const p=&a //p不能指向其餘地址,也不能改變地址中的值。 p=&b; //操做不被容許。 *p=20; //操做不被容許。
總結:const在int的左邊那就是不能修改地址中的值,在右邊就是不能指向其餘地址,左右都有那就是既不能修改地址的值也不能指向其餘地址。
新手常出現的問題我我的總結了上述幾點,若是有錯誤的地方但願你們留言交流互相學習。後面會寫下多維數組的存儲方式和指針的問題。