1. 程式人生 > >基本知識--資料結構和C語言

基本知識--資料結構和C語言

資料元素是資料的基本單位, 資料項是不可分割的最小單位資料項是構成資料元素的最小單位

關於資料型別我們可以在資料結構(c語言版)中看到是這麼定義的:

  可分兩類:

  一類是 非結構的原子型別,其值是不可分解的,例如c語言中的基本型別(整型,實型、字元型和列舉型別)、指標型別和空型別。

  另一類是結構型別:是由若干成分按某種結構組成,因此是可以分解的,它的成分可以是非結構的,也可以是結構的的;

  從這裡我們可以看到,我們可以看到指標屬於非結構的原子型別,而且和整型(int),實型(float,double)這些基礎型別不一樣,可以看作是一個特殊的型別。

  指標型別和其他型別有什麼不一樣,這就是我們要討論的問題;

  在不同的計算機(16位、32位、64位)裡資料型別分配的空間大小是不一樣的:比如 int 2或4位元組 float 4位元組 double 8位元組 

  看一下程式碼:

  #include <stdlib.h>

  #include <string.h>

  #include <stdio.h>

  void main()

  {

    printf(“sizeof(int):%d\n",sizeof(int));//4

    printf("sizeof(float):%d\n",sizeof(float));//4

    printf("sizeof(double):%d\n",sizeof(double));//8

    printf("sizeof(char):%d\n",sizeof(char));//1

    //看一級指標所佔的記憶體空間
    printf("sizeof(int *):%d\n",sizeof(int *));//4
    printf("sizeof(double *):%d\n",sizeof(double *));//4
    printf("sizeof(float *):%d\n",sizeof(float *));//4
    printf("sizeof(char *):%d\n",sizeof(char *));//4
    //看二級指標所佔記憶體空間
    printf("sizeof(char **):%d\n",sizeof(char **));//4

    //下面我們看看六級指標所佔的記憶體空間大小

    printf("sizeof(char ******):%d\n",sizeof(char ******));//4

    system("pause");

  }

    指標其實型別就是unsigned int

  於是我們發現不管是何種型別的指標,都只佔四個位元組的記憶體空間;甚至多級指標也只佔四個位元組的記憶體空間;這說明不管幾級指標都只佔四個位元組的記憶體空間。

  那麼這到底是為什麼?因為指標是一種特殊的資料型別,它不像基本型別那樣可以直接賦值到記憶體空間,也就是說指標的記憶體空間是無法存取資料的,那麼它所指向的空間你到底儲存的是什麼?正如我們知道的,就是地址,指標就是通過操作地址來操作空間的;

  這就是為什麼指標只佔四個位元組的原因,它只需要儲存地址,或者說只能儲存地址,於是它並不是說讓指標指向一個一千位元組的空間,那麼就重新分配一千位元組的記憶體空間,那樣的話豈不是大大的拉低c語言的效率麼?c語言之所以高效率就是因為可通指標不斷的操作記憶體空間,倘若每次呼叫都要重新分配記憶體空間,並將資料讀取進去,那麼c語言的高效率就無法得到體現了。


相關推薦

基本知識--資料結構C語言

資料元素是資料的基本單位, 資料項是不可分割的最小單位資料項是構成資料元素的最小單位關於資料型別我們可以在資料結構(c語言版)中看到是這麼定義的:  可分兩類:  一類是 非結構的原子型別,其值是不可分

資料結構C語言版)讀書筆記1(基本概念術語)

資料: 所有輸入到計算機中,並被計算機程式處理的符號的總稱。 資料元素: 資料的基本單位,在計算機程式中經常被當做一個整體進行考慮和處理 資料物件: 性質相同的資料元素的集合,是資料的一個子集。 資料結構: 相互之間存在一種或多種特定關係的資料元素的集合。這種資料元素之間

資料結構c語言)——雙向連結串列的基本操作

定義一個雙向連結串列結構: typedef struct DulNode{ // *prior:前一個元素的地址 // *next:後一個元素的地址 struct DulNode *prior; Element data; struct DulNode *

資料結構實驗-C語言-二叉樹的建立,前、中、後序遍歷的遞迴演算法非遞迴演算法,求葉子結點數目,求二叉樹深度,判斷二叉樹是否相似,求二叉樹左右子樹互換,二叉樹層序遍歷的演算法,判斷二叉樹是否是完全二叉樹

1.實驗目的 熟練掌握二叉樹的二叉連結串列儲存結構的C語言實現。掌握二叉樹的基本操作-前序、中序、後序遍歷二叉樹的三種方法。瞭解非遞迴遍歷過程中“棧”的作用和狀態,而且能靈活運用遍歷演算法實現二叉樹的其它操作。 2.實驗內容 (1)二叉樹的二叉連結串列的建立 (2)二叉樹的前、中、後

資料結構c語言)--雙向連結串列的基本操作

