一維數組的創建與初始化
數組是一種相同類型元素的集合
程序一:
#include<stdio.h> #include<string.h> int main() { 創建一個數組 int arr1[10];// [常量] 初始化 int arr[10]={1,2,3};不完全初始化,剩下的元素默認初始化0. char arr2[5]; 初始化 char arr[5]={'a','b'};,不完全初始化,剩下元素默認初始化0. 初始化 char arr[5]="ab" 這是可行的,因為隱藏一個'\0',后面的0使我們自己給的(這個字符串都給給它的==),不是系統默認 int n = 5; char ch[n]; 這樣創建數組是錯誤,因為n還是變量,值是被賦值了,并不會改變它的屬性 char arr3[5] = { 'a', 98/*b的ASCII碼等于98*/ };//可行 上式等價于下式 char arr3[5] = {'a','b'} char arr4[] = "abcd";//加上后面隱藏的'\0',大小為5 當我們并沒有指定大小的時候,它會根據后面的數據,自己給定大小 char arr5[] = "abcdef"; printf("%d\n",sizeof(arr5));// 7 sizeof暈倒'\0',把它算進去,在停止計算 printf("%d\n", strlen(arr5));//6 strlen是遇到'\0'(不包含),就停止計算 char arr6[] = { 'a', 'b','c','\0' }; printf("%d\n",strlen(arr6));//如果沒有'\0'結束標志符,它會一直算個數,直到遇到'\0',輸出的是一個隨機數 printf("%d\n", sizeof(arr6));//沒有'\0'它就少算一個就是3 return 0; }
程序二:
#include<stdio.h> #include<string.h> int main() { char arr[] = "abcdef";//元素下標是從0開始 pritnf("%c\n",arr[0]); //arr[0] == a,表示首元素a,輸出結果為a 如果要依次打印字符串所有元素用循環更簡單,字符串的 '\0' 是隱藏的,一般是不用打印的 int i = 0; int len = strlen(arr);// 計算元素個數 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(數組名)計算的整個數組的字節大小,我們只要再求一個元素的大小就可以了,因為 數組是一群相同類型數據的集合,所以我 // 假設 int a[10]; 數組 a 有 10個 int(4byte) 類型的元素,整個數組的大小就是 4*10 == 40 byte, 數組大小除以數組元素大小,不就是數組元素個數嘛。(40/4 == 10) int i = 0; for (i = 0; i < sz; i++) { printf("%d ",arr[i]); printf("&arr[%d]=%p\n",i,&arr[i]);// 打印 數組對應下標元素的地址 } return 0; }
程序四(二維數組 - 二維數組 的 列 絕對不能 省略 )
#include<stdio.h> int main() { ///int arr[3][4];//存儲一個三行四列的數據 3是行(3個一維數組),4是列 int arr1[3][4] = {1,2,3,4,5}; 假設 數據 是這樣存的,在內存是連續存儲的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 一行的數據 是根據元素加個后面的{ },方便你們去區分,再根據列數確定 一行有多少個元素 int arr3[][4] = { { 1, 2, 3 }, { 4, 5 } }; 1 2 3 0 4 5 0 0 二維數組不管行還是列,下標都是從0開始,而且 二維數組的 行 是可以省略的,它會根據 元素 和 列的值,來確定行數 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; }
二維數組在內存中的存儲
在內存中實際存儲情況,第一行完了,第二行緊跟在第一行,第三行緊跟在第二行,int a[2][2]={1,2,3,4}, 在內存中存儲情況為 1 2 3 4 (小端)
因為 數組的首元素地址是最小的,后面元素,地址依次增大(大約增大 一個元素的類型的字節大小)
程序一
#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,二維數組與一維數組一樣,都連續存儲 } } return 0; }
數組作為函數參數,怎么作?
實例:冒泡排序
#include<stdio.h> void bubble_sort(int arr[],int sz) { 確定冒號排序的趟數 int i = 0; for (i = 0; i < sz - 1; i++)// 排序要排 元素總個數-1,最后一個元素不用排 { int flag = 1;//假設這一趟的數據已經有序 int j = 0; for (j = 0; j < sz-1-i; j++)// 每一趟冒號排序的過程 { if (arr[j] > arr[j + 1]) { int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; flag = 0;//本趟排序的數據不完全有序 } } 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); 對數組arr進行傳參,傳遞的是數組arr首元素的地址 for (i = 0; i < sz; i++) { printf("%d ",arr[i]);//0,1,2,3,4,5,6,7,8,9 } return 0; }
數組名:
#include<stdio.h> int main() { int arr[] = { 1, 2, 3, 4, 5, 6, 7 };//數組隨著下標的增長,地址是由低到高變化點 printf("%p\n",arr); 數組名就是數組首元素地址,是一樣的。見附圖1 printf("%p\n",&arr[0]); 但有兩個意外 1.sizeof(數組名) - 數組名表示整個數組 ,計算的是整個數組的大小,單位為字節(byte) int sz = sizeof(arr); printf("%d\n",sz);// 4(元素大小)* 7(元素個數)== 28,效果見附圖 2 2.&(數組名),數組名代表整個數組,&數組名,取的是整個數組的地址 printf("%p\n", &arr);//表示數組的起始地址,是整個數組的地址 上下兩者的值一樣,但 意義完全不同,效果圖 見附圖 3 printf("%p\n", arr);//首元素的地址 //進一步論證 &arr 和 arr的意義完全不同,不同在哪里 printf("%p\n", &arr+1);//地址增加28字節,一個元素4byte,7個元素28字節,意味著 &arr + 1 跳過一整個數組的元素,指向最后一個元素后面的地址 printf("%p\n", arr+1);//地址增加4字節,意味著 arr +1,跳過一個元素,改地址 arr+1,指向第二個元素 效果見附圖 4 return 0; }
關于數組名,有興趣的,可以看看我這篇文章指針和數組試題解析(重置版)
附圖1;
附圖2:
附圖3:
附圖4:
本文結束
到此這篇關于C語言 array數組的用法詳解的文章就介紹到這了,更多相關C語言 array數組內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/DarkAndGrey/article/details/120606396