快速理解C語言指標

2022-05-14 22:42:10 字數 2222 閱讀 5719

新手在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 這...