二維數組在物理上以及邏輯上的數組維度
二維數組在邏輯上是二維的,在物理上是一維的
數組名作為類型、地址、對數組名取地址的區別
數組名作為類型:代表的是整個數組的大小
數組名作為地址:代表的是數組首元素的地址
對數組名取地址:代表的是數組的首地址
描述一維數組的不初始化、部分初始化、完全初始化的不同點
不初始化:如果是局部數組 數組元素的內容隨機 如果是全局數組,數組的元素內容為0
部分初始化:未被初始化的部分自動補0
完全初始化:如果一個數組全部初始化 可以省略元素的個數 數組的大小由初始化的個數確定
數組的分類
數組的分類主要是:靜態數組、動態數組兩類。
靜態數組:例如int arr[5];在程序運行前就確定了數組的大小,運行過程不能更改數組的大小。
動態數組:主要是在堆區申請的空間,數組的大小是在程序運行過程中確定,可以更改數組的大小。
數組的特點
同一個數組所有的成員都是相同的數據類型,同時所有的成員在內存中的地址是連續的
對數值數組操作的時候需要注意啥
對任意數值數組操作的時候必須逐個元素操作
數組按維度分類
分為一維數組、二維數組、多維數組
如果數組元素不初始化
如果是全局數組:不初始化元素內容為0
如果是局部數組:不初始化元素內容不確定(隨機值)
如何通過數組名訪問數組元素
數組名+[數組元素的有效下標]
如果有數組int arr[5]那么sizeof(arr)的結果
20字節
如果有數組int arr[5]那么sizeof(arr[0])的結果
4字節
如果有數組int arr[5]那么sizeof(arr)/sizeof(arr[0])的結果
5
如果有數組int arr[5]={[2]=10, [4]=30};則該數組每個元素的值
0 0 10 0 30
如果有二維數組int arr[3][4];則sizeof(arr)的結果
48字節
如果有二維數組int arr[3][4];則sizeof(arr[0])的結果
16字節
如果有二維數組int arr[3][4];則sizeof(arr[0][0])的結果
4字節
如果有二維數組int arr[3][4];則sizeof(arr)/sizeof(arr[0])的結果
3
如果有二維數組int arr[3][4];則sizeof(arr[0])/sizeof(arr[0][0])的結果
4
如果有二維數組int arr[3][4];則sizeof(arr)/sizeof(arr[0][0])的結果
12
二維數組初始化的方式有幾種
分段初始化(部分初始化,全部初始化)
連續初始化(部分初始化,全部初始化)
如果有兩個二維數組int arr1[3][4]={ {1,2}, {5,6}, {9,10,11} }; int arr2[3][4]={ 1,2, 5,6, 9,10,11}; 則arr1[1][2] +arr2[1][2]運行結果:
11
談談char arr1[]={'h','e','l','l','o'}; 和char arr2[]="hello"; 兩個數組的區別
字符數組arr1逐個元素初始化,系統不會加'\0'字符串結束符,所以arr1的大小為5字節
字符數組arr2是以字符串方式初始化,系統會自動在字符串末尾加'\0',所以arr2的大小為6字節
談談字符數組的元素遍歷方式
可以逐個元素使用%c數組
可以使用%s輸出整個字符數組(需要注意:%s遇到‘\0’結束)
談談gets和fgets給字符數組獲取字符串時的不同點
gets獲取字符串的時候不會對獲取的長度做出判斷,容易造成字符數組越界
fgets獲取字符串的時候會對獲取的長度做出判斷,不會造成字符串越界
fgets相較于gets更安全
不使用strlen函數完成字符串長度測量
注意主函數記得調用test03();
有兩個字符數組str1 str2, str1獲取鍵盤輸入,將str1的字符串拷貝到 str2中(不允許使用strcpy)
注意主函數記得調用test03();
有以下兩個數組str1,str2 將str2的字符串 追加到 str1的尾部
注意主函數記得調用test04();
從字符串中 查找某個元素(第一次出現的下標)
鍵盤輸入第一個字符串str1,輸入第二個字符串str2,再輸入位置pos,要求將str2字符串插入到字符串str1的pos位置
void test06() { char str1[128]=""; printf("親輸入一個字符串:"); fgets(str1,sizeof(str1),stdin); str1[strlen(str1)-1]=0;
char str2[128]=""; printf("親輸入第二個字符串:"); fgets(str2,sizeof(str2),stdin); str2[strlen(str2)-1]=0;
int pos=0; printf("請輸入要插入的位置:"); scanf("%d", &pos);
//計算str2的長度 int len = 0; while(str2[len] && ++len);
//將i定位到str1的尾部 i也是str1的長度 int i=0; while(str1[i] && ++i); //判斷pos位置是否 合法 if(pos<0 || pos>i) { printf("下標%d不無效\n", pos); return;//結束函數 }
//數據是否溢出 if(i+len>sizeof(str1)) { printf("插入會越界,失敗\n"); return;//結束函數 }
//在str1移動數據 預留足夠的位置 while(i>=pos) { str1[i+len] = str1[i]; i--; }
//將str2的字符串 插入到pos位置上 int j=0; while(str2[j] != '\0') { str1[pos] = str2[j]; pos++; j++; } printf("插入后的結果:%s\n", str1); }
int main(int argc, char *argv[]) { test06(); return 0; } |
更多關于物聯網培訓的問題,歡迎咨詢千鋒教育在線名師。千鋒教育擁有多年IT培訓服務經驗,采用全程面授高品質、高體驗培養模式,擁有國內一體化教學管理及學員服務,助力更多學員實現高薪夢想。