程式設計師指標簡介

不管你意識到與否,你所使用的絕大多數程式都以某種方式使用指標。作為一名程式設計師,您需要了解指標是如何工作的。...

不管你意識到與否,你所使用的絕大多數程序都以某種方式使用指針。也許您在某個時候遇到過NullPointerException。作為程序員,您編寫的代碼很可能會使用指針,即使您自己沒有實現它們。

intro-pointers-programming

今天我將向您展示指針是如何工作的,因此您可能希望在編程入門中瞭解數組和列表是如何工作的。這篇文章將比通常更以理論為基礎,但堅持下去,指針是非常複雜的!

編譯代碼

在深入研究指針之前,您需要了解代碼是如何構建和執行的——也許您已經知道這一點了。本節將有相當一般性的陳述——適用於大多數語言,但不一定適用於所有語言。

Pointers

讓我們回到起點。每臺計算機都使用二進制,一系列的1和0組成了我們所知道的現代技術。用二進制代碼編寫任何東西都是非常困難的(文件會非常混亂),因為這些是中央處理器或CPU運行所需的原始指令。這就是機器代碼。

機器代碼的下一步是組裝。這是一種人類可讀的格式。雖然編程仍然很複雜,但這是可能的。彙編是由一系列執行任務的簡單命令組成的,被稱為低級編程語言。編寫複雜的程序是可能的,但是很難表達抽象的概念,而且需要大量的考慮。

許多視頻遊戲和高性能應用程序都有彙編語言編寫的一些邏輯,因為如果您知道自己在做什麼,就可以發現一些真正的速度提升。但是,對於絕大多數編程項目,您根本不需要知道任何程序集。

Pointers

所以,如果機器代碼太難寫,彙編程序太難編程,你用什麼來寫代碼呢?這就是高級語言的用武之地。高級語言使程序易於編寫。你可以用與你的母語相似的語言編程,而且很容易表達複雜的算法。您可能聽說過許多高級語言(您肯定會使用這些語言編寫的程序):

  • 基本
  • C++
  • 口齒不清

這些語言現在已經很古老了,很多都是在20世紀50年代早期發展起來的!幾乎所有現代編程語言都是高級語言,包括PHP和Python。每天都有更多的語言被髮明出來(雖然現在可能已經足夠了),但是如果計算機需要機器代碼,那麼你的代碼到底是如何正常工作的呢?

這就是編譯的用武之地。編譯器是將高級代碼轉換為可執行形式的程序。這可能是另一種高級語言,但通常是彙編語言。一些語言(如Python或Java)將代碼轉換為一個稱為字節碼的中間階段。這將需要在以後再次編譯,這通常是在需要時完成的,比如在程序運行時。這就是所謂的即時編譯,它非常流行。

內存管理

既然您知道了編程語言是如何工作的,那麼讓我們看看高級語言中的內存管理。對於這些示例,我將使用偽代碼——不是用任何特定語言編寫的代碼,而是用來顯示概念而不是確切的語法。今天,這將最類似於C++,因為這是最好的高級語言(在我看來)。

在本節中,如果您瞭解RAM的工作原理,將會有所幫助。

大多數語言都有變量——存儲一些數據的容器。必須顯式定義數據類型。一些動態類型語言(如Python或PHP)可以為您處理這個問題,但它們仍然必須這樣做。

假設您有一個變量:

int myNumber;

這段代碼聲明瞭一個名為myNumber的變量,並給它一個integer的數據類型。編譯後,計算機將此命令解釋為:

查找一些空內存,並保留足夠大的空間來存儲整數

一旦這個命令被執行,那個內存位就不能被另一個程序使用。它還不包含任何數據,但它是為myNumber變量保留的。

現在為變量賦值:

myNumber = 10;

要完成此任務,您的計算機將訪問其保留的內存位置,並將其中存儲的任何值更改為新值。

現在,這一切都很好,但內存位置如何得到保留?如果程序保留了它們喜歡的所有內存,RAM會立即填滿——這將導致系統速度非常慢。

Pointers

為了避免這個潛在的問題,許多語言實現了一個垃圾收集器,用於銷燬超出範圍的變量(從而釋放保留的內存位置)。

你可能想知道什麼是範圍,為什麼它如此重要。作用域定義了程序使用的變量或任何內存的限制和壽命。當任何代碼都無法訪問某個變量時(即垃圾收集器介入時),該變量就“超出範圍”。舉個例子:

