在數(shù)組這章 我們需要明確學習知識點如下:
首先要知道 數(shù)組是一組相同類型元素的集合,那該怎么創(chuàng)建呢?創(chuàng)建的方式為:type_t arr_name [const_n]//type_t代表這組數(shù)據(jù)的類型;arr_name代表數(shù)組名,最重要一點 const_n 是一個常量表達式 表示 數(shù)組的大小
例如:
int arr1[10];
// 下面這個數(shù)組能正常創(chuàng)建嗎
int count = 10;
int arr2[count];
我們可以用不同的編譯器試試
下面是在vs編譯器下的執(zhí)行結(jié)果:
我的電腦最近重裝系統(tǒng)了 虛擬機沒裝,但是變數(shù)組 在gcc編譯器下是支持的,我們只要知道創(chuàng)建數(shù)組在C99標準之前 只支持常量,C99標準修改了這一概念,但是 數(shù)組大小雖然可以用變量指定,但是肯定是不能初始化的,在以后做題過程中如果遇到類似的報錯,知道問題出在哪里就可以。
對于數(shù)組 初始化,我總結(jié)的重點 就是 需要了解,不完全初始化,已經(jīng)初始化元素內(nèi)容,我們可以用幾個例子來清晰它
int arr1[10] = {1,2,3 };
int arr2[] = {1,2,3,4 };
int arr3[5] = {1,2,3,4,5 };
char arr4[3] = {'a',34,'c' };
char arr5[] = {'a','v','c' };
char arr6[] = "abcdef";
我們可以通過內(nèi)存查看,初始化的過程是什么樣
可以看到arr1數(shù)組在雖然在內(nèi)存中開辟了是個元素,每個元素類型為整形,但是只是初始化了三個元素 剩下的七個元素被默認初始化為0。
對比arr2和arr3,我們可以看到 初始化給定元素個數(shù)限制和不給定元素個數(shù)的區(qū)別,我們即使不寫個數(shù),但是給定相應元素,系統(tǒng)會默認元素個數(shù)的。
對比arr4 和arr5 我們會發(fā)現(xiàn),當我們指定數(shù)組類型后,我們即使寫了數(shù)字,也會被系統(tǒng)默認成ASCII碼對應的字符。
對比arr5和arr6 我們會發(fā)現(xiàn),arr5初始化,我們定義字符的時候 系統(tǒng)不會默認加上結(jié)束\0標識符,但是初始化字符串的時候 系統(tǒng)會默認在末尾加入結(jié)束標識符 \0。
一維數(shù)組的使用其實一維數(shù)組的使用 就是我們之前了解的操作符[]
,下標引用操作符,他其實就是數(shù)組訪問操作符,看一下代碼就一目了然
#includeint main()
{int arr[10] = {0};//數(shù)組的不完全初始化
//計算數(shù)組的元素個數(shù)
int sz = sizeof(arr)/sizeof(arr[0]);
//對數(shù)組內(nèi)容賦值,數(shù)組是使用下標來訪問的,下標從0開始。所以:
int i = 0;//做下標
for(i=0; i<10; i++)//這里寫10,好不好?
{arr[i] = i;
}
//輸出數(shù)組的內(nèi)容
for(i=0; i<10; ++i)
{printf("%d ", arr[i]);
}
return 0;
}
這里需要注意的是
1、數(shù)組是使用下標來訪問的,下標是從0開始的。
2、 sizeof是操作符,他不是函數(shù),是用來計算操作數(shù)的大小,單位是字節(jié)。
3、當數(shù)組名作為sizeof的操作數(shù)時候,計算的是整個數(shù)組的大小,字節(jié)為單位哦。
補充:1. sizeof(數(shù)組名),計算整個數(shù)組的大小,sizeof內(nèi)部單獨放一個數(shù)組名,數(shù)組名表示整個數(shù)
組。
2. &數(shù)組名,取出的是數(shù)組的地址。&數(shù)組名,數(shù)組名表示整個數(shù)組。
除此1,2兩種情況之外,所有的數(shù)組名都表示數(shù)組首元素的地址。
我們都知道 對于變量的 存儲我們是在內(nèi)存中取個地址存儲,如:&a,數(shù)組訪問元素的時候是arr[i],那同樣的我們在內(nèi)存中存儲就應該是&arr[i],例程如下:
#includeint main()
{int arr[10] = {0};
int i = 0;
int sz = sizeof(arr)/sizeof(arr[0]);
for(i=0; iprintf("&arr[%d] = %p\n", i, &arr[i]);
}
return 0;
}
我們看看內(nèi)存中的情況:我們可以看到 也是占用四個字節(jié),而且數(shù)組在內(nèi)存中是連續(xù)存放的。
先給二維定個性,二維名字上來說 是行列,兩個維度,其實在內(nèi)存上存儲還是一維的,這點 我們可以待會用查看地址的方式進行論證。
二維數(shù)組的創(chuàng)建//數(shù)組創(chuàng)建
int arr[3][4];
char arr[3][5];
double arr[2][4];
二維數(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}};//二維數(shù)組如果有初始化,行可以省略,列不能省略
二維數(shù)組的使用#includeint 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;
}
二維數(shù)組在內(nèi)存中的存儲#includeint 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;
}
我們可以看看二維數(shù)組的內(nèi)存存儲:
我們可以將二維數(shù)組看成是一維數(shù)組的數(shù)組,則arr[0] 可看成是數(shù)組名,數(shù)組名可看成是首元素地址,我們可以通過代碼來解釋,遞增時,地址前進的步長;代碼如下:
#includeint main()
{int arr[10] = {1,2,3,4,5};
printf("%p\n", arr);
printf("%p\n", &arr[0]);
printf("%p\n", &arr[0] + 1);
printf("%d\n", *arr);
printf("%d\n", &arr + 1);
//輸出結(jié)果
return 0;
}
分析結(jié)果如下 數(shù)組地址加一 占用四十個字節(jié),首元素地址加一 占用四個字節(jié)
進一步驗證為什么二維數(shù)組列不能省略,如果省略了 那就不知道步長了,無法確定 下一組元素地址啦。
數(shù)組的下標是有范圍限制的。
數(shù)組的下規(guī)定是從0開始的,如果數(shù)組有n個元素,最后一個元素的下標就是n-1。
所以數(shù)組的下標如果小于0,或者大于n-1,就是數(shù)組越界訪問了,超出了數(shù)組合法空間的訪問。
C語言本身是不做數(shù)組下標的越界檢查,編譯器也不一定報錯,但是編譯器不報錯,并不意味著程序就
是正確的,
所以程序員寫代碼時,最好自己做越界的檢查
例如:
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
文章題目:C語言之數(shù)組-創(chuàng)新互聯(lián)
地址分享:http://jinyejixie.com/article32/gpisc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、微信公眾號、網(wǎng)站內(nèi)鏈、建站公司、微信小程序、網(wǎng)頁設計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)