定義一個雙向連結串列結構: typedef struct DulNode{ // *prior:前一個元素的地址 // *next:後一個元素的地址 struct DulNode *prior; Element data; struc

C語言實現線性表歸併_含原始碼執行結果_資料結構C語言版)

採用動態分配順序儲存結構實現 採用單鏈表結構實現 1.採用動態分配實現 #include<stdio.h> #include<stdlib.h> #define LIST_INIT_SIZE 100 #define LISTINCREM

資料結構之---C語言實現哈夫曼樹編碼

//哈夫曼樹 //楊鑫 #include <stdio.h> #include <stdlib.h> typedef int ElemType; struct BTreeNode { ElemType data; struct BTr

資料結構c語言)——線性單鏈表基本操作

#include <stdio.h> #include <stdlib.h> typedef int Element; typedef char(*Status)[10]; #define ERROR "error" #define OK "ok"

資料結構C語言版)第三版 基礎實驗二

1、編寫函式slnklist delx(linklist head, datatype x),刪除不帶頭結點單鏈表head中第一個值為x 的結點。 並構造測試用例進行測試。 2、假設線性表(a1,a2,a3,…an)採用不帶頭結點的單鏈表儲存, 請設計演算法函式linklist reverse1

資料結構C語言版)第三版基礎實驗一

1、基於sequlist.h中定義的順序表,編寫演算法函式reverse(sequence_list *L),實現順序表的就地倒置。 2、編寫一個演算法函式void sprit( sequence_list *L1,sequence_list *L2,sequence_list *L3), 將順

資料結構c語言)——鏈棧儲存結構及實現

鏈棧:就是一種特殊的單鏈表,FILO(先進後出) 通常對於連結串列來說: 1.是不需要頭節點的。 2.基本不存在滿棧的情況,除非記憶體已沒有可用的空間。   不多bibi你們都懂哈,直接上程式碼:  鏈棧結構: typedef struct Stock

資料結構-圖-C語言-PTA-Complete Binary Search Tree

Data Structures and Algorithms (English) 7-7 Complete Binary Search Tree #include <stdio.h> #include <stdlib.h> #include <math.

資料結構-圖-C語言-鄰接矩陣-圖的遍歷

資料結構-圖-C語言-鄰接矩陣-圖的遍歷 bool visited[999]; void visit(Vertex V) { printf("正在訪問頂點%d\n", V); } bool isEdge(MGraph graph, Vertex v, Vertex w) { re

資料結構-圖-C語言-PTA-Saving James Bond - Easy Version

Data Structures and Algorithms (English) 7-10 Saving James Bond - Easy Version 以下為自己寫的版本,難過的是測試點2無法通過 #include <stdio.h> #include <

資料結構c語言版)中線性表的單鏈表儲存結構

本文轉自:https://blog.csdn.net/prlhnxx/article/details/79174782 /* run this program using the console pauser or add your own getch, system("pause") or i

關於嚴蔚敏老師《資料結構C語言版)》書中程式碼的誤解

清華大學嚴蔚敏老師的《資料結構(C語言版)》以其嚴謹被奉為經典,我是從其Pascal版一路追著買到C語言版,一直覺得這本書理論功力深厚,是不可多得的資料結構教材。但其編寫過程中為避免太過拘泥於具體語言細節,使用了ADT描述,具體演算法中使用了偽碼描述,對於新手直接把程式碼原樣照抄是沒法直接在電腦

樹的三種遍歷方法程式碼實現 (資料結構C語言

樹的三種遍歷方法:前序,中序和後序及其程式碼實現。 在此分別總結先序,中序,後序的結點輸出順序。   先序: 1.訪問根結點     2.訪問左子樹     3.訪問右子樹  中序:1.訪問左子樹      2.訪問

資料結構C語言)棧的建立、入棧、出棧並進行進位制轉換

十進位制數轉換為八進位制: | N |N div 8(商) | N mod 8(餘數) |1348| 168 | 4 | 168 | 21 | 0

資料結構c語言)——鏈佇列儲存結構及實現

是佇列鴨,FIFO,先進先出! 對於帶頭節點的和不帶頭節點的鏈佇列的操作有個小小的區別: 不帶頭結點的鏈佇列在入佇列的時候,第一個元素時要先判斷是否為空,再插入。而帶頭結點不需要,操作更方便些;  我是分割線-----------------------------

資料結構C語言實現):判斷兩棵二叉樹是否相等,bug求解

判斷兩棵二叉樹是否相等。 遇到了bug,求大神幫忙!!! C語言原始碼: #include <stdio.h> #include <stdlib.h> #include <malloc.h> #define OK 1 #define