Record24 陣列型別及陣列指標基礎

2021-10-02 01:41:52 字數 4454 閱讀 6354

目錄

陣列的理論知識

基本定義

陣列的初始化

陣列名的技術盲點

陣列型別

陣列指標

總體**

從元素型別角度看,

陣列是相同型別的變數的有序集合

測試指標變數占有記憶體空間大小;從記憶體角度看,陣列是互相

聯絡的一大片記憶體空間,如圖。

分為隱式指定和顯式指定兩種,其中:

隱式指定,相當於不指定陣列長度,為:

int b = ;
顯式指定,相當於指定陣列長度,為:

int a[10] = ; //其他初始化為0
1

陣列首元素的位址

陣列位址是兩個不同的概念。 2

)陣列名代表陣列首元素的位址,它是個常量。

解釋如下:

變數本質是記憶體空間的別名,一定義陣列,就分配記憶體,記憶體就固定了。所以陣列名起名以後就不能被修改了。

3)陣列首元素的位址和陣列的位址值相同(等)。

陣列的資料型別屬於複雜資料型別,不能單純的按以前的但看資料型別來覺得其記憶體的分配的長度。

陣列型別:

typedef int(myint5)[5]; //int 相當於定義了一種型別

typedef float(myfloat10)[10];

陣列定義:

myint5i array; int array[5];

myfloat10farray

下面來定義乙個陣列型別:

進行主函的編寫,

void main()

for (i = 0; i < 5; i++)

printf("hello...\n");

system("pause");

return;

}

執行結果如下:

以"int a[10]"為例,知:

1.陣列

名是陣列首元素的起始位址,但並不是陣列的起始位址;2.通過將取位址符

&作用於陣列名可以得到整個陣列的起始位址

//定義陣列指標 有兩種 1

)通過陣列型別定義陣列指標:

typedef

int(

arraytype

)[5];

arraytype

* pointer; 2)

宣告乙個陣列指標型別

typedef

int(*

mypointer

)[5];

mypointer

mypoint;

3)直接定義:

int(*pointer)[n]; 

pointer 

為陣列指標變數名

type 

為指向的陣列的型別

n  為指向的陣列的大小

注意這個地方是

type

型別(比如

int(*

pointer

)[10])

下面進行舉例說明,我們都知道"int *p = null"定義了乙個空指標p,那麼怎麼將這個指標指向已定義的陣列型別呢?

演示如何通過陣列型別 來定義乙個指向陣列型別的指標變數。

//c語言中最難的語法部分

void main()

parray = &a;

printf("hello...\n");

system("pause");

return;

}

如上**中進行的定義parray,是乙個指向陣列型別的指標變數,其定義方法,和普通的指標定義方法沒有什麼不一樣的,上**中拿普通指標p1的定義方式和其做對比,來進行推演。

那麼在定義好之後,如何通過指標來控制記憶體塊呢?下面繼續推演:

接著如上思路,變數a本身是陣列的一級指標,那麼當"&a"的時候,變成了陣列的二級指標了。那麼對於parray來說,須先把從「&a」處取的值,變成一級指標,然後再進行控制記憶體:

//我通過陣列指標的方式來操作a[5]這塊記憶體

//注意!這個地方比較難!

for (i=0;i<5;i++)

別想那麼多,特別是別跟前面說a儲存的是首個元素的位址,&a是取的陣列的首位址;就只想著parray是通過&a得到的,而操作記憶體空間是通過a來進行的,所以,要進行還原,所以才有了(*parray),其效果等同於a。

下面把其列印出來:

下面再做一步引申:

根據以上的推演,我們已經得出了陣列型別了,並且根據陣列型別我們可以控制記憶體,下面我想直接定義乙個陣列指標型別。

void main()

括號內部的部分優先順序高,所以,優先考慮括號內部的部分,上面**中(*myparraytype),帶有*號,說明其是個指標,其上表明,定義了乙個指標型別,這個指標型別是用來指向乙個陣列,就這個意思。

演進過程:首先,是定義了乙個型別(int),然後,再定義了乙個指標型別(*myparraytype),然後,繼續定義了乙個指向陣列的指標型別(*myparraytype)[5]。

注意!注意!注意!這個時候就可以解釋之前的多維陣列的步長問題了,因為在多維陣列中,從上一維向下一維度擴充套件,都是需要如上面所進行的過程的,都是要指定所指向的陣列的,上面的那個指向的陣列長度為[5],如果是在多維陣列中下一維的陣列長度就是指向上一維的陣列指標每次移動時候的步長。(我不知道我敘述清楚沒有,的確有點繞— —||)

下面接著,來看看陣列指標型別來操作記憶體:

int b[5];

mypoint = &b; //變數取位址傳給指標

//如何通過這個來操作記憶體

for (i= 0;i<5;i++)

for (i=0;i<5;i++)

對比之前的用陣列型別和用陣列指標型別兩種定義方式:

void main()

}

那這兩種方式定義指標變數還是比較麻煩的,c++編譯器的先驅們,在設計編譯器的時候,就考慮到了一種更簡單的方式:

直接定義的方式:

int (*pointer)[n];           

pointer 為陣列指標變數名

type 為指向的陣列的型別

n 為指向的陣列的大小

舉例說明:

void main()

這樣就通過非常簡單的方式來定義指標變數。而不像上面的那麼冗雜。

#define  _crt_secure_no_warnings 

#include #include #include typedef struct _teacher

; teacher;

void main11()

for (i = 0; i < 5; i++)

printf("hello...\n");

system("pause");

return;

}//c語言中最難的語法部分

//演示如何通過陣列型別 來定義乙個指向陣列型別的指標變數。

void main12()

parray = &a;

//我通過陣列指標的方式來操作a[5]這塊記憶體

//注意!這個地方比較難!

for (i=0;i<5;i++)

for (i = 0; i < 5; i++)

printf("hello...\n");

system("pause");

return;}

void main13()

mypoint = &b; //變數取位址傳給指標

//如何通過這個來操作記憶體

for (i= 0;i<5;i++)

for (i=0;i<5;i++)

system("pause");

return;

}void main()

system("pause");

}

陣列RECORD使用

record 型別的變數只能儲存從資料庫中查詢出的一行記錄,如果查詢出了多行記錄,就會出現錯誤。record型別變數直接賦值 declare type type record user is record user id number 10 user name varchar2 20 record ...

C 陣列 常用方法及屬性(24)

陣列長度 陣列名.length 清除元素值 array.clear 複製元素 array.copy 陣列名.copyto 轉殖 陣列名.clone 查詢元素 array.indexof array.lastindexof 排序 array.sort 反 array.reverse 查詢重複元素 in...

什麼是天線陣列及天線陣列型別

天線陣列,也可稱為相控陣列,是由兩個或更多個天線組成的一組天線。這些天線通過將訊號相互組合,從而實現比單個天線更高的效能。天線陣列可作用提高整體總增益,實現分集接收,抵消干擾,調至特定朝向,測量輸入訊號的 方向,以及最大程度地增大訊號干擾雜訊比 sinr 陣列天線通常由乙個以上的偶極子組成,但也可由...