天天看點

C語言指針解說

指針是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);

}

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

簡單改動:

int *pstu = null; 

int *pnew = null;

pnew = *(&pstu);

*pstu =100;

指針與整數的加法。主要用于數組中。

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 */

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

以上不過指針的簡介。

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

。。

繼續閱讀