新手在c語言的學習過程中遇到的最頭疼的知識點應該就是指標了,指標在c語言中有非常大的用處。下面我就帶著問題來寫下我對於指標的一些理解。
指標是什麼?
指標本身是乙個變數,它儲存的是資料在記憶體中的位址而不是資料本身的值。它的定義如下:
int a=10,*p;p=&a
int a=10;
int *p=&a;
首先我們可以理解 int*這個是要定義乙個指標p,然後因為這個指標儲存的是位址所以要對a取位址(&)將值賦給指標p,也就是說這個指標p指向a。
很多新手都會對這兩種定義方法感到迷惑,其實他倆的意思是一樣的。第一種定義方法定義了int型的變數a和指標p,然後將a的位址賦給p。第二種是在定義指標p的同時將a的位址賦給指標p。我們姑且理解為" int * "是定義指標的標誌。
指標有什麼用?
這樣我們就可以通過*p來找到指標所指向的變數a的位址,然後對位址中的值(值是10)進行操作。
//接著上面的**
printf("%p
",p) //
結果是乙個位址(p指向的變數a的位址)。
printf("
%d",*p) //
結果是10,變數a的值。
printf("
%d",&p) //
結果是乙個位址(指標p的位址,因為指標也是乙個變數自己也有位址的)
陣列名和指標的區別?
陣列名是乙個位址,它可以被理解為乙個常指標(它只能指向本陣列首元素的位址)。而指標可以指其他的變數等等。
int str[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的左邊那就是不能修改位址中的值,在右邊就是不能指向其他位址,左右都有那就是既不能修改位址的值也不能指向其他位址。
C語言 指標理解
剛剛程式設計遇到了乙個問題,如下 include struct nodetree 101 int loc node creat bool build node t,char c return true intmain return0 預期結果,我本來想達到一種效果,就是將t傳進去,然後對t做修改,返...
C語言複雜指標理解
學習和使用c語言近十年了但對c語言的複雜指標依然有些迷糊索性花點時間分析一下,下面是一些心得,希望對讀者有所幫助 取the c programming language中的兩個例子以分析 char x char x 3 5 若直接讓我們說出這兩個x分別是什麼意思往往會有一些困難,這裡我們可以使用代入...
C語言指標的理解
什麼是指標?指標也是一種變數,存放的是某塊記憶體的位址。我們知道,記憶體可以理解為是按位元組被分割成若干塊的,每一位元組都對應著乙個編號,並且這些編號從小到大依次排列,這個編號就是它的位址,獨一無二,而指標變數中的值就是這些編號 例如如下 的結果 include include int main 這...