陣列下標為什麼是從0開始的,而不是1?
依稀記得大一開始學習C語言的時候,對於陣列下標從0開始這一點是非常彆扭難以適應的,感覺這就是反人類的設計。直到今天才瞭解這背後為什麼這樣設計的原理。
為了解釋清楚這個原因,我們來認識陣列的相關特性,據此來探索它底層的一些東西。
隨機訪問
為什麼陣列能支援隨機訪問呢,我們先來看看陣列專業定義。陣列( Array )是一種線性表資料結構。它用一組連續的記憶體空間,來儲存一組具有相同型別的資料
這裡有幾個關鍵詞,我們來分別仔細解釋一下:
- 線性表:按線性結構儲存,陣列,連結串列,佇列,棧都是經典的線性表
- 連續記憶體空間和相同資料型別:真是因為有這兩個限制才會有隨機訪問這個性質的。 我們來看看int型別長度為10的陣列在記憶體中是如何儲存的。假設起始地址為1000
我們要把握一個最基本的原則,計算機去獲取某個變數,本質都是去它對應的記憶體讀取,所以必須要先獲取對應的記憶體地址。
上面就是具體的計算公式,至此我們可以明白陣列為什麼支援隨機訪問了。
一些常見的錯誤
1、陣列適合查詢,查詢的時間複雜度是O(1)
這種說法其實是不準確的。其實就算是排序好的陣列,用二分查詢,複雜度都為O(logn)。準確表達是,陣列是支援下標機訪問。時間複雜度O(1)
相關推薦
為什麼C陣列下標從0開始,而不是從1開始
對於學習過程式語言的人來說,相信絕大多數人都會有這樣的疑問:我們平時計數,通常是從一開始計數的,為什麼在程式語言中,陣列的下標是從0開始計算的呢? 這是因為,C語言中,下標的含意是:當前元素到第一個元素的偏移量。第一個元素的下標自然就是0,第二個元素的
陣列的由來和為什麼陣列下標從0開始?
本文索引: 1.陣列的由來: a.字面引申: b.通俗解釋: 陣列的特點: 2.陣列下標為什麼從0開始: a.初步理解: b.加深理解: 1.陣列的由來: // 變數
Python之父:為什麼Python陣列下標從0開始
曾經有人在Twitter上問我為什麼Python使用以0為首位的陣列索引法(0-based),並且還給我了一個相關優秀文章的連結。這讓我想起許多往事:Python的前身之一,ABC語言使用的是以1為首位的陣列索引方式(1-based),而對Python有著巨大影響的C語言
Kmp求next的值(下標從0開始的)
直接上程式碼: #include<iostream> #include<cstring> #include<cstdio> using namespace std
分類任務中label取值的注意事項(caffe框架下),從0開始,連續整數,
最近在做一個分類任務的實驗的時候,對標籤的取值產生了一些疑惑,所以看了一點對應的原始碼,順利解決了疑惑,在這裡和大家分享,如果有什麼理解錯誤還請大家指出。 之前做分類任務的時候總有聽說,標籤(label)的取值需要從0開始,按照個人的習慣,我在
【一】從0開始,用flask+mongo打造分散式伺服器監控平臺
閱讀本文,代表你將和 奎因 一起,從 0 開始快速入門 flask 開發以及 mongodb 的使用,打造一個穩定、健壯的分散式多機伺服器資源監控平臺 在前面一篇文章《 Python 系統資源資訊獲取工具,你用過沒?》中,我們學習瞭如何使用 Python 中的第三方庫 psutil 來獲取系統的資
大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。
題目描述 大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。 n<=39 /* 思路: 就是簡單的斐波那契數列,按照正常的思路求解即可 可以分為遞迴和非遞迴,這裡介紹非遞迴的方式 */ class Solution { pub
USB學習筆記,情深義重。親身實踐從0開始,STM32,MSP430的實現。
多年工作一直在使用MSP430微控制器,其實有些系列也支援全速通用序列匯流排(USB 2.0),比如MSP430F5504,MSP430F5510。近期在學習STM32,以後就在以STM32F103ZET6為基礎平臺展開對USB 2.0(USB3.0的區別就是高
Android-mac下ffmpeg從0開始編譯
0. 題外話 基於ffmpeg4.1版本.(好吧,最後我改成3.3.8版本了) 這次編譯真的是慘痛的經歷.先是經歷了linux空間不足,然後是編譯報錯 /bin/sh: ranlib/usr/local/lib/libavdevice.a: No such file or directo
【專欄】資料結構和演算法之美-為什麼很多程式語言中的陣列都是從 0 開始的
學習筆記 陣列的特徵 1.線性表 資料排成像一條線一樣的結構,資料之間只是簡單的前後關係。除了陣列是一種線性表結構外,連結串列、佇列和棧也是。與之對應的像二叉樹、堆、圖等就是非線性表。 2.使用連續
為什麼陣列標號是從0開始的 • cenalulu's Tech Blog
本文通過彙總一些網上搜集到的資料,總結出大部分程式語言中陣列下標從0開始的原因 背景 我們知道大部分程式語言中的陣列都是從0開始編號的,即array[0]是陣列的第一個元素。這個和我們平時生活中從1開始編號的習慣相比顯得很反人類。那麼究竟是什麼樣的原因讓大部分程式語言陣列都遵從了這個
史上最詳細的Hadoop環境搭建,從0開始,圖解全部過程
Hadoop在大資料技術體系中的地位至關重要,Hadoop是大資料技術的基礎,對Hadoop基礎知識的掌握的紮實程度,決定在大資料技術道路上走多遠。 這是一篇入門文章,Hadoop的學習方法很多,網上也有很多學習路線圖。本文的思路是:以安裝部署Apache Hadoop2.x版本為主線,來介紹H
為什麼陣列標號是從0開始的?
本文通過彙總一些網上搜集到的資料,總結出大部分程式語言中陣列下標從0開始的原因。 一、背景 我們知道大部分程式語言中的陣列都是從0開始編號的,即array[0]是陣列的第一個元素。這個和我們平時生活中從1開始編號的習慣相比顯得很反人類。那麼究竟是什麼樣的原因讓大部分程式語言陣列都遵從了這個神奇的習慣
從0開始,第一步,搭建Python開發環境!
分享文章前,小編有話要說: 環境安裝按照小編寫的步驟一步一步來, 學程式設計,不要急,一步一個腳印,一口是吃不成胖子的,慢慢來! 正文 1、訪問網頁連結 ,點選下載 2、點選執行下載後的檔案 &nbs
從0開始,部署.NetCore並構建非阻塞高併發伺服器(2)
工具篇看我這篇部落格想搭建伺服器的朋友多半是想在Linux上使用,正所謂工欲善其事必先利其器,一個好用的SSH對我們的工作效率影響也很大,簡單的說下我在Win下常用的SSH軟體和使用教程,老手自動忽略即可推薦工具1--WinSCPWinSCP可以說是我最常用的遠端連線Linu
從0開始,在樹莓派上部署TensorFlow Object Detection API
如果你只想用樹莓派來識別,請移步https://blog.csdn.net/weixin_43599336/article/details/83713790 視訊演示地址: P1: https://www.bilibili.com/video/AV31697636 # 系統安裝
【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案(7.2) 模組管理,模組的新增、修改、刪除
索引 簡述 今天我們來做模組管理的 新增、修改、刪除 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的久了,自然就理解了
【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案(5.3) 登入功能的實現,豐富資料表、建立關聯
1 USE [wkmvc_db] 2 GO 3 /****** Object: Table [dbo].[SYS_CODE] Script Date: 2016/5/17 9:30:01 ******/ 4 SET ANSI_NULLS ON 5 GO 6 SET
【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案 (10)部門管理、崗位管理和員工管理
1 USE [wkmvc_db] 2 GO 3 /****** Object: Table [dbo].[SYS_POST_USER] Script Date: 2016/6/20 16:28:44 ******/ 4 SET ANSI_NULLS ON 5 GO
【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案 (12)程式與資料備份
索引 簡述 程式檔案備份與資料備份 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的久了,自然就理解了。 專案開始