從零開始的數組,這麼設計麽是為什呢?

来源:https://www.cnblogs.com/MonsterJ/archive/2020/05/24/12953034.html
-Advertisement-
Play Games

為什麼數組要從零開始? 如題,數組第一個元素為什麼要從零開始,而不從一開始?感覺這很反人類呀,正常來講,一個集合的開始,不應該從一嗎? 對於這個問題,我覺得可以從以下兩方面來考慮。 1設計層面 我們先瞭解一下數組最基本的結構和定址方式(即實現方式)。 現在市面上無論是C、Java、PHP,還是Go或 ...


為什麼數組要從零開始?

如題,數組第一個元素為什麼要從零開始,而不從一開始?感覺這很反人類呀,正常來講,一個集合的開始,不應該從一嗎?

對於這個問題,我覺得可以從以下兩方面來考慮。

1設計層面

我們先瞭解一下數組最基本的結構和定址方式(即實現方式)。

現在市面上無論是C、Java、PHP,還是Go或者其他編程語言,他們數組的實現方式,應該都是一樣的:一段連續的記憶體。

file

數組在分配記憶體的時候,我們會知道數組的 開始地址 (PS:在目前下標為零的情況下,也等同於數組的第一個元素的地址)
file

因為數組中每個元素的類型都是相同的,所以每種類型所占的記憶體大小是固定的,因而導致數組中每個元素的所占的記憶體大小都是相同的

file

由此我們可以得出,數組中每個元素地址的計算公式:

// n為數組坐標,x為數組開始的記憶體地址,
//size為每個元素的大小

file

這是目前數組定址的計算公式;但是這是小標起始為0的時候,假如我們想讓數組的起始下標變為1,則公式會變成什麼樣呢?

// n為數組坐標,x為數組開始的記憶體地址,size為每個元素的大小
array[n]的地址 = x + (n - 1) * size
對比以上兩個公式,會發現,如果用下麵的公式,僅僅是多了一個"n - 1"的運算!

要知道,數組是電腦語言的最最基本的組成單元,所有的電腦編程語言的其他組成部分,包括各種類庫,各種特殊的數據結構(如Golang的channel)和語法欄位等,都是基於數組等這些最最基本的組成單元之上做的封裝;

假如我們把數組從1開始,對數組而言只是多了一步計算,但是,對於整個編程語言的系統而言,將會是多了無數次計算!所以:在編程語言的設計中,對於數組等這些最最基本的編程操作,要把效率做到極致!因此,數組的起始下標會是0開始。

2歷史原因

還有一個比較重要的原因我覺得是歷史使然,當初初級編程語言數組的設計(例如C),就是由零開始的;開發者們都熟悉了這種編程方式,導致後來陸陸續續出現的高級編程語言都延續了這個習慣。

本文由博客一文多發平臺 OpenWrite 發佈!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [導讀] 前文描述了棧的基本概念,本文來聊聊堆是怎麼會事兒。RT Thread 在社區廣受歡迎,閱讀了其內核代碼,實現了堆的管理,代碼設計很清晰,可讀性很好。故一方面瞭解RT Thread內核實現,一方面可以弄清楚其堆的內部實現。將學習體會記錄分享,希望對於堆的理解及實現有一個更深入的認知。 註,文 ...
  • 通常大家開發大部分是本地git push 提交,伺服器上git pull 手動更新。git 可以使用webhook實現自動部署。webhook是倉庫平臺的一個鉤子事件,通過hook 鉤子監聽代碼,回調通知(通知地址就是你在各個git倉庫平臺中填寫的webhook地址,一般在你的某個項目倉庫如mypr ...
  • 根據碎片的生命周期,我們知道onAttach()方法首先會被執行,因此在這裡做一些數據初始化的操作,比如調用getNews()方法獲取幾條模擬的新聞數據,以及完成NewsAdapter的創建,然後在onCreateView()方法中載入了news_title_frag佈局,並給新聞列表的ListVi ...
  • 1/ 概述 利用Spring Boot作為基礎框架,Spring Security作為安全框架,WebSocket作為通信框架,實現點對點聊天和群聊天。 2/ 所需依賴 Spring Boot 版本 1.5.3,使用MongoDB存儲數據(非必須),Maven依賴如下: 配置文件內容: 大致程式結構 ...
  • 新開一坑——Elements of Financial Risk Management in Python 用 python 完成 " Elements of Financial Risk Management (Second Edition)" 一書的課後實踐練習,希望年底之前能完成吧。 項目地址 ...
  • 最近開始學Go語言,但是在使用VS Code 編寫Go的時候出現了插件無法下載的問題。最初我的解決辦法也是從github下載再安裝,但是我並不喜歡這種做法,因為我要在多台pc上使用VS Code編寫Go,所以我覺要重覆多次很麻煩,而且插件的安裝也非常麻煩,我曾經一度想放棄學習Go語言,沒錯因為安裝插 ...
  • 本教程源碼請訪問: "tutorial_demo" 上篇教程我們學習瞭如何使用工廠模式解耦,把對象的創建由程式員交給自定義的工廠類,在這篇教程我們將學到如何使用Spring的IOC解決程式的耦合問題。 一、什麼是IOC IOC:Inversion of Control,控制反轉,將創建對象的權力交給 ...
  • 前言 繼上一篇使用Flutter開發的抖音國際版 後再次擼一個國內版抖音,大部分功能已完成,主要是Flutter開發APP速度很爽, 先看下圖 項目主要結構介紹 這次主要的改動在api.dart 及douyin.dart里,國內抖音的api是不同的,另外地址以及實體類也不一樣。詳細下麵介紹. 抖音的 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...