function maths() { int firstNumber = 1;}int secondNumber = 2;print(firstNumber + secondNumber); // will not work

這個例子不會編譯。變量firstNumber在數學函數中,所以這就是它的作用域。不能從聲明它的函數外部訪問它。這是一個重要的編程概念,理解它對於使用指針至關重要。

這種處理內存的方法稱為堆棧。這是絕大多數程序的工作方式。使用它不需要理解指針,而且它的結構相當好。堆棧的缺點是速度。由於計算機必須分配內存、跟蹤變量並運行垃圾回收,因此開銷很小。這對於較小的程序來說很好,但是對於高性能任務或數據密集型應用程序呢?

輸入:指針。

指針

表面上看,指針聽起來很簡單。它們引用(指向)內存中的一個位置。對於堆棧上的“常規”變量來說,這似乎沒有什麼不同,但是相信我,這是一個巨大的差異。指針存儲在堆上。這與堆棧相反—它的組織性較差,但速度要快得多。

讓我們看看如何在堆棧上分配變量:

int numberOne = 1;int numberTwo = numberOne;

這是簡單的語法;變量numberTwo包含數字1。賦值過程中,它的值從numberOne變量複製過來。

如果要獲取變量的內存地址,而不是它的值,則必須使用與號(&)。這稱為操作符的地址,是指針工具箱的重要部分。

int numberOne = 1;int numberTwo = &numberOne;

現在numberTwo變量指向一個內存位置,而不是將數字1複製到它自己的新內存位置。如果要輸出這個變量,它將不是第一個變量(即使它存儲在內存位置)。它將輸出它的內存位置(可能類似於2167,儘管它根據系統和可用的RAM而變化)。要訪問存儲在指針中的值,而不是內存位置,必須取消對指針的引用。這將直接訪問該值,在本例中,該值將是第一個值。以下是取消引用指針的方法:

int numberTwo = *numberOne;

解引用運算符是星號(*)。

這可能是一個很難理解的概念,所以讓我們再看一遍:

  • 運算符(&)的地址存儲內存地址。
  • 解引用運算符(*)訪問該值。

聲明指針時語法略有變化:

int * myPointer;

int的數據類型在這裡指的是指針指向的數據類型,而不是指針本身的類型。

現在你知道指針是什麼了,你可以用它們做一些非常巧妙的把戲了!使用內存時,操作系統會按順序啟動。你可以把公羊看作鴿子洞。很多洞用來存放東西,一次只能用一個。不同的是,這些鴿子洞都有編號。分配內存時,您的操作系統從最低的數字開始,然後開始工作。它永遠不會在隨機數之間跳來跳去。

Pointers

在使用指針時,如果已經分配了數組,則可以通過簡單地遞增指針來輕鬆導航到下一個元素。

這就是有趣的地方。將值傳遞給函數(使用存儲在堆棧上的變量)時,這些值會被複制到函數中。如果這些是大變量,那麼程序現在將存儲它們兩次。函數完成後,可能需要一種方法來返回這些值。函數通常只能返回一件事——所以如果要返回兩件、三件或四件事呢?

Pointers

如果將指針傳遞給函數,則只複製內存地址(非常小)。這節省了你的CPU很多工作!也許你的指針指向一個巨大的圖像數組——你的函數不僅可以處理存儲在完全相同的內存位置的完全相同的數據,而且一旦完成,就不需要返回任何東西。乾淨利落!

不過,你必須非常小心。指針仍然可以超出範圍並由垃圾收集器收集。但是,存儲在內存中的值不會被收集。這稱為內存洩漏。您不能再訪問數據(因為指針已被銷燬),但它仍在使用內存。這是許多程序崩潰的一個常見原因,如果有大量數據,它可能會嚴重失敗。大多數情況下,如果你有一個大的漏洞(使用比系統更多的RAM),你的操作系統會殺死你的程序,但這是不可取的。

Pointers

調試指針可能是一場噩夢,尤其是在處理大量數據或在循環中工作時。它們的缺點和難以理解的地方確實值得您在性能方面進行權衡。儘管記住,它們可能並不總是必需的。

今天到此為止。我希望你在一個複雜的話題上學到了一些有用的東西。當然,我們還沒有涵蓋所有需要知道的事情——這是一個非常複雜的話題。如果你對學習有興趣,我強烈推薦在24小時內使用C++。

如果這有點複雜,請看一下我們的最簡單編程語言指南。

