在學習語言時,我們都會遇到數組.大學期間學過C,C++,Java,C#.這些語言中都學了數組,那時候用的不多,概念比較模糊,現在又學了php,里面也有數組,就打算寫一篇筆記總結下不同語言的數組之間的異同.
首先看下C是怎么定義數組的:
C 語言支持數組數據結構,它可以存儲一個固定大小的相同類型元素的順序集合。數組是用來存儲一系列數據,但它往往被認為是一系列相同類型的變量。數組的聲明并不是聲明一個個單獨的變量,比如 number0、number1、...、number99,而是聲明一個數組變量,比如 numbers,然后使用 numbers[0]、numbers[1]、...、numbers[99] 來代表一個個單獨的變量。數組中的特定元素可以通過索引訪問。所有的數組都是由連續的內存位置組成。最低的地址對應第一個元素,最高的地址對應最后一個元素。
聲明數組(需要指定元素的類型和元素的數量):
type arrayName [ arraySize ];
這叫做一維數組。arraySize 必須是一個大于零的整數常量,type 可以是任意有效的 C 數據類型。例如,要聲明一個類型為 double 的包含 10 個元素的數組 balance(可以容納 10 個類型為 double 的數字。),聲明語句如下:
double balance[10];
在 C 中,可以逐個初始化數組,也可以使用一個初始化語句
double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
如何訪問數組?
double salary = balance[9];
上面的語句將把數組中第 10 個元素的值賦給 salary 變量。下面的實例使用了上述的三個概念,即,聲明數組、數組賦值、訪問數組:
#include <stdio.h>
int main ()
{
int n[ 10 ]; /* n 是一個包含 10 個整數的數組 */
int i,j;
/* 初始化數組元素 */
for ( i = 0; i < 10; i++ )
{
n[ i ] = i + 100; /* 設置元素 i 為 i + 100 */
}
/* 輸出數組中每個元素的值 */
for (j = 0; j < 10; j++ )
{
printf("Element[%d] = %d\n", j, n[j] );
}
return 0;
}
編譯結果
Element[0] = 100 Element[1] = 101 Element[2] = 102 Element[3] = 103 Element[4] = 104 Element[5] = 105 Element[6] = 106 Element[7] = 107 Element[8] = 108 Element[9] = 109
C 語言支持多維數組(二維數組)。多維數組聲明的一般形式如下:
type name[size1][size2]...[sizeN];
一個二維數組,在本質上,是一個一維數組的列表。聲明一個 x 行 y 列的二維整型數組,形式如下:
type arrayName [ x ][ y ];
type 可以是任意有效的 C 數據類型,arrayName 是一個有效的 C 標識符。一個二維數組可以被認為是一個帶有 x 行和 y 列的表格.
數組中的每個元素是使用形式為 a[ i , j ] 的元素名稱來標識的,其中 a 是數組名稱,i 和 j 是唯一標識 a 中每個元素的下標。
初始化二維數組
多維數組可以通過在括號內為每行指定值來進行初始化。下面是一個帶有 3 行 4 列的數組
int a[3][4] = {
{0, 1, 2, 3} , /* 初始化索引號為 0 的行 */
{4, 5, 6, 7} , /* 初始化索引號為 1 的行 */
{8, 9, 10, 11} /* 初始化索引號為 2 的行 */
};
內部嵌套的括號是可選的,下面的初始化與上面是等同的:
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
訪問二維數組元素
二維數組中的元素是通過使用下標(即數組的行索引和列索引)來訪問的。例如:int val = a[2][3];
上面的語句將獲取數組中第 3 行第 4 個元素。下面使用嵌套循環來處理二維數組:
#include <stdio.h>
int main ()
{
/* 一個帶有 5 行 2 列的數組 */
int a[5][2] = { {0,0}, {1,2}, {2,4}, {3,6},{4,8}};
int i, j;
/* 輸出數組中每個元素的值 */
for ( i = 0; i < 5; i++ )
{
for ( j = 0; j < 2; j++ )
{
printf("a[%d][%d] = %d\n", i,j, a[i][j] );
}
}
return 0;
}
結果:
a[0][0]: 0
a[0][1]: 0
a[1][0]: 1
a[1][1]: 2
a[2][0]: 2
a[2][1]: 4
a[3][0]: 3
a[3][1]: 6
a[4][0]: 4
a[4][1]: 8
C 傳遞數組給函數
通過指定不帶索引的數組名稱來給函數傳遞一個指向數組的指針。
三種方式來聲明函數形式參數
- 形參是一個指針
void myFunction(int *param)
{
...
}
- 形參是一個已定義大小的數組
void myFunction(int param[10])
{
...
}
形參是一個未定義大小的數組
void myFunction(int param[ ])
{
...
}
C 從函數返回數組
C 語言不允許返回一個完整的數組作為函數的參數。但是,可以通過指定不帶索引的數組名來返回一個指向數組的指針。再來學習本章的內容。如果想要從函數返回一個一維數組,必須聲明一個返回指針的函數.
另外,C 不支持在函數外返回局部變量的地址,除非定義局部變量為 static 變量。
#include <stdio.h>
/* 要生成和返回隨機數的函數 */
int * getRandom( )
{
static int r[10];
int i;
/* 設置種子 */
srand( (unsigned)time( NULL ) );
for ( i = 0; i < 10; ++i)
{
r[i] = rand();
printf( "r[%d] = %d\n", i, r[i]);
}
return r;
}
/* 要調用上面定義函數的主函數 */
int main ()
{
/* 一個指向整數的指針 */
int *p;
int i;
p = getRandom();
for ( i = 0; i < 10; i++ )
{
printf( "*(p + %d) : %d\n", i, *(p + i));
}
return 0;
}
結果:
r[0] = 313959809
r[1] = 1759055877
r[2] = 1113101911
r[3] = 2133832223
r[4] = 2073354073
r[5] = 167288147
r[6] = 1827471542
r[7] = 834791014
r[8] = 1901409888
r[9] = 1990469526
*(p + 0) : 313959809
*(p + 1) : 1759055877
*(p + 2) : 1113101911
*(p + 3) : 2133832223
*(p + 4) : 2073354073
*(p + 5) : 167288147
*(p + 6) : 1827471542
*(p + 7) : 834791014
*(p + 8) : 1901409888
*(p + 9) : 1990469526