程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言指針講解

C語言指針講解

編輯:關於C語言

指針是C語言的一種數據類型,類似於C中的其他類型,例如int ,char 等。既然指針是一種類型,當我們定義該類型變量,該類型變量就稱為指針變量。

C中有了指針就有了指向。指向:指針變量指向本身保存的內容(地址或指針)所表示的內存單元。

C語言指針是一個特殊的變量,其裡面儲存的數值被解釋成為內存裡的一個地址。

在計算機中,所有對數據的操作,都是通過其地址進行的,指針讓程序的效率更高,代碼更少。

在學習指針的時間,一定要理解並區分指針的四個感念:指針的類型,指針所指向的類型,指針的值,指針本身所占據的內存區。

指針變量定義的一般形式:類型說明符* 變量名。 類型說明符:表示該指針變量指向的變量的數據類型,並且該指針變量只能指向該數據類型的變量。這是指針變量的特征。

*:表示該變量的指針變量。這也是指針變量的特征。

變量名:表示指針變量的名稱。

例如:char *pstu; *表示pstu是一個指針變量,char是指針變量pstu指向的變量的數據類型。整個語句表示定義了一個指向char類型變量的指針變量。但具體pstu指向哪個char類型的變量,這就要看在使用pstu時,給pstu賦予的值,值是什麼就指向哪。

講指針不得不說的兩個運算符。取地址運算符&和取值運算符*。通過取地址運算符&可以獲得某個變量的地址,用取值運算符可以獲得某個地址中存放的數據。

指針變量使用前,先定義,給指針初始化以後,也就是賦值以後才能使用。在賦值時只能賦兼容類型的值。

例如:

#include
#include


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
#include


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};<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+aW50ICpwTmV3ID0gYXJyOzwvcD4KPHA+cE5ldyYjNDM7JiM0Mzs7PC9wPgo8cD5wTmV3ID0gcE5ldyAmIzQzOyAyOzwvcD4KPHA+yv3X6cP7vs3Kx7Xa0ru49sr91+nUqsvYtcS12Na3oaMgaW50ICpwTmV3ID0gJmFtcDsgYXJyWzBdOzwvcD4KPHA+cE5ldyA9IHBOZXcgJiM0MzsgNzsgcE5ld7XE1rjP8tLRvq3Uvb3no6y+38zl1rjP8rK71qq1wKOsv8nE3MrH0tG05tTatcS12Na3u/LOtNaqtdjWt6Os1NrKudPDJiMyMDU0MDvKx7vht6LJ+s601qq1xLTtzvOho9TayrnTw9a41euy2df3yrGjrNK7tqjSqtei0uLKx7fxs6yz9sHLyv3X6bXEtPPQoaGjPGJyPgo8L3A+CjxwPsn5w/fSu7j21rjV66Gj1rjV67Hkwb/Kx7Hkwb+hozwvcD4KPHA+yv3X6da41eujurrN1rjV67Hkwb/Tw7eou/mxvtK70fmhozwvcD4KPHA+1rjV68r91+mjutK7z7XB0Na4z/LNrNK7yv2+3cDg0M21xNa41eux5MG/tcS8r7rPo6yzxs6q1rjV68r91+mho9a41evK/dfptcTL+dPQ1KrL2La8ysfWuNXrseTBv6Gjy/zDx7HY0Ou+39PQz+DNrLXEtKK05sDg0M2jrLHY0OvWuM/yz+DNrLXEyv2+3cDg0M2hozwvcD4KPHA+wODQzcu1w/e3+yAgKsr91+nD+1vK/dfps6S2yF07PC9wPgo8cD7A/cjno7ppbnQgICAqYXJyWzVdOzwvcD4KPHA+Y2hhciAqc3RyW10gPSB7"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 */

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

以上僅僅是指針的簡單介紹。有關指針的復雜用法,以後再說。。。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved