陣列 array 概述

2021-08-07 03:27:36 字數 2683 閱讀 1802

陣列在記憶體中的儲存方式是連續、不間斷的,訪問陣列中的元素需要按索引值訪問。

對於資料型別t和常整數n,宣告乙個陣列的格式如下:

t a[n];

該宣告有兩個效果:1、在記憶體中分配一段l*n位元組,連續的區域,其中l是資料型別t的大小;2、引進乙個符號a,可以用作指向陣列起始位置的指標。這個指標的值(陣列首位址)假設為x

a,那麼陣列元素i(0<=ia+i*l。

x86-64的記憶體引用指令可以用來簡化陣列訪問的,比如e是乙個整型陣列,我們想要訪問e[i],而陣列的首位址(e的值)儲存在暫存器%rdx中,i儲存在暫存器%rcx中,那麼movl (%rdx,%rcx,4) %eax  指令就會計算位址xe+4i,並將結果儲存在%eax中。縮放因子可以取1,2,4,8,這些數字涵蓋了所有的基本資料的大小。

陣列的儲存分配和初始化

陣列可以定義為靜態儲存型(static)、外部儲存型(extern)、自動儲存型(auto)、全域性靜態區陣列,其中只有auto型陣列(有區域性作用域,定義在函式內部)被分配在棧中,其它型別陣列都分配在靜態資料區。

n可以是乙個巨集定義,乙個整型常量或者乙個整型變數。

//#define n 8             //巨集定義

// const int n = 8; //整型常量

int n; //整型變數

n = 8;

int a[n]= ;

陣列與指標

指標和陣列都用於處理位址運算,陣列元素的引用可以使用指標來實現。

假設int a[10],int *ptr .ptr = a。

a = &a[0]

&a[i] = ptr + i = a + i

a[i] = ptr[i] = *(ptr +i) = *(a +i)

其中指標的加法需要注意 :ptr+i的值實際上在計算是應該是ptr+4*i

陣列與指標的區別

1、sizeof操作符:sizeof(a)= 40,是這個陣列所占用的位元組數;sizeof(ptr)= 8或者4,是這個指標所占用的位元組數,在64位機器上為8,在32位機器上是4.

2、ptr是乙個左值,可以修改,但a不是左值,不可以對其進行賦值。

多維陣列

t a[m][n]

c語言中的多維陣列滿足「行優先」的順序,即在初始化或賦值時首先對行填充。

a[0]即第一行共n個元素,也是乙個陣列

比如int a[3][2]= ;就是乙個3行2列的二維陣列。第一行1,2第二行3,4…

對於陣列 t a[m][n]它的陣列元素a[i][j]的記憶體位址為& a[i][j]=xa+l(n*i+j),由這個公式可以看出m並不是必須的,所以有時候在定義多維陣列時可以寫為t a[n]

指標陣列和多維陣列

由若干個指向同類目標的指標變數組成的陣列稱為指標陣列:t* a[n];

乙個指標陣列可以實現乙個二維陣列:

#include

int main(int argc, char *argv)

static short num[4] = ,};

static short *pn = ;

static short s[2] = ;

inti, j;

for(i = 0; i < 2; i++){

for(j = 0; j< 4; j++)

s[i] += *pn[i]++;

printf("sum of line %d : %d\n",i+1,s[i]);

return 0;

結構體資料的分配訪問

結構體可以將不同型別資料整合在乙個資料結構中,組成結構體的每個資料稱為結構體的成員或者字段。

結構體中的資料成員存放在儲存器中的一段連續的儲存區中,指向結構體的指標就是其第乙個位元組的位址。編譯器在處理結構型資料時,根據每個成員的資料型別獲得相應的位元組偏移量,然後通過每個成員的位元組偏移量來訪問結構成員。

資料對齊

計算機的每個位元組都有乙個位址編號,如果計算機系統中訪存機制每次訪存最多只能讀寫64位,即8位元組寬的儲存機制,那麼0~7這些位元組可以同時讀寫,8~15這些位元組可以同時讀寫,以此類推,因此,如果一條指令訪問的資料不在位址為8i~8i+7之間的儲存範圍內,那麼就需要訪問儲存器兩次,因此資料在儲存器中存放時需要進行對齊,以避免多次訪存而帶來的指令執行效率低下。

·        windows:任何k位元組的基本物件的位址必須是k的倍數,char型別不用對齊

·        linux:2位元組資料型別的位址必須為2的倍數 ,較大的資料型別的位址必須是4的倍數

對於乙個結構體來說,所佔據的記憶體空間必須是最大的型別所需位元組的倍數。

在機器**中.align int 指令指明了它後面的資料的起始位址是int的倍數,int取值2、4、8,等於結構體中最大的資料型別所佔的位元組數。

結構體中的元素排列有乙個技巧:將大的資料型別放在前面,小的放在後面。

對齊後的長度必須是成員中最大的對齊引數的整數倍,這樣在處理陣列時可以保證每一項都邊界對齊

總結如下:

陣列:按照基本資料型別對齊,第乙個對齊了後面的自然也就對齊了。

聯合:按其包含的長度最大的資料型別對齊。

結構體:結構體中每個資料型別都要對齊。

array陣列物件

建立陣列兩種方式 1 建構函式 var arr new array 3 2 字面量 var arr1 trueinstanceof關鍵字 判斷 變數 instanceof 物件 true false console.log arr1 instanceof array falsearray.isarr...

陣列array處理資料

在下面鏈結,我曾經摘錄過關於陣列的 今天看到 using sas arrays to manipulate data 一文,正好可以對array進行乙個總結。首先,array的語法結構為 array array name length variable names 通過陣列我們可以進行重複計算,建立...

陣列(Array)的複製

public class usearray int s2 new int s.length s2動態初始化分配空間 int s3 int s4 new int s.length s4動態初始化分配空間 display s system.out.println s2 use for cycled me...