你今天學過指針是怎麼工作的嗎?你有什麼技巧和竅門想和其他程序員分享嗎?跳到下面的評論和分享你的想法!

  • 發表於 2021-03-15 04:42
  • 閱讀 ( 41 )
  • 分類:程式設計

你可能感興趣的文章

c(c)和目標c(objective c)的區別

關鍵區別——c與目標c 程式語言對於為計算機執行特定任務建立有意義的指令集非常有用。兩種廣泛使用的程式語言是C和Objective C。Objective C是基於C語言的。因此,C程式可以作為目標C進行編譯和執行。目標C由基本C以及面向...

  • 發佈於 2020-10-16 06:52
  • 閲讀 ( 55 )

菲律賓比索(php)和python(python)的區別

關鍵區別——php與python PHP和Python是兩種流行的程式語言。PHP和Python的關鍵區別在於PHP專門用於web開發,而Python則用於web開發並作為一種通用程式語言。 PHP是一種為web開發而設計的伺服器端指令碼語言。Python是一種用於通用程...

  • 發佈於 2020-10-18 23:19
  • 閲讀 ( 50 )

perl公司(perl)和python(python)的區別

關鍵區別–perl與python 計算機程式為計算機執行任務提供指令。一組指令被稱為計算機程式。計算機程式是用程式語言開發的。高階語言程式設計師可以理解,但計算機卻不能理解。因此,這些程式被轉換成機器可理解的格式...

  • 發佈於 2020-10-19 17:38
  • 閲讀 ( 38 )

目標c(objective c)和敏捷的(swift)的區別

...別——目標c與swift Objective C和Swift是廣泛用於IOS和Mac應用程式開發的程式語言。Objective C是一個具有面向物件和其他新特性的C語言的超級集合。Swift是蘋果開發的一種新語言。Objective C和Swift的關鍵區別在於,Objective C是一種通用...

  • 發佈於 2020-10-19 22:48
  • 閲讀 ( 58 )

藝術家(artist)和設計師(designer)的區別

藝術家vs設計師 鑑別藝術家和設計師之間的區別可能會讓一些人感到困惑,因為他們的工作性質很接近。實際上,藝術家和設計師指的是兩種不同的職業,每種職業之間都有一定的差異。然而,他們可能看起來都一樣,因為...

  • 發佈於 2020-11-05 10:07
  • 閲讀 ( 50 )

迄今為止程式設計師更有趣的10個原因

... 你試過和程式設計師約會嗎? ...

  • 發佈於 2021-03-12 19:23
  • 閲讀 ( 48 )

想成為使用者體驗設計師嗎?以下是如何開始

...體驗設計師的工作就是組織這些資訊。當涉及到建立應用程式或網站時,使用者體驗設計師為使用者將要執行的操作建立網站地圖和任務流。這就是所謂的資訊體系結構,它曾經是自己的一個領域。 ...

  • 發佈於 2021-03-15 07:56
  • 閲讀 ( 46 )

幫助你開始學習photoshop的7種技巧

adobephotoshop是許多職業的門戶。平面設計和攝影是最常見的。前端開發人員和生產助理也可以用他們的Photoshop技能走得更遠。但如何學習和掌握Photoshop技巧呢? ...

  • 發佈於 2021-03-24 23:15
  • 閲讀 ( 61 )

用udacity提升你的職業水平並掌握程式設計技巧

...個線上學習平臺,致力於培訓未來職業的世界勞動力,如程式設計、資料管理、網路安全、人工智慧等。Udacity讓你可以很容易地按照自己的時間表和100%的線上學習新技能,而且從來沒有比這更好的報名時間。 ...

  • 發佈於 2021-03-29 08:27
  • 閲讀 ( 58 )

web元件和基於元件的體系結構簡介

... DOM是將瀏覽器中看到的內容繫結到HTML程式碼的粘合劑shadowdom是DOM的一部分,它使標記、樣式和功能保持分離。 ...

  • 發佈於 2021-03-30 04:57
  • 閲讀 ( 88 )
zsb73023
zsb73023

0 篇文章

作家榜

  1. admin 0 文章
  2. 孫小欽 0 文章
  3. JVhby0 0 文章
  4. fvpvzrr 0 文章
  5. 0sus8kksc 0 文章
  6. zsfn1903 0 文章
  7. w91395898 0 文章
  8. SuperQueen123 0 文章

相關推薦