C語(yǔ)言 array數(shù)組的用法詳解
一維數(shù)組的創(chuàng)建與初始化
數(shù)組是一種相同類型元素的集合
程序一:
#include<stdio.h> #include<string.h> int main() { 創(chuàng)建一個(gè)數(shù)組 int arr1[10];// [常量] 初始化 int arr[10]={1,2,3};不完全初始化,剩下的元素默認(rèn)初始化0. char arr2[5]; 初始化 char arr[5]={'a','b'};,不完全初始化,剩下元素默認(rèn)初始化0. 初始化 char arr[5]="ab" 這是可行的,因?yàn)殡[藏一個(gè)'\0',后面的0使我們自己給的(這個(gè)字符串都給給它的==),不是系統(tǒng)默認(rèn) int n = 5; char ch[n]; 這樣創(chuàng)建數(shù)組是錯(cuò)誤,因?yàn)閚還是變量,值是被賦值了,并不會(huì)改變它的屬性 char arr3[5] = { 'a', 98/*b的ASCII碼等于98*/ };//可行 上式等價(jià)于下式 char arr3[5] = {'a','b'} char arr4[] = "abcd";//加上后面隱藏的'\0',大小為5 當(dāng)我們并沒(méi)有指定大小的時(shí)候,它會(huì)根據(jù)后面的數(shù)據(jù),自己給定大小 char arr5[] = "abcdef"; printf("%d\n",sizeof(arr5));// 7 sizeof暈倒'\0',把它算進(jìn)去,在停止計(jì)算 printf("%d\n", strlen(arr5));//6 strlen是遇到'\0'(不包含),就停止計(jì)算 char arr6[] = { 'a', 'b','c','\0' }; printf("%d\n",strlen(arr6));//如果沒(méi)有'\0'結(jié)束標(biāo)志符,它會(huì)一直算個(gè)數(shù),直到遇到'\0',輸出的是一個(gè)隨機(jī)數(shù) printf("%d\n", sizeof(arr6));//沒(méi)有'\0'它就少算一個(gè)就是3 return 0; }
程序二:
#include<stdio.h> #include<string.h> int main() { char arr[] = "abcdef";//元素下標(biāo)是從0開(kāi)始 pritnf("%c\n",arr[0]); //arr[0] == a,表示首元素a,輸出結(jié)果為a 如果要依次打印字符串所有元素用循環(huán)更簡(jiǎn)單,字符串的 '\0' 是隱藏的,一般是不用打印的 int i = 0; int len = strlen(arr);// 計(jì)算元素個(gè)數(shù) for (i = 0; i < len; i++) { printf("%c ",arr[i]);// a b c d e f } return 0; }
程序三
#include<stdio.h> int main() { int arr[] = {1,2,3,4,5,6,7,8,9,10}; int sz = sizeof(arr) / sizeof(arr[0]); // sizeof(數(shù)組名)計(jì)算的整個(gè)數(shù)組的字節(jié)大小,我們只要再求一個(gè)元素的大小就可以了,因?yàn)?數(shù)組是一群相同類型數(shù)據(jù)的集合,所以我 // 假設(shè) int a[10]; 數(shù)組 a 有 10個(gè) int(4byte) 類型的元素,整個(gè)數(shù)組的大小就是 4*10 == 40 byte, 數(shù)組大小除以數(shù)組元素大小,不就是數(shù)組元素個(gè)數(shù)嘛。(40/4 == 10) int i = 0; for (i = 0; i < sz; i++) { printf("%d ",arr[i]); printf("&arr[%d]=%p\n",i,&arr[i]);// 打印 數(shù)組對(duì)應(yīng)下標(biāo)元素的地址 } return 0; }
程序四(二維數(shù)組 - 二維數(shù)組 的 列 絕對(duì)不能 省略 )
#include<stdio.h> int main() { ///int arr[3][4];//存儲(chǔ)一個(gè)三行四列的數(shù)據(jù) 3是行(3個(gè)一維數(shù)組),4是列 int arr1[3][4] = {1,2,3,4,5}; 假設(shè) 數(shù)據(jù) 是這樣存的,在內(nèi)存是連續(xù)存儲(chǔ)的12345000..... 1234 5000 0000 int arr2[3][4] = { { 1, 2, 3 } , { 4, 5 } }; 1 2 3 0 4 5 0 0 0 0 0 0 一行的數(shù)據(jù) 是根據(jù)元素加個(gè)后面的{ },方便你們?nèi)^(qū)分,再根據(jù)列數(shù)確定 一行有多少個(gè)元素 int arr3[][4] = { { 1, 2, 3 }, { 4, 5 } }; 1 2 3 0 4 5 0 0 二維數(shù)組不管行還是列,下標(biāo)都是從0開(kāi)始,而且 二維數(shù)組的 行 是可以省略的,它會(huì)根據(jù) 元素 和 列的值,來(lái)確定行數(shù) int arr4[3][4] = { { 1, 2, 3 }, { 4, 5 } }; int i = 0; for (i = 0; i < 3; i++) { int j = 0; for (j = 0; j < 4; j++) { printf("%d ",arr4[i][j]);1 2 3 0 4 5 0 0 0 0 0 0 } printf("\n"); } return 0; }
二維數(shù)組在內(nèi)存中的存儲(chǔ)
在內(nèi)存中實(shí)際存儲(chǔ)情況,第一行完了,第二行緊跟在第一行,第三行緊跟在第二行,int a[2][2]={1,2,3,4}, 在內(nèi)存中存儲(chǔ)情況為 1 2 3 4 (小端)
因?yàn)?數(shù)組的首元素地址是最小的,后面元素,地址依次增大(大約增大 一個(gè)元素的類型的字節(jié)大小)
程序一
#include<stdio.h> int main() { int arr[3][4] = { { 1, 2, 3 }, { 4, 5 } }; 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]); arr[0][3]和arr[1][0]地址相差4,二維數(shù)組與一維數(shù)組一樣,都連續(xù)存儲(chǔ) } } return 0; }
數(shù)組作為函數(shù)參數(shù),怎么作?
實(shí)例:冒泡排序
#include<stdio.h> void bubble_sort(int arr[],int sz) { 確定冒號(hào)排序的趟數(shù) int i = 0; for (i = 0; i < sz - 1; i++)// 排序要排 元素總個(gè)數(shù)-1,最后一個(gè)元素不用排 { int flag = 1;//假設(shè)這一趟的數(shù)據(jù)已經(jīng)有序 int j = 0; for (j = 0; j < sz-1-i; j++)// 每一趟冒號(hào)排序的過(guò)程 { if (arr[j] > arr[j + 1]) { int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; flag = 0;//本趟排序的數(shù)據(jù)不完全有序 } } if (1 == flag) { break; } } } int main() { int arr[] = { 0, 8, 7, 6, 5, 4, 3, 2, 1, 9 }; int i = 0; int sz = sizeof(arr) / sizeof(arr[0]); bubble_sort(arr,sz); 對(duì)數(shù)組arr進(jìn)行傳參,傳遞的是數(shù)組arr首元素的地址 for (i = 0; i < sz; i++) { printf("%d ",arr[i]);//0,1,2,3,4,5,6,7,8,9 } return 0; }
數(shù)組名:
#include<stdio.h> int main() { int arr[] = { 1, 2, 3, 4, 5, 6, 7 };//數(shù)組隨著下標(biāo)的增長(zhǎng),地址是由低到高變化點(diǎn) printf("%p\n",arr); 數(shù)組名就是數(shù)組首元素地址,是一樣的。見(jiàn)附圖1 printf("%p\n",&arr[0]); 但有兩個(gè)意外 1.sizeof(數(shù)組名) - 數(shù)組名表示整個(gè)數(shù)組 ,計(jì)算的是整個(gè)數(shù)組的大小,單位為字節(jié)(byte) int sz = sizeof(arr); printf("%d\n",sz);// 4(元素大小)* 7(元素個(gè)數(shù))== 28,效果見(jiàn)附圖 2 2.&(數(shù)組名),數(shù)組名代表整個(gè)數(shù)組,&數(shù)組名,取的是整個(gè)數(shù)組的地址 printf("%p\n", &arr);//表示數(shù)組的起始地址,是整個(gè)數(shù)組的地址 上下兩者的值一樣,但 意義完全不同,效果圖 見(jiàn)附圖 3 printf("%p\n", arr);//首元素的地址 //進(jìn)一步論證 &arr 和 arr的意義完全不同,不同在哪里 printf("%p\n", &arr+1);//地址增加28字節(jié),一個(gè)元素4byte,7個(gè)元素28字節(jié),意味著 &arr + 1 跳過(guò)一整個(gè)數(shù)組的元素,指向最后一個(gè)元素后面的地址 printf("%p\n", arr+1);//地址增加4字節(jié),意味著 arr +1,跳過(guò)一個(gè)元素,改地址 arr+1,指向第二個(gè)元素 效果見(jiàn)附圖 4 return 0; }
關(guān)于數(shù)組名,有興趣的,可以看看我這篇文章指針和數(shù)組試題解析(重置版)
附圖1;
附圖2:
附圖3:
附圖4:
本文結(jié)束
到此這篇關(guān)于C語(yǔ)言 array數(shù)組的用法詳解的文章就介紹到這了,更多相關(guān)C語(yǔ)言 array數(shù)組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言中對(duì)于循環(huán)結(jié)構(gòu)優(yōu)化的一些入門級(jí)方法簡(jiǎn)介
這篇文章主要介紹了C語(yǔ)言中對(duì)于循環(huán)結(jié)構(gòu)優(yōu)化的一些入門級(jí)方法,包括算法設(shè)計(jì)的改進(jìn)來(lái)提高一些并行性等方法,要的朋友可以參考下2015-12-12Qt+QWidget實(shí)現(xiàn)簡(jiǎn)約美觀的加載動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了Qt如何結(jié)合QWidget實(shí)現(xiàn)簡(jiǎn)約美觀的加載動(dòng)畫(huà),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02C++?OpenCV實(shí)戰(zhàn)之車道檢測(cè)
這篇文章主要介紹了基于C++?OpenCV實(shí)現(xiàn)的車道檢測(cè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01使用C語(yǔ)言遞歸與非遞歸實(shí)現(xiàn)字符串反轉(zhuǎn)函數(shù)char *reverse(char *str)的方法
本篇文章是對(duì)使用C語(yǔ)言遞歸與非遞歸實(shí)現(xiàn)字符串反轉(zhuǎn)函數(shù)char *reverse(char *str)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C++多線程實(shí)現(xiàn)TCP服務(wù)器端同時(shí)和多個(gè)客戶端通信
通訊建立后首先由服務(wù)器端發(fā)送消息,客戶端接收消息;接著客戶端發(fā)送消息,服務(wù)器端接收消息,實(shí)現(xiàn)交互發(fā)送消息。本文主要介紹了C++多線程實(shí)現(xiàn)TCP服務(wù)器端同時(shí)和多個(gè)客戶端通信,感興趣的可以了解一下2021-05-05VS中動(dòng)態(tài)庫(kù)的創(chuàng)建和調(diào)用方式詳解
庫(kù)的存在形式本質(zhì)上來(lái)說(shuō)庫(kù)是一種可執(zhí)行代碼的二進(jìn)制,? 靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的區(qū)別主要是在鏈接階段處理庫(kù)的方式不同而區(qū)分的,本文介紹VS中動(dòng)態(tài)庫(kù)的創(chuàng)建和調(diào)用方式,感興趣的朋友一起看看吧2024-01-01復(fù)數(shù)乘法中的結(jié)構(gòu)體賦值實(shí)現(xiàn)代碼
復(fù)數(shù)乘法中的結(jié)構(gòu)體賦值實(shí)現(xiàn)代碼。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-10-10