C語言指標解說

來源:互聯網
上載者:User

標籤:說明符   height   分享   pre   track   限制   沒有   ott   個數   

指標是C語言的一種資料類型。類似於C中的其它類型,比如int ,char 等。既然指標是一種類型,當我們定義該類型變數。該類型變數就稱為指標變數。

C中有了指標就有了指向。

指向:指標變數指向本身儲存的內容(地址或指標)所表示的記憶體單元。

C語言指標是一個特殊的變數。其裡面儲存的數值被解釋成為記憶體裡的一個地址。

在電腦中,全部對資料的操作,都是通過其地址進行的。指標讓程式的效率更高,代碼更少。


在學習指標的時間,一定要理解並區分指標的四個感念:指標的類型,指標所指向的類型,指標的值,指標本身所佔領的記憶體區。

指標變數定義的一般形式:類型說明符*  變數名。

 類型說明符:表示該指標變數指向的變數的資料類型,而且該指標變數僅僅能指向該資料類型的變數。

這是指標變數的特徵。

*:表示該變數的指標變數。這也是指標變數的特徵。

變數名:表示指標變數的名稱。

比如:char  *pstu;      *表示pstu是一個指標變數。char是指標變數pstu指向的變數的資料類型。整個語句表示定義了一個指向char類型變數的指標變數。

但詳細pstu指向哪個char類型的變數,這就要看在使用pstu時。給pstu賦予的值。值是什麼就指向哪。

講指標不得不說的兩個運算子。

取地址運算子&和取值運算子*。通過取地址運算子&能夠獲得某個變數的地址,用取值運算子能夠獲得某個地址中存放的資料。

指標變數使用前,先定義,給指標初始化以後,也就是賦值以後才幹使用。在賦值時僅僅能賦相容類型的值。

比如:

#include <stdlib.h>
#include <stdio.h>


void main()
{
int name,stuName=1;
int *pStu; 
int *pNew;
pStu = &stuName;
pNew = pStu;
name = *pNew;
printf("%d\n%d\n%d\n%d\n\n",stuName,*pStu,name,*pNew);
printf("%d\n%d\n%d\n%d\n\n",&stuName,&pStu,&name,&pNew);
printf("%d\n%d\n",pStu,pNew);
}

從列印的值全然能夠理解記憶體中存放的是什麼。

簡單改動:

#include <stdlib.h>
#include <stdio.h>


void main()
{
int name,stuName=1;
int *pStu = NULL; 
int *pNew = NULL;
pStu = &stuName;
pNew = *(&pStu);
name = *pNew;
*pStu =100;

printf("%d\n%d\n%d\n%d\n\n",stuName,*pStu,name,*pNew);
printf("%d\n%d\n%d\n%d\n\n",&stuName,&pStu,&name,&pNew);
printf("%d\n%d\n",pStu,pNew);
}


指標與整數的加法。主要用於數組中。

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

int *pNew = arr;

pNew++;

pNew = pNew + 2;

數組名就是第一個數組元素的地址。 int *pNew = & arr[0];

pNew = pNew + 7; pNew的指向已經越界,詳細指向不知道,可能是已存在的地址或未知地址。在使用值是會發生未知的錯誤。

在使用指標操作時。一定要注意是否超出了數組的大小。


聲明一個指標。指標變數是變數。

數組指標:和指標變數使用方法基本一樣。

指標數組:一系列指向同一資料類型的指標變數的集合,稱為指標數組。指標數組的全部元素都是指標變數。它們必須具有同樣的儲存類型,必須指向同樣的資料類型。

類型說明符  *數組名[數組長度];

比如:int   *arr[5];

char *str[] = {"Chain","Beijing","LongMai"};

—)常量指標(指向能夠改動,指向相應的值不能夠改動)

常量是形容詞,指標是名詞,以指標為中心的一個偏正結構短語。這樣看,常量指標本質是指標,常量修飾它。表示這個指標乃是一個指向常量的指標(變數)。

指標指向的對象是常量。那麼這個對象不能被更改。

在C/C++中。常量指標是這樣聲明的:

1)const int *p;

2)int const *p;

常量指標的使用要注意,指標指向的對象不能通過這個指標來改動。但是仍然能夠通過原來的聲明改動。也就是說常量指標能夠被賦值為變數的地址,之所以叫做常量指標,是限制了通過這個指標改動變數的值。

比如:

int a = 5,b=6;

 const int *c = &a; // 這是合法的,非法的是對c的使用

c = &b;   //合法

*c = 6; // 非法,但能夠這樣改動c指向的對象的值:a = 6;

const int *d = &b; // b是常量。d能夠指向b,d被賦值為b的地址是合法的

二) 指標常量(指向不能夠改動。指向相應的值能夠改動)

指標是形容詞,常量是名詞。

這回是以常量為中心的一個偏正結構短語。那麼,指標常量的本質是一個常量,而用指標修飾它,那麼說明這個常量的值應該是一個指標。

指標常量的值是指標,這個值由於是常量,所以不能被賦值。

在C/C++中,指標常量這樣聲明:

int a;

int *const b = &a; //const放在指標聲明操作符的右側

僅僅要const位於指標聲明操作符右側,就表明聲明的對象是一個常量。且它的內容是一個指標,也就是一個地址。上面的聲明能夠這麼讀。聲明了一個常量b,它的值是變數a的地址(變數a的地址,不就是指向變數a的指標嗎)。

由於指標常量是一個常量。在聲明的時候一定要給它賦初始值。一旦賦值。以後這個常量再也不能指向別的地址。

儘管指標常量的值不能變,但是它指向的對象是可變的,由於我們並沒有限制它指向的對象是常量。

因此,有這麼段程式:

char *a = "abcde1234";

char *b = "bcde";

char *const c = &a;

  以下的操作是能夠的。

  a[0] = ‘x‘; // 我們並沒有限制a為常量指標(指向常量的指標)

或者

*c[0] = ‘x‘ // 與上面的操作一致

三)指向常量的指標常量(指向不能夠改動,指向相應的值也不能夠改動)

顧名思議,指向常量的指標常量就是一個常量,且它指向的對象也是一個常量。

由於是一個指標常量,那麼它指向的對象當然是一個指標對象。而它又指向常量。說明它指向的對象不能變化。

在C/C++中,這麼聲明:

  const int a = 25;

const int * const b = &a;


函數指標:函數指標是指向函數的指標變數。即本質是一個指標變數

資料類型(*變數名)();

int (*f) (int x); /* 聲明一個函數指標 */

 f=func; /* 將func函數的首地址賦給指標f */

指標函數:指標函數是指帶指標的函數,即本質是一個函數。函數傳回型別是某一類型的指標。

以上不過指標的簡介。

有關指標的複雜使用方法,以後再說。

。。

C語言指標解說

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.