我想要一种语言,只需对它说我要干什么就行
C語言是20 世紀70 年代初期在貝爾實驗室開發出來的一種廣為使用的編程語言。指針是 C 語言最重要,也是最常被誤解的特性之一。讓我們一起了解一下指針的基礎知識吧。
>>>>
1.指針變量
理解指針的第一步是在機器級上觀察指針表示的內容。大多數現代計算機將內存分割為字節(byte),每個字節可以存儲8位的信息。
每個字節都有唯一的地址(address),用來和內存中的其他字節相區別。如果內存中有n個 字節,那么可以把地址看作0~n-1的數。
? 地址???內容
可執行程序由代碼(原始C程序中與語句對應的機器指令)和數據(原始程序中的變量)兩部分構成。程序中的每個變量占有一個或多個字節內存,把第一個字節的地址稱為變量的地址。下圖中,變量i占有地址為2000和2001的兩個字節,所以變量i的地址是2000:
這就是指針的出處。雖然用數表示地址,但是地址的取值范圍可能不同于整數的范圍,所以一定不能用普通整型變量存儲地址。但是,可以用特殊的指針變量(pointervariable)存儲地址。在用指針變量p存儲變量i的地址時,我們說p“指向”i。Q&A換句話說,指針就是地址,而指針變量就是存儲地址的變量。
這里不再把地址顯示為數,而是采用更加簡單的標記。為了說明指針變量p存儲變量i的地址,把p的內容顯示為指向i的箭頭:
指針變量的聲明
對指針變量的聲明與對普通變量的聲明基本一樣,唯一的不同就是必須在指針變量名字前放置星號:
int*p;
上述聲明說明p是指向int類型對象的指針變量。這里我們用術語對象來代替變量,是因為p可以指向不屬于變量的內存區域。
指針變量可以和其他變量一起出現在聲明中:
inti,j,a[10],b[20],*p,*q;
在這個例子中,i和j都是普通整型變量,a和b是整型數組,而p和q是指向整型對象的指針。
C語言要求每個指針變量只能指向一種特定類型(引用類型)的對象:
int*p;/*pointsonlytointegers*/double*q;/*pointsonlytodoubles*/char*r; ?/*pointsonlytocharacters*/
至于引用類型是什么類型則沒有限制。事實上,指針變量甚至可以指向另一個指針,即指向指針的指針。
?
?
2.取地址運算符和間接尋址運算符
為使用指針,C語言提供了一對特殊設計的運算符。為了找到變量的地址,可以使用&(取地址)運算符。如果x是變量,那么&x就是x在內存中的地址。為了獲得對指針所指向對象的訪問,可以使用*(間接尋址)運算符。如果p是指針,那么*p表示p當前指向的對象。
?
取地址運算符
聲明指針變量是為指針留出空間,但是并沒有把它指向對象:
int*p;??? /*pointsnowhereinparticular*/
在使用前初始化p是至關重要的。一種初始化指針變量的方法是使用&運算符把某個變量的地址賦給它,或者更常采用左值:
inti,*p;
...
p=&i;
通過把i的地址賦值給變量p的方法,上述語句把p指向了i:
?
?????????? ? ? ? ? ? ? ? ? ? ? ? ?
Q&A:在聲明指針變量的同時對它進行初始化是可行的:
inti;
int*p=&i;
甚至可以把i的聲明和p的聲明合并,但是需要首先聲明i:
inti,*p=&i;
間接尋址運算符
一旦指針變量指向了對象,就可以使用*運算符訪問存儲在對象中的內容。例如,如果p
指向i,那么可以顯示出i的值,如下所示:
printf("%d\n",*p);
Q&A printf函數將顯示i的值,而不是i的地址。習慣于數學思維的讀者可能希望把*想象成&的逆運算。對變量使用&運算符產生指向變量
的指針,而對指針使用*運算符則可以返回到原始變量:
j=*&i;???? /*sameasj=i;*/
只要p指向i,*p就是i的別名。*p不僅擁有和i相同的值,而且對*p的改變也會改變i的值。(*p是左值,所以對它賦值是合法的。)下面的例子說明了*p和i的等價關系,這些圖 顯示了在計算中不同的點上p和i的值。
p=&i;
?
i=1;
printf("%d\n",i); ->? /*prints1*
/printf("%d\n",*p); -> ?/*prints1*/
*p=2;
?
?
printf("%d\n",i);?->?/*prints2*
/printf("%d\n",*p);??->??/*prints2*/
?
注意
不要把間接尋址運算符用于未初始化的指針變量。如果指針變量p沒有初始化,那么試圖
使用p的值會導致未定義的行為:
int*p;
printf("%d",*p);/***WRONG***/?
給*p賦值尤其危險。如果p恰好具有有效的內存地址,下面的賦值會試圖修改存儲在該地址的數據:
int*p;
*p=1;/***WRONG***/?
如果上述賦值改變的內存單元屬于該程序,那么可能會導致出乎意料的行為;如果改變的內存單元屬于操作系統,那么很可能會導致系統崩潰。編譯器可能會給出警 告消息,告知p未初始化,所以請留意收到的警告消息。
?
3.指針賦值
C語言允許使用賦值運算符進行指針的復制,前提是兩個指針具有相同的類型。假設i、j、 p和q聲明如下:
inti,j,*p,*q;?
語句?
p=&i;
是指針賦值的示例,把i的地址復制給p。下面是另一個指針賦值的示例:?
q=p;?
這條語句是把p的內容(即i的地址)復制給q,效果是把q指向了p所指向的地方:
?
?
現在p和q都指向了i,所以可以用對*p或*q賦新值的方法來改變i:
*p=1;
?
*q=2;
?
?
任意數量的指針變量都可以指向同一個對象。注意不要把
q=p;
和
*q=*p;
搞混。第一條語句是指針賦值,而第二條語句不是。就如下面的例子顯示的:
p=&i;q=&j;i=1;
*q=*p;
賦值語句*q=*p;是把p指向的值(i的值)復制到q指向的對象(變量j)中。
?
推薦閱讀
《C語言程序設計:現代方法(第2版?修訂版)》
本書特色
?近30年來珍寶級C語言入門經典,累計印數10萬+,豆瓣評分9.3分
?? 哈佛、麻省理工、斯坦福等諸多名校C語言教材?
?? 基于C1X標準全新升級
內容簡介:
時至今日,C語言仍然是計算機領域的通用語言之一,但今天的C語言已經和最初的時候大不相同了。本書主要目的就是通過一種“現代方法”來介紹C語言,書中強調標準C,強調軟件工程,不再強調“手工優化”。第2版修訂版中不僅有C99中的新特性,還與時俱進地增加了C11和C18中的內容。本書分為C語言的基礎特性、C語言的高級特性、C語言標準庫和參考資料4個部分。每章末尾的“問與答”部分給出一系列與該章內容相關的問題及答案,此外還包含適量的習題。
***粉絲福利時間***
評論區留言,點贊數超過60即可
按照留言質量選擇前六可獲得此書!!!
以48個小時計!
注:若是在活動截止日期后24小時內無法取得用戶回復或聯系,將按照留言點贊排名順延
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的我想要一种语言,只需对它说我要干什么就行的全部內容,希望文章能夠幫你解決所遇到的問題。