C/C++編程筆記:《C語言》—— 數組知識詳解,學編程建議收藏!

来源:https://www.cnblogs.com/yxy6/archive/2020/04/09/12670125.html
-Advertisement-
Play Games

作者:龍躍十二鏈接:https://www.imooc.com/article/300814 ,微信公眾號:龍躍十二 數組的基本概念 我們把一組數據的集合稱為數組(Array),它所包含的每一個數據叫做數組元素(Element),所包含的數據的個數稱為數組長度(Length),數組中的每個元素都有一 ...


作者:龍躍十二鏈接:https://www.imooc.com/article/300814 ,微信公眾號:龍躍十二

數組的基本概念

我們把一組數據的集合稱為數組(Array),它所包含的每一個數據叫做數組元素(Element),所包含的數據的個數稱為數組長度(Length),數組中的每個元素都有一個序號,這個序號從0開始,而不是從我們熟悉的1開始,稱為下標(Index),所包含數組的裡面元素的類型叫做數組類型(Type)。

一句話就說清楚了數組的基本概念,就是這麼簡單,_。

數組底層結構探析

1int array[5];

記憶體佈局圖

不要看這個圖簡單,底層就是這樣的。數組是一個整體,它的記憶體是連續的;也就是說,數組元素之間是相互挨著的,彼此之間沒有一點點縫隙。

這一點很重要,連續的記憶體為指針操作(通過指針來訪問數組元素)和記憶體處理(整塊記憶體的複製、寫入等)提供了便利,這使得數組可以作為緩存使用。

有同學估計要說什麼叫做指針操作,聽龍叔絮叨下。

1int arr[5]={1,2,3,4,5};2printf("%d\n",arr[3]);

看上面的代碼,學過數組都知道arr[3]是取第三個元素的值,那我就要問你了,怎麼取到值的呢???

不要慌,龍叔告訴你其實就是指針操作。當我們聲明並定義數組int arr[5] = {1,2,3,4,5},此時數組被分配了5個int大小的空間在棧上,並初始化了數組元素。我們都知道數組名代表數組的首元素的首地址,那麼很明顯就可以得到arr[3] = arr + 3。

數組的運算

1int a[]={1,2,3,4};

2printf("%d\n",sizeof(a));

3printf("%d\n",sizeof(a+0));

4printf("%d\n",sizeof(*a));

5printf("%d\n",sizeof(a+1));

6printf("%d\n",sizeof(a[1]));

7printf("%d\n",sizeof(&a));

8printf("%d\n",sizeof(&a+1));

9printf("%d\n",sizeof(&a[0]));

10printf("%d\n",sizeof(&a[0]+1));

11//字元數組

12char arr[] = {'a','b','c','d','e','f'};

13printf("%d\n", sizeof(arr));

14printf("%d\n", sizeof(arr+0));

15printf("%d\n", sizeof(*arr));

16printf("%d\n", sizeof(arr[1]));

17printf("%d\n", sizeof(&arr));

18printf("%d\n", sizeof(&arr+1));

19printf("%d\n", sizeof(&arr[0]+1));

20printf("%d\n", strlen(arr));

21printf("%d\n", strlen(arr+0));

22printf("%d\n", strlen(*arr));

23printf("%d\n", strlen(arr[1]));

24printf("%d\n", strlen(&arr));

25printf("%d\n", strlen(&arr+1));

26printf("%d\n", strlen(&arr[0]+1));

27char *p = "abcdef";printf("%d\n", sizeof(p));

28printf("%d\n", sizeof(p+1));

29printf("%d\n", sizeof(*p));

30printf("%d\n", sizeof(p[0]));

31printf("%d\n", sizeof(&p));

32printf("%d\n", sizeof(&p+1));

33printf("%d\n", sizeof(&p[0]+1));

34printf("%d\n", strlen(p));

35printf("%d\n", strlen(p+1));

36printf("%d\n", strlen(*p));

37printf("%d\n", strlen(p[0]));

38printf("%d\n", strlen(&p));

39printf("%d\n", strlen(&p+1));

40printf("%d\n", strlen(&p[0]+1));

41//二維數組

42int a[3][4] = {0};

43printf("%d\n",sizeof(a));

44printf("%d\n",sizeof(a[0][0]));

45printf("%d\n",sizeof(a[0]));

46printf("%d\n",sizeof(a[0]+1));

47printf("%d\n",sizeof(a+1));

48printf("%d\n",sizeof(&a[0]+1));

49printf("%d\n",sizeof(*a));

50printf("%d\n",sizeof(a[3]));

就這幾個運算,估計會難倒很多同學的,不信你可以把答案寫出來之後在去跑一遍,全對找我拿紅包

sizeof(數組名),代表整個數組的位元組數;&數組名,代表取得整個數組的地址。

數組的一些特性

1、嚴格上說數組只有一維數組。n維數組是在一維數組裡面存放一個(n-1)維數組,掌握以為數組即可。

2、數組的長度指的是數組的元素個數不是數組空間長度。sizeof()關鍵字即可獲取數組總的位元組數,在除以元素類型的位元組數即可得到數組長度。

3、C語言並不會判斷數組訪問越界,需要程式員判斷越界訪問。eg: int arr[5] = {1,2,3,4,5}; int b = arr[10];,這樣訪問也是可以拿到元素的,天知道你訪問的是誰的數據。

