在學(xué)習(xí)語言時,我們都會遇到數(shù)組.大學(xué)期間學(xué)過C,C++,Java,C#.這些語言中都學(xué)了數(shù)組,那時候用的不多,概念比較模糊,現(xiàn)在又學(xué)了php,里面也有數(shù)組,就打算寫一篇筆記總結(jié)下不同語言的數(shù)組之間的異同.
首先看下C是怎么定義數(shù)組的:
C 語言支持?jǐn)?shù)組數(shù)據(jù)結(jié)構(gòu)职祷,它可以存儲一個固定大小的相同類型元素的順序集合。數(shù)組是用來存儲一系列數(shù)據(jù),但它往往被認(rèn)為是一系列相同類型的變量。數(shù)組的聲明并不是聲明一個個單獨的變量,比如 number0父晶、number1、...、number99逸吵,而是聲明一個數(shù)組變量,比如 numbers缝裁,然后使用 numbers[0]扫皱、numbers[1]、...捷绑、numbers[99] 來代表一個個單獨的變量韩脑。數(shù)組中的特定元素可以通過索引訪問。所有的數(shù)組都是由連續(xù)的內(nèi)存位置組成粹污。最低的地址對應(yīng)第一個元素段多,最高的地址對應(yīng)最后一個元素。
聲明數(shù)組(需要指定元素的類型和元素的數(shù)量):
type arrayName [ arraySize ];
這叫做一維數(shù)組壮吩。arraySize 必須是一個大于零的整數(shù)常量进苍,type 可以是任意有效的 C 數(shù)據(jù)類型蕾总。例如,要聲明一個類型為 double 的包含 10 個元素的數(shù)組 balance(可以容納 10 個類型為 double 的數(shù)字琅捏。)生百,聲明語句如下:
double balance[10];
在 C 中,可以逐個初始化數(shù)組柄延,也可以使用一個初始化語句
double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
如何訪問數(shù)組?
double salary = balance[9];
上面的語句將把數(shù)組中第 10 個元素的值賦給 salary 變量蚀浆。下面的實例使用了上述的三個概念,即搜吧,聲明數(shù)組市俊、數(shù)組賦值、訪問數(shù)組:
#include <stdio.h>
int main ()
{
int n[ 10 ]; /* n 是一個包含 10 個整數(shù)的數(shù)組 */
int i,j;
/* 初始化數(shù)組元素 */
for ( i = 0; i < 10; i++ )
{
n[ i ] = i + 100; /* 設(shè)置元素 i 為 i + 100 */
}
/* 輸出數(shù)組中每個元素的值 */
for (j = 0; j < 10; j++ )
{
printf("Element[%d] = %d\n", j, n[j] );
}
return 0;
}
編譯結(jié)果
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 語言支持多維數(shù)組(二維數(shù)組)滤奈。多維數(shù)組聲明的一般形式如下:
type name[size1][size2]...[sizeN];
一個二維數(shù)組摆昧,在本質(zhì)上,是一個一維數(shù)組的列表蜒程。聲明一個 x 行 y 列的二維整型數(shù)組绅你,形式如下:
type arrayName [ x ][ y ];
type 可以是任意有效的 C 數(shù)據(jù)類型,arrayName 是一個有效的 C 標(biāo)識符昭躺。一個二維數(shù)組可以被認(rèn)為是一個帶有 x 行和 y 列的表格.
數(shù)組中的每個元素是使用形式為 a[ i , j ] 的元素名稱來標(biāo)識的忌锯,其中 a 是數(shù)組名稱,i 和 j 是唯一標(biāo)識 a 中每個元素的下標(biāo)领炫。
初始化二維數(shù)組
多維數(shù)組可以通過在括號內(nèi)為每行指定值來進(jìn)行初始化偶垮。下面是一個帶有 3 行 4 列的數(shù)組
int a[3][4] = {
{0, 1, 2, 3} , /* 初始化索引號為 0 的行 */
{4, 5, 6, 7} , /* 初始化索引號為 1 的行 */
{8, 9, 10, 11} /* 初始化索引號為 2 的行 */
};
內(nèi)部嵌套的括號是可選的,下面的初始化與上面是等同的:
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
訪問二維數(shù)組元素
二維數(shù)組中的元素是通過使用下標(biāo)(即數(shù)組的行索引和列索引)來訪問的帝洪。例如:int val = a[2][3];
上面的語句將獲取數(shù)組中第 3 行第 4 個元素似舵。下面使用嵌套循環(huán)來處理二維數(shù)組:
#include <stdio.h>
int main ()
{
/* 一個帶有 5 行 2 列的數(shù)組 */
int a[5][2] = { {0,0}, {1,2}, {2,4}, {3,6},{4,8}};
int i, j;
/* 輸出數(shù)組中每個元素的值 */
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;
}
結(jié)果:
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 傳遞數(shù)組給函數(shù)
通過指定不帶索引的數(shù)組名稱來給函數(shù)傳遞一個指向數(shù)組的指針。
三種方式來聲明函數(shù)形式參數(shù)
- 形參是一個指針
void myFunction(int *param)
{
...
}
- 形參是一個已定義大小的數(shù)組
void myFunction(int param[10])
{
...
}
形參是一個未定義大小的數(shù)組
void myFunction(int param[ ])
{
...
}
C 從函數(shù)返回數(shù)組
C 語言不允許返回一個完整的數(shù)組作為函數(shù)的參數(shù)葱峡。但是砚哗,可以通過指定不帶索引的數(shù)組名來返回一個指向數(shù)組的指針。再來學(xué)習(xí)本章的內(nèi)容族沃。如果想要從函數(shù)返回一個一維數(shù)組频祝,必須聲明一個返回指針的函數(shù).
另外,C 不支持在函數(shù)外返回局部變量的地址脆淹,除非定義局部變量為 static 變量常空。
#include <stdio.h>
/* 要生成和返回隨機(jī)數(shù)的函數(shù) */
int * getRandom( )
{
static int r[10];
int i;
/* 設(shè)置種子 */
srand( (unsigned)time( NULL ) );
for ( i = 0; i < 10; ++i)
{
r[i] = rand();
printf( "r[%d] = %d\n", i, r[i]);
}
return r;
}
/* 要調(diào)用上面定義函數(shù)的主函數(shù) */
int main ()
{
/* 一個指向整數(shù)的指針 */
int *p;
int i;
p = getRandom();
for ( i = 0; i < 10; i++ )
{
printf( "*(p + %d) : %d\n", i, *(p + i));
}
return 0;
}
結(jié)果:
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