C語言/C++編程學習:四種類型指針

C語言是面向過程的,而C++是面向對象的

C和C++的區(qū)別:

C是一個結構化語言,它的重點在于算法和數(shù)據(jù)結構。C程序的設計首要考慮的是如何通過一個過程,對輸入(或環(huán)境條件)進行運算處理得到輸出(或實現(xiàn)過程(事務)控制)。

C++,首要考慮的是如何構造一個對象模型,讓這個模型能夠契合與之對應的問題域,這樣就可以通過獲取對象的狀態(tài)信息得到輸出或實現(xiàn)過程(事務)控制。 所以C與C++的最大區(qū)別在于它們的用于解決問題的思想方法不一樣。之所以說C++比C更先進,是因為“ 設計這個概念已經(jīng)被融入到C++之中 ”。

C與C++的最大區(qū)別:在于它們的用于解決問題的思想方法不一樣。之所以說C++比C更先進,是因為“ 設計這個概念已經(jīng)被融入到C++之中 ”,而就語言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,錯!算法是程序設計的基礎,好的設計如果沒有好的算法,一樣不行。而且,“C加上好的設計”也能寫出非常好的東西。

很多小伙伴都老是會碰到疑問,其實還是基礎沒打扎實,這些題如果你不看答案你能知道多少呢?如果還有很多不知道就證明基礎沒打扎實,如果你還在入門糾結,如果你還在苦惱怎么入門!小編推薦一個學C語言/C++的學習裙【 六九九,四七零,五九六 】,無論你是大牛還是小白,是想轉行還是想入行都可以來了解一起進步一起學習!裙內有開發(fā)工具,很多干貨和技術資料分享!

我們前面學了六種基本數(shù)據(jù)類型,后面還要學習其他類型,所有的類型都能派生出相應的指針,只需要在定義的時候加星號*就可以了,而且int* i和int *i是完全相同的,我們前面講到const的時候說了,用它修飾的數(shù)據(jù)是無法改變的,由const就引出了四種指針,這也是公司招聘最喜歡出的題目之一。

const int *p1;

int const *p2;

int* const p3;

const int* const p4;

這四種類型,p1和p2是相同的,因為const放在數(shù)據(jù)類型的前面還是后面是無關緊要的,它們代表的是指向常量的指針變量,意思就是指針自身可以改變,它們可以指向其他地址,但是它們指向地址中的數(shù)據(jù)是不能改變的;p3代表常量指針,意思是指針自身不能改變,但是它們指向地址中的數(shù)據(jù)是可變的;p4是指向常量的常量指針,指針自身和指向地址的內容均不可改變,當然它和int const* const p4這種形式也是相同的。下面我們看一個程序:

其中錯誤示范和相關說明已經(jīng)用注釋的方式寫明了,自己可以試試把注釋里的錯誤示范添加進來,看看編譯器下方的報錯情況。

這個不是去背的,是要理解,有個最簡單的原則就是就近原則,const和數(shù)據(jù)類型(這里舉的例子是int)誰前誰后不要緊,關鍵是const和*哪個里指針變量近,如果是const離的近,那么表示指針p本身不變的值,但是*p是可變的;如果*離的近,那么表示*p是不變的(也就是const),p本身的值使可變的

接下來我們看多重指針變量,我們知道普通的指針變量里面存放的是指針(也即地址),然后地址里面存放的是數(shù)據(jù),多重指針我們拿最簡單的二重指針為例(當然也有三重指針、四重指針......但是那樣難度會越來越大),我們的二重指針變量里面存放的是普通指針變量,普通指針變量里面存放的是地址,地址里才是最后的數(shù)據(jù)。我們還是以程序為例來講解:

可以看到,變量num提供了兩個信息量,它的地址是0022FF44,num里存放的數(shù)據(jù)是10,;普通指針變量ptr1可以提供三個信息量,ptr1指向地址中存放的值(即num)為10,ptr1本身的值(即&num)為0022FF44,還有ptr1自身的地址是0022FF40;二重指針變量ptr2提供了四個信息量,ptr2指向的不是普通地址而是指針變量ptr1。我們可以看到所能代表的信息量比普通指針要大,但是也比普通指針要難理解,所以我建議是指針層數(shù)不要超過3層,不然會變得相當難理解,我在下面畫了個圖供大家理解:

小編推薦一個學C語言/C++的學習裙【 六九九,四七零,五九六 】,無論你是大牛還是小白,是想轉行還是想入行都可以來了解一起進步一起學習!裙內有開發(fā)工具,很多干貨和技術資料分享!

注意其中的%d是打印十進制,%p是打印十六進制,關于進制:

十進制是我們人類世界最普遍的進制,但是在計算機里面,它只能識別0、1,所以最常用的就是2的N次方進制,這樣表示起來比較方便,比如二進制、八進制、十六進制。

十六進制:以16為基底,十六進制的數(shù)字等價于十進制的0~15,表示方式是0~9和A~F(或a~f)。因為我們需要一種方式區(qū)分十進制和十六進制,通常在十六進制前面加上0x或0X,所以如果在程序里見到0x66這種就是十六進制數(shù)