4、數組底層記憶體結構是連續的。正是由於數組結構的連續性便誕生了記憶體的友好性,數組分配記憶體是整塊分配的,堆記憶體很友好;連續的記憶體是的訪問記憶體效率高。

5、數組大小是固定不變的。需要改變大小就需要新開一塊大記憶體的數組,把之前的元素拷貝過來,釋放之前的記憶體。

6、數據根據下標隨機訪問的時間複雜度為 O(1)

7、數據的插入和刪除很低效:

(1)如果刪除數組末尾的數據,最好情況時間複雜度為 O(1)

(2)如果刪除開頭的數據,則最壞情況時間複雜度為 O(n)

(3)平均情況時間複雜度也為 O(n)。

數組常見問題

數組長度是一個非常量。

1int b;2scanf("%d",&b);3int arr[3*b];

不知道你曾經有沒有寫過這樣的代碼,反正我寫過。數組的長度和記憶體是在程式編譯時就已經確定了的。b的值是在運行時才確定的。有兩個新名詞,程式編譯時&程式運行時

數組越界訪問

1int arr[5]={1,2,3,4,5};2printf("%d\n",arr[-1]);3printf("%d\n",arr[1]);4printf("%d\n",arr[4]);5printf("%d\n",arr[5]);6printf("%d\n",arr[6]);

肉眼可見的錯誤,編譯器竟然沒報錯。

數組相關筆試題目

給你一個數組,求一個k值,使得前k個數的方差 + 後面n-k個數的方差最小 ,時間複雜度可以到O(n)。

給定一個n個整型元素的數組a,其中有一個元素出現次數超過n / 2,求這個元素。

給定一個含有n個元素的數組,找出數組中的兩個元素X和Y使得abs(x-y)最小。

在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。

在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。 數組中某些數字是重覆的,但不知道有幾個數字是重覆的。也不知道每個數字重覆幾次。請找出數組中任意一個重覆的數字。 例如,如果輸入長度為7的數組{2,3,1,0,2,5,3},那麼對應的輸出是第一個重覆的數字2。

給定一個數組A[0,1,…,n-1],請構建一個數組B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…_A[i-1]A[i+1]…_A[n-1]。不能使用除法。(註意:規定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)

利用數組可以出很多筆試題目,當然這些題目很多並不是考驗數組本身特性大多是考演算法基礎的。本節就到這裡了!

其實做為一個開發者,有一個學習的氛圍跟一個交流圈子特別重要這裡我推薦一個C語言C++交流群1053261220,不管你是小白還是轉行人士歡迎入駐,大家一起交流成長。


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

-Advertisement-
Play Games
更多相關文章
  • public class Demo { public static void main(String[] args) { show(2, 3, 4, 5, 6); } public static void show(int... arr) { System.out.println(arr.lengt ...
  • 格式: for(數據類型 變數名: 被遍歷的集合(Collection)或者數組) 只能取出,不能增刪。 對集合進行遍歷:只能獲取集合元素。但是不能對集合進行操作。 迭代器除了遍歷還能進行remove集合中元素的動作。 如何使用ListIterator還可以在遍歷過程中對集合進行增刪改查的動作。 傳 ...
  • 一、join方法 1.該方法為成員方法 2.線程合併 package com.bjpowernode.java_learning; ​ public class D107_1_JoinMethod { public static void main(String[] args) throws Int ...
  • 1. 回顧Boosting提升演算法 AdaBoost是典型的Boosting演算法,屬於Boosting家族的一員。在說AdaBoost之前,先說說Boosting提升演算法。Boosting演算法是將“弱學習演算法“提升為“強學習演算法”的過程,主要思想是“三個臭皮匠頂個諸葛亮”。一般來說,找到弱學習演算法要 ...
  • java克隆 為什麼需要克隆 我們在很多時候需要使用一個對象去記錄另外一個對象的當前狀態,對象中可能會有很多屬性,如果我們一個一個去設置,不僅不方便,而且效率很低,我們看一個初學者可能遇到的問題 也許有的人認為Person p2=p1這樣的方式就可以克隆一個對象,這種想法是錯誤的,這種使用等號賦值的 ...
  • 今天記錄一下驗證碼的實現,希望能夠幫助到大家! 首先我們看一下實現的效果: 此驗證碼的實現沒有用到太多的插件,話不多說直接上代碼,大家拿過去就可以用。 中間用到了org.apache.commons.lang3.RandomUtils工具類,需要pom配置: <!-- https://mvnrepo ...
  • 筆者:風起怨江南 出處:https://www.cnblogs.com/mengjinxiang 筆者原創,文章歡迎轉載,如果喜歡請點贊+關註,謝謝! 問題:window系統下,如果升級了最新的Python版本(比如當前Python3.7.7版本),需要卸載以前的Python版本麽?安裝後如何切換版 ...
  • 讀取整個文件 整個文件讀取到記憶體是最基本的文件操作之一。這需要使用 包中的 函數。 以上使用的是運行時指定參數 來指定讀取的文件,也可以使用文件的絕對路徑。 分塊讀取文件 當文件非常大時,尤其在記憶體不足的情況下,把整個文件都讀入記憶體是沒有意義的。 更好的方法是分塊讀取文件。這可以使用 包來完成。 利 ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...