ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

一维和二维数组

一维和二维数组 目录一. 数组的概念二.一维数组的创建和初始化1.数组创建的基本语法2.数组的初始化-用大括号三.一维数组的使用四.一维数组在内存中的存储五.sizeof计算数组元素的个数六.二维数组的创建七.二维数组的初始化—也是用大括号1.不完全初始化和完全初始化2.按行初始化3.初始化时省略行但不能省略列八.二维数组的使用1.二维数组的下标2.二维数组的输入和输出九.二维数组在内存中的存储十.C99中的变长数组十一.数组练习练习1多个字符从两端移动向中间汇聚练习2⼆分查找十二.求平均值的方式​3.正确的方法一. 数组的概念数组是一组相同类型元素的集合1.数组中存放1到多个数据但不能为02.数组中存放的数据类型是相同的数组可以分为一维和多维数组一般是二维二.一维数组的创建和初始化1.数组创建的基本语法type arr_name[ 常量值 ]; 数组在创建时可以指定数组的大小和数组的元素类型2.数组的初始化-用大括号1完全初始化和不完全初始化int data[10] { 1,2,3,4,5,6,7,8,9,10 };//完全初始化 int arr1[10] { 1,2,3,4,5 };//不完全初始化剩余的元素会默认给成0 int arr2[4] { 1,2,3,4,5 };//错误的初始化-初始化项太多2数组的大小int arr[] {1,2,3,4,5}; //数组的大小可以省略不写这里有5个元素 int arr[]{0}; //1个元素 int arr[10] {0}; //10个元素3.数组的类型int arr[10] // int 是 数组元素 的类型 // int [10] 才是 数组arr 的类型三.一维数组的使用1.数组的下标1下标从0开始最后一个元素下标是n-12下标引用操作符[ ]可以访问到数组的元素int arr[5] {1,2,3,4,5}; arr[0] 1; arr[1] 2; arr[2] 3; arr[3] 4; arr[4] 5;2.数组元素的打印#includestdio.h int main() { int arr[5] { 1,2,3,4,5 }; int i 0; for (i 0;i 5;i) { printf(%d , arr[i]); //1 2 3 4 5 } return 0; }3.数组的输入int main() { int arr[5] { 0 }; int i 0; for (i 0;i 5;i) { scanf(%d,arr[i]);//1 2 3 4 5 //不要忘了 } for (i 0;i 5;i) { printf(%d , arr[i]);//1 2 3 4 5 } return 0; }四.一维数组在内存中的存储int arr[10] {0}; //以下是数组中每个元素的地址可以看到1数组的元素在内存中是连续存放的2随着下标的增长地址是由低到高变化的五.sizeof计算数组元素的个数用sizeof可以计算数组的大小int main() { int arr[10] { 0 }; int sz sizeof(arr);//40 单位是字节 printf(%d\n, sz); return 0; }上面这行代码中数组有10个元素元素类型是 int所以每个元素4个字节数组大小就是40个字节。那么有了数组大小和元素的类型就可以计算出数组元素的个数int main() { int arr[10] { 0 }; int n sizeof(arr) / sizeof(arr[0]); printf(%d\n, n); //10 return 0; }六.二维数组的创建1.二维数组的概念把一维数组作为数组的元素这就是二维数组同样地把二维数组作为数组的元素就得到三维数组二维数组以上的数组统称为多维数组2.二维数组的创建type arr_name[ 常量值 1][ 常量值 2] 例如int arr[3][5]; //表示数组有3行每一行有5个元素 double data[4][6];其中第一个 [ ] 代表 行第二个 [ ] 代表 列七.二维数组的初始化—也是用大括号1.不完全初始化和完全初始化int arr1[3][4] {1,2,3}; //不完全初始化其余默认都是0 int arr2[2][5] {1,2,3,4,5,6,7,8,9,10};//完全初始化二维数组初始化时先初始化行后初始化列2.按行初始化int main() { int arr[3][5] { {1,2},{3,4},{5,6} }; //1 2 0 0 0 //3 4 0 0 0 //5 6 0 0 0 return 0; }3.初始化时省略行但不能省略列int arr5[][5] {1,2,3}; int arr6[][5] {1,2,3,4,5,6,7} int arr7[][5] {{1,2},{3,4},{5,6}};八.二维数组的使用1.二维数组的下标二维数组的访问也是使用下标形式二维数组有行和列C语言规定二维数组的行和列是从0开始的int main() { int arr[3][5] { {1,2},{3,4},{5,6} }; //1 2 0 0 0 //3 4 0 0 0 //5 6 0 0 0 printf(%d , arr[0][0]);//1 printf(%d , arr[1][0]);//3 printf(%d , arr[1][2]);//0 return 0; }可以将下标理解为坐标arr[0][0]对应的就是1arr[1][0]3arr[1][2]02.二维数组的输入和输出int main() { int arr[3][5] { 0 }; //输入 printf(输入); int i 0; for (i 0;i 3;i)//行下标 { int j 0; for (j 0;j 5;j)//列下标 { scanf(%d, arr[i][j]); } } //输出 for (i 0;i 3;i)//行下标 { int j 0; for (j 0;j 5;j)//列下标 { printf(%d , arr[i][j]); } printf(\n); } return 0; }九.二维数组在内存中的存储以下代码可以打印二维数组中所有元素的地址int main() { int arr[3][5] { 0 }; int i 0; int j 0; for (i 0;i 3;i) { for (j 0;j 5;j) { printf(arr[i][j]%p\n, arr[i][j]); } } return 0;可以看到每一行内部的每个元素是相邻的地址之间相差4个字节跨行位置处的两个元素之间也差4个字节所以二维数组中的每个元素都是连续存放的如下图十.C99中的变长数组int main() { int n 0; scanf(%d, n); int arr[n];//用变量来指定数组大小 //只有在程序运行时才知道大小所以变长数组不能初始化 //一旦输入值之后数组长度就不变了 //vs不支持变长数组 int i 0; for (;i n;i) { arr[i] i 1; } for (i 0;i n;i) { printf(%d , arr[i]); } return 0; }变长数组允许用变量来指定数组大小数组长度只有运行时才能确定所以变长数组不能初始化十一.数组练习练习1多个字符从两端移动向中间汇聚#includestring.h//stelen的头文件 #includewindows.h//Sleep()函数要用到的头文件 int main() { char str1[] hello world; char str2[] ###########; int left 0; size_t right strlen(str2) - 1;//下标从0开始所以要减一 while (left right) { Sleep(1000);//休眠单位是毫秒 str2[left] str1[left]; str2[right] str1[right]; left; right--; printf(%s\n, str2); } return 0; }练习2⼆分查找题目给定⼀个升序的整型数组在这个数组中查找到指定的值n找到了就打印n的下标找不到就 打印找不到先用遍历的方式来解int main() { int arr[] { 1,2,3,4,5,6,7,8,9,10 }; int n 0;//要找的值 scanf(%d, n); int i 0; int sz sizeof(arr) / sizeof(arr[0]); for (i 0;i sz;i) { if(arr[i]n)//注意不要写成 一个 { printf(找到了下标是%d\n, i); break; } } if (i sz)//当i和sz相等的时候说明i已经遍历完了数组都没找到n { printf(找不到\n); } return 0; }这种方法效率不高用二分查找可以提高效率以下是二分查找的方式int main() { int arr[] { 1,2,3,4,5,6,7,8,9,10 }; int n 0; printf(输入要找的值); scanf(%d, n); int left 0; int right sizeof(arr) / sizeof(arr[0]); int mid 0; int find 0;//假设没找到 while (leftright) { mid (left right) / 2; if (arr[mid] n) { left mid 1; } else if (arr[mid] n) { right mid - 1; } else { find 1;//如果找到了就把1赋给 find printf(找到了下标是%d\n, mid); break; } } if (find 0) { printf(找不到\n); } return 0; }十二.求平均值的方式1.int mid (leftright) / 2;这种方式中如果给的数值太大会产生问题2.int main() { int left 2147483645; int right 2147483647; printf(%d\n, left / 2 right / 2);//不适用奇数 return 0; }这种情况不适用于奇数3.正确的方法int main() { int left 2147483645; int right 2147483647; //不管right和left谁大谁小都能产生正确结果 printf(%d\n, (right - left) / 2 left);//ok return 0; }
返回列表