柚子快報(bào)激活碼778899分享:c++ FX-數(shù)組的使用
柚子快報(bào)激活碼778899分享:c++ FX-數(shù)組的使用
1一維數(shù)組
1.1一維數(shù)組的創(chuàng)建和初始化
1.1.1數(shù)組的創(chuàng)建
//代碼1
int arr1[10];
char arr2[10];
float arr3[1];
double arr4[20];
//代碼2
//用宏定義的方式
#define X 3
int arr5[X];
//代碼3
//錯(cuò)誤使用
int count = 10;
int arr6[count];//數(shù)組時(shí)候可以正常創(chuàng)建?
注:數(shù)組創(chuàng)建, [] 中要給一個(gè)常量才可以,不能使用變量??梢灾苯佑贸A?,或者使用宏定義。
1.1.2數(shù)組的初始化
//1.數(shù)組大小和數(shù)值個(gè)數(shù)一致
int arr1[5] = {1,2,3,4,5}; 1 2 3 4 5
//2.數(shù)組大小大于初始數(shù)
int arr2[6] = {1,2,3}; 1 2 3 0 0 0
//3.不指定數(shù)組大小
int arr3[] = {1,2,3,4}; 1 2 3 4
//4.不指定字符數(shù)組大小
char arr5[] = {'a','b','c'}; a b c
//5.1字符數(shù)組存儲字符串
char arr6[] = "abcdef"; a b c d e f \0
//5.2字符數(shù)組的大小和字符串字符個(gè)數(shù)一致時(shí)
char arr6[6] = "abcdef"; a b c d e f
!!這樣初始化是有問題的,因?yàn)闊o法正常讀取字符串的結(jié)束標(biāo)志('\0'),導(dǎo)致字符串的長度和內(nèi)容不能得知!!
//6.字符數(shù)組大小大于字符串中的字符數(shù)
char arr7[6] = "zxc"; z x c \0 \0 \0
結(jié)論
數(shù)組是具有相同類型的集合,數(shù)組的大?。此甲止?jié)數(shù))由元素個(gè)數(shù)乘以單個(gè)元素的大小。數(shù)組只能夠整體初始化,不能被整體賦值。只能使用循環(huán)從第一個(gè)逐個(gè)遍歷賦值。初始化時(shí),數(shù)組的維度或元素個(gè)數(shù)可忽略 ,編譯器會根據(jù)花括號中元素個(gè)數(shù)初始化數(shù)組元素的個(gè)數(shù)。當(dāng)花括號中用于初始化值的個(gè)數(shù)不足數(shù)組元素大小時(shí),數(shù)組剩下的元素依次用0初始化。字符型數(shù)組在計(jì)算機(jī)內(nèi)部用的時(shí)對應(yīng)的ascii碼值進(jìn)行存儲的。一般用”“引起的字符串,不用數(shù)組保存時(shí),一般都被直接編譯到字符常量區(qū),并且不可被修改。
在內(nèi)存中的存儲
?1.2一維數(shù)組的使用
#include
int main()
{
int arr[10] = { 0 };//數(shù)組的不完全初始化
//計(jì)算數(shù)組的元素個(gè)數(shù)
int sz = sizeof(arr) / sizeof(arr[0]);
//對數(shù)組內(nèi)容賦值,數(shù)組是使用下標(biāo)來訪問的,下標(biāo)從0開始。所以:
int i = 0;//做下標(biāo),此時(shí)可以是變量
for (i = 0; i < 10; i++)
{
arr[i] = i;
}
//輸出數(shù)組的內(nèi)容
for (i = 0; i < 10; ++i)
{
printf("%d ", arr[i]);
}
return 0;
}
注意:
sizeof()操作符用于取長度,以字節(jié)為單位。sizeof(數(shù)組名)即求的時(shí)整個(gè)數(shù)組的大小。sizeof(首元素)即求數(shù)組單個(gè)元素大小。用0下標(biāo),是因?yàn)閿?shù)組至少存在一個(gè)有效元素,所以0下標(biāo)永遠(yuǎn)存在。 數(shù)組是使用下標(biāo)來訪問的,下標(biāo)是從0開始。 數(shù)組的大小可以通過計(jì)算得到。建議采用sizeof(arr)/sizeof(arr[0])這種方式。
1.3一維數(shù)組在內(nèi)存中的存儲
#include
int main()
{
int arr[10] = { 0 };
int size = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < size; ++i)
{
printf("&arr[%d] = %p\n", i, &arr[i]);
}
return 0;
}
仔細(xì)觀察輸出的結(jié)果,可知隨著數(shù)組下標(biāo)的增長,元素的地址,也在有規(guī)律的遞增。 由此可以得 出結(jié)論:數(shù)組在內(nèi)存中是連續(xù)存放的。
?
總結(jié):
數(shù)組在內(nèi)存中開辟是線性連續(xù)且遞增的。在c語言中,任何變量(基本變量,指針變量,結(jié)構(gòu)體變量,數(shù)組變量)的空間都是整體開辟,但任何元素的起始地址一定是開辟字節(jié)當(dāng)中最小的。
?2.二維數(shù)組
2.1二維數(shù)組的創(chuàng)建和初始化
2.1.1二維數(shù)組的創(chuàng)建
//數(shù)組創(chuàng)建
int arr[3][4];//[行數(shù)][列數(shù)]
char arr[][5];
double arr[2][4];
?二維數(shù)組創(chuàng)建時(shí),行數(shù)可以忽略不寫。并且所有維度的數(shù)組其第一個(gè)方括號的內(nèi)容可忽略。
2.1.2二維數(shù)組的初始化
//數(shù)組初始化
int arr[3][4] = {1,2,3,4};
int arr[3][4] = {{1,2},{4,5}};
int arr[][4] = {{2,3},{4,5}};
注意: 花括號中的一個(gè)花括號代表一個(gè)一維數(shù)組的初始化。當(dāng)里面無花括號分組時(shí),按照順序從第一個(gè)開始逐個(gè)進(jìn)行初始化。余下的未賦值的元素用0初始化。
2.2二維數(shù)組的使用
二維數(shù)組的使用也是通過下標(biāo)的方式,用雙重循環(huán)嵌套進(jìn)行索引使用。
#include
int main()
{
int arr[3][4] = { 0 };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
arr[i][j] = i * 4 + j;
}
}
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
printf("%d ", arr[i][j]);
}
}
return 0;
}
2.3二維數(shù)組在內(nèi)存中的存儲
#include
int main()
{
int arr[3][4];
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
}
}
return 0;
}
通過結(jié)果我們可以分析到,其實(shí)二維數(shù)組在內(nèi)存中也是連續(xù)存儲的。
?
注意:
二維數(shù)組在內(nèi)存的空間布局上,也是線性連續(xù)且遞增的?。?!二維數(shù)組本質(zhì)上也是一維數(shù)組,只不過內(nèi)部元素放的是一維數(shù)組。
3.數(shù)組作為參數(shù)
調(diào)用函數(shù)傳參數(shù)組時(shí),減少函數(shù)傳數(shù)組時(shí)的成本問題(時(shí)間和空間)。因?yàn)閭鲄r(shí),需要臨時(shí)拷貝,如果數(shù)組過大,可能會浪費(fèi)資源,嚴(yán)重的話可能棧溢出。數(shù)組元素降維成指向數(shù)組內(nèi)部元素類型的指針。對指針加一,加上所指向的類型的大小。
?3.1一維數(shù)組
#include
void Lisa(int arr[])
{
printf("a = %d\n", sizeof(arr));//數(shù)組降維成指針后的指針大小,在32位系統(tǒng)下指針都為4字節(jié)
printf("b = %d\n", sizeof(arr[0]));//數(shù)組首元素的大小
printf("sz =a / b = %d\n", sizeof(arr) / sizeof(arr[0]));//大小為1
printf("arr = %p\n", arr);//數(shù)組首元素地址
printf("&arr = %p\n", &arr);//指針的地址
printf("arr + 1 = %p\n", arr + 1);//下一個(gè)元素的地址
printf("&arr + 1 = %p\n", &arr + 1);//指針下一項(xiàng)的地址
}
int main(void)
{
int Shuzu[10] = { 0,1,2,3,4,5,6,7,8,9 };
printf("a = %d\n", sizeof(Shuzu));//數(shù)組總大小
printf("b = %d\n", sizeof(Shuzu[0]));//數(shù)組首元素大小
printf("sz =a / b = %d\n", sizeof(Shuzu) / sizeof(Shuzu[0]));//數(shù)組元素個(gè)數(shù)
printf("Shuzu = %p\n", Shuzu);//數(shù)組首元素地址
printf("&Shuzu = %p\n", &Shuzu);//代表整個(gè)數(shù)組,但是地址仍是首元素地址
printf("Shuzu + 1 = %p\n", Shuzu + 1);//下一個(gè)元素的地址
printf("&Shuzu + 1 = %p\n", &Shuzu + 1);//跳過整個(gè)數(shù)組后緊挨著的地址
//此時(shí)該地址減去首元素地址等于數(shù)組大小
printf("\n\n");
Lisa(Shuzu);
return 0;
}
補(bǔ)充
sizeof(數(shù)組名),計(jì)算整個(gè)數(shù)組的大小,sizeof內(nèi)部單獨(dú)放一個(gè)數(shù)組名,數(shù)組名表示整個(gè)數(shù)組。&數(shù)組名,取出的是數(shù)組的地址。&數(shù)組名,數(shù)組名表示整個(gè)數(shù)組。
?
?
總結(jié):
形參格式,例如int arr[ ]或者int *arr,兩者等價(jià)形參元素個(gè)數(shù)可被忽略,并且建議忽略(有可能改變了實(shí)參的大小,這樣比較方便)?;蛘咭部梢蕴顚懕葘?shí)參元素個(gè)數(shù)大的值。用sizeof()求數(shù)組元素個(gè)數(shù)時(shí),盡量在數(shù)組定義時(shí)求。因?yàn)閭鲄⒑髷?shù)組會降維成指針。
?3.2二維數(shù)組
#include
void Lisa(int arr[][4])
{
printf("a = %d\n", sizeof(arr));//數(shù)組降維成指針后的指針大小,在32位系統(tǒng)下指針都為4字節(jié)
printf("b = %d\n", sizeof(arr[0][0]));//數(shù)組首元素的大小
printf("sz =a / b = %d\n", sizeof(arr) / sizeof(arr[0][0]));//大小為1
printf("arr = %p\n", arr);//數(shù)組首元素地址
printf("arr + 1 = %p\n", arr + 1);//下一個(gè)元素的地址
printf("&arr = %p\n", &arr);//指針的地址
printf("&arr + 1 = %p\n", &arr + 1);//指針下一項(xiàng)的地址
}
int main(void)
{
int Shuzu[3][4] = { 0,1,2,3,4,5,6,7,8,9 };
printf("a = %d\n", sizeof(Shuzu));//數(shù)組總大小
printf("b = %d\n", sizeof(Shuzu[0][0]));//數(shù)組首元素大小
printf("sz =a / b = %d\n", sizeof(Shuzu) / sizeof(Shuzu[0][0]));//數(shù)組元素個(gè)數(shù)
printf("Shuzu = %p\n", Shuzu);//數(shù)組首元素地址
printf("Shuzu + 1 = %p\n", Shuzu + 1);//下一個(gè)元素的地址,這時(shí)其內(nèi)部元素的一維數(shù)組
printf("&Shuzu = %p\n", &Shuzu);//代表整個(gè)數(shù)組,但是地址仍是首元素地址
printf("&Shuzu + 1 = %p\n", &Shuzu + 1);//跳過整個(gè)數(shù)組后緊挨著的地址
//此時(shí)該地址減去首元素地址等于數(shù)組大小
printf("\n\n");
Lisa(Shuzu);
return 0;
}
?
?
形參格式,例如:int arr[][4]或者int (*arr)[4],這里為指向具有四個(gè)整型元素的一維數(shù)組的數(shù)組指針。除了第一個(gè)中括號里的數(shù)字可以省,后面的中括號的內(nèi)容不能省略,因?yàn)橄聵?biāo)是數(shù)組類型的一部分,省略掉就不明確其類型。注意: 看待所有的數(shù)組時(shí),都將它看作一維數(shù)組,只不過其內(nèi)部元素不一樣,例如:三維數(shù)組其內(nèi)部元素為二維數(shù)組,而二維數(shù)組也是有一維數(shù)組組成,都是線性連續(xù)且相等的。
4.數(shù)組指針和指針數(shù)組
數(shù)組指針:是指針,指向數(shù)組。例:int (*arr)[10]指針數(shù)組:是數(shù)組,數(shù)組內(nèi)容存放的是指針。例:int *arr[10]
然后,需要明確一個(gè)優(yōu)先級順序:()>[]>* 所以: (*p)[n]:根據(jù)優(yōu)先級,先看括號內(nèi),則p是一個(gè)指針,這個(gè)指針指向一個(gè)一維數(shù)組,數(shù)組長度為n,這是“數(shù)組的指針”,即數(shù)組指針; *p[n]:根據(jù)優(yōu)先級,先看[],則p是一個(gè)數(shù)組,再結(jié)合*,這個(gè)數(shù)組的元素是指針類型,共n個(gè)元素,這是“指針的數(shù)組”,即指針數(shù)組。
4.1指針數(shù)組
#include
int main(void)
{
int *p[4];
int arr1[3] = { 1,2,3 };
int arr2[4] = { 2,4,6,8 };
int arr3[5] = { 0 };
int arr4[2] = { 2,2 };
p[0] = arr1;
p[1] = arr2;
p[2] = arr3;
p[3] = arr4;
printf("%d\n", *(p[0] + 1));
printf("%d\n", *(p[1] + 1));
printf("%d\n", *(p[2] + 1));
printf("%d\n", *(p[3] + 1));
return 0;
}
首先,對于語句int*p[4],因?yàn)閇 ]的優(yōu)先級要比*要高,所以 p 先與[ ]結(jié)合,構(gòu)成一個(gè)數(shù)組的定義,數(shù)組名為 p,而int*修飾的是數(shù)組的內(nèi)容,即數(shù)組的每個(gè)元素。也就是說,該數(shù)組包含 4 個(gè)指向int類型數(shù)據(jù)的指針,如圖所示,因此,它是一個(gè)指針數(shù)組。
4.2數(shù)組指針
#include
int main(void)
{
int Shuzu[3][4] = { 0,1,2,3,4,5,6,7,8,9,0,0 };
int(*arr)[4] = Shuzu;
for (int i = 0;i < 3;i++)
{
for (int j = 0;j < 4;j++)
{
printf("arr[%d][%d]=%d ", i,j,arr[i][j] );
}
printf("\n");
}
return 0;
}
?
其次,對于語句int(*arr)[4],“( )”的優(yōu)先級比[ ]高,*號和 arr 構(gòu)成一個(gè)指針的定義,指針變量名為 arr,而 int 修飾的是數(shù)組的內(nèi)容,即數(shù)組的每個(gè)元素。也就是說,arr 是一個(gè)指針,它指向一個(gè)包含 4 個(gè)int類型數(shù)據(jù)的數(shù)組,如圖 所示。很顯然,它是一個(gè)數(shù)組指針。
?
?
柚子快報(bào)激活碼778899分享:c++ FX-數(shù)組的使用
相關(guān)鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。