八進制:以8為基底,八進制數(shù)字為0~7,對應二進制中的3位,通常在八進制數(shù)前面加上0,例如014,就會被編譯器看作八進制數(shù)。八進制數(shù)起源于計算機內存采用36位字的時代,那時一個字是3位,所以36位二進制字可以寫成12個八進制數(shù),不過八進制目前已經(jīng)很少使用,知道它們就行了

二進制:以2為基底,只有0和1兩種值,就是我們常說的0、1代碼,也是計算機最底層能夠識別的東西。經(jīng)常有人說使用機器碼編程的人才是真正的大神,所以很多人都認為就是使用0、1代碼編程,這是完全坑爹的說法,就算使用機器碼編程,也是使用十六進制,現(xiàn)在沒有人會再次傻到用0、1來寫代碼的,假如在計算機內存地址為0x004935FF的地方有一條匯編語言指令:jmp 0x12345678,這就是一條跳轉指令,翻譯成機器碼就是E8 74 20 EB 11,這個就是十六進制機器碼,看不懂不要緊,主要就是讓大家了解下有這么一回事就行了。

希望大家能夠把前面的基礎打牢固一點,前面的每個例子都要搞懂并且自己敲出來運行,不然學到后面會很吃力的,到時候又要回頭來補基礎知識,這樣浪費的時間其實更多。有問題大家可以在群里提問。

最近重感了,睡得比較早,文章也沒更新,我再最后強調一遍,有三種問題我是不會回答的:1是直接求代碼的伸手黨,2是網(wǎng)上找的代碼出現(xiàn)的問題,3是沒有任何提示信息的問題。很多人問問題就是這樣,提示信息是什么?截圖在哪?沒有!代碼在哪?沒有!操作步驟呢?也沒有!你是來提問題的,不是讓別人來猜你的問題的,你給出了提示信息,別人可能兩三分鐘就幫你解決了,你什么都沒有,你是在浪費大家的時間,連提問都不會的人有多大幾率能得到正確的答案呢?

我們知道每一種數(shù)據(jù)類型都可以擴展出指針變量,那么普通變量和指針變量到底有什么不同呢,前面我們已經(jīng)說了它們之間的一個不同點,就是它們存放的數(shù)據(jù),同樣的int i和int *p,假設我們同時為它們賦值為1,i=1和p=1,i=1表示往變量i的地址中存放整數(shù)1,而p=1表示往指針變量p的地址中存放地址1,可見同樣的數(shù)據(jù)1,但是賦值給普通變量和指針變量所代表的含義是截然不同的。為了便于大家進一步的理解普通變量和指針變量的區(qū)別,我們今天講它們的第二個區(qū)別,就是它們的大小不同,在我的32位機器上,我特意選取了char、short、int、double四種不同長度的類型來測試,程序如下:

小編推薦一個學C語言/C++的學習裙【 六九九,四七零,五九六 】,無論你是大牛還是小白,是想轉行還是想入行都可以來了解一起進步一起學習!裙內有開發(fā)工具,很多干貨和技術資料分享!

由此可見,指針變量的大小在我的32位機器上是始終為4字節(jié)的,這是為什么呢,這是計算機組成原理的知識,不要求大家掌握,我簡單的談下,計算機里面有兩個最重要的組件,cpu和內存,cpu是所有運算和控制的中心,內存里存放了最重要的代碼和數(shù)據(jù),cpu和內存之間有多條線進行連接,其中兩組很重要的線叫做數(shù)據(jù)總線和地址總線,cpu從內存里取數(shù)據(jù)和存放數(shù)據(jù),都是先通過地址總線來尋找內存中相關地址,從地址中得到數(shù)據(jù)或存入數(shù)據(jù)都是數(shù)據(jù)總線進行數(shù)據(jù)傳送的,之所以稱為32位機器,是因為機器表示數(shù)據(jù)使用的是32根數(shù)據(jù)線(每根數(shù)據(jù)線只能表示0或者1)傳送數(shù)據(jù),我們可以想到數(shù)學里的排列組合,如果是2根數(shù)據(jù)線,那么我們能表示的數(shù)據(jù)大小是2的2次方(0~2的2次方-1);如果使用8根數(shù)據(jù)線,那么能表示的數(shù)據(jù)大小為2的8次方(0~2的8次方-1),這其實就是古老的8位機;如果使用16根數(shù)據(jù)線,能表示的數(shù)據(jù)大小就是2的16次方(0~2的16次方-1),這就是32位機器的上一代產(chǎn)品16位機器;然后就是我們使用32位數(shù)據(jù)線的32位機器;再接下來還有64位機器。在我的32位機器上使用的地址總線也是32根,很顯然它能表示的內存地址大小就是2的32次方,范圍為0~0xFFFFFFFF(16進制一位代表4位二進制,這在前面已經(jīng)講過),所以指針大小自然就是32位,即4個字節(jié)。

這些是C/C++能做的

服務器開發(fā)工程師、人工智能、云計算工程師、信息安全(黑客反黑客)、大數(shù)據(jù) 、數(shù)據(jù)平臺、嵌入式工程師、流媒體服務器、數(shù)據(jù)控解、圖像處理、音頻視頻開發(fā)工程師、游戲服務器、分布式系統(tǒng)、游戲輔助等

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容