认识数组(C语言)
//定义数组 //一种自定义类型可以存储大量数据便于一次调用多个变量 //形式 //type arr_name[]; //由type数组元素类型arr_name(数组名以及[]规定数组大小三部分组成 //数组类型 //对于一个变量来说去掉其变量名就是它的类型 //比如对于char name[10]而言“char [10]就是它的类型 //数组初始化 //在了解数组初始化之前我们得了解数组中的元素是怎么调用的 //数组中的每个元素都有”下标“与之对应这就像数组元素的身份证一样 //举例int arr[10]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 其下标分布如下0 1 2 3 4 5 6 7 8 9 //所以如果你想调用元素”6“ //你就得输入arr[5]来使用它当然也有其他调用它的方法 //注意当字符串填入字符数组时会带着\0’一起成为数组元素 //完全初始化 //你可以理解为数学上的一一映射初始化用{}大括号 //比如我有一个数组int arr[5],如果我要初始化这个数组就得找5个int 类型的常量把它们用大括号连起来 //比如:int arr[5]{1,2,3,4,5}; //这样的话元素arr[0]-arr[4]就被赋予了相应的值 //也有一种书是化的方式是省略[]中的数字直接初始化这样数组元素的大小完全由初始化的元素个数决定 //字符串的初始化 eg;char arrHello World!; //不完全初始化 // 顾名思义就是少填了几个 //但是值得注意的一点就是剩下没被初始化的元素会默认初始化为0 //所以我们对数组常见的初始化为int arr[10]{0}; //数组的有关操作 //打印 //数组输入输出的思路都是把数组元素一个一个的调用出来实现的 //eg: //#includestdio.h // //int main() { // int arr[] {1,2,3,4,5,6,7,8,9}; // for (int i 0; i 9; i) { // printf(%d , arr[i]); // } // printf(\n); // return 0; //} //输出1 2 3 4 5 6 7 8 9 //输入 //eg: //#includestdio.h // //int main() { // int arr[5] { 0 }; // for (int i 0; i 5; i) { // scanf(%d, arr[i]); // } // for (int i 0; i 5; i) { // printf(%d , arr[i]); // } // printf(\n); // // return 0; //} //输入1 2 3 4 5 // 输出 1 2 3 4 5 // //一维数组在内存中的存储 //举个例 //#includestdio.h // //int main() { // // int arr[5] { 0 }; // for (int i 0; i 5; i) { // printf(arr[%d]%p\n, i, arr[i]);//%p用来打印地址 // } // // return 0; //} // 输出 //arr[0] 000000B2AC0FFC18 //arr[1] 000000B2AC0FFC1C //arr[2] 000000B2AC0FFC20 //arr[3] 000000B2AC0FFC24 //arr[4] 000000B2AC0FFC28 //由此可见一维数组在内存中的存储时连续的 //数组元素个数的计算 //当我们想对数组中的每个元素都进行操作时就要生成其所有的下标而生成下标又要循环所以数组的元素个数就是循环次数 //虽然当我们定义数组是就知道数组的大小但当我们更改数组是就会连带着与数组大小有关的计算都要改变如果每一个都要人为去更改就很麻烦所以我们就想去寻找求数组元素个数的方法 //数组是由数组元素组成的数组元素的大小是固定的所以数组的大小等于元素数乘以一个数组元素的大小 //所以我们只要求数组的大小在用它除以一个数组元素的大小就可以得到数组元素的个数 //之前我们说过数组算是一种自定义类型是变量类型的一种那么我们就可一尝试用sizeof 来求数组的大小 //#includestdio.h // //int main() { // int arr[10] { 0 }; // printf(%zu\n, sizeof(arr)); // // return 0; //} //发现输出上显示的是40 //说明int arr[10]这个数组的大小是40字节 //我们知道一个int 类型的变量的大小是4字节 //用40数以4我们就得到了10 //我们还可以更简洁一点或更公式一点的做法 //比如size_t numsizeof(arr)/sizeof(arr[0]); //这样我们就求出了一个数组的元素个数 //多维数组 //这个概念类似于套娃 //把低一维的数组作为数组元素就成了多维数组 //二维数组 //所以二维数组就把一维数组当成数组元素的数组 //形式为 type arr_name[][]; //其中第一个[]表示行第二个[]表示列 //这样表示我个人感觉有点不好记忆 //所以我的理解是第一个[]是用来规定数组元素个数的第二个[]是用来规定每个元素的大小的 //这样理解有什么好处呢 //在后面会说到二维数组可以省略行但不能省略列有一定的帮助 //因为你若把二位数组理解成一种自定义类型的话最重要的就是定义其单个的大小 //因为数组本质上算一种集合单个元素的大小才是基础 //二维数组的存储 //我们依旧先写一个代码来演示一下 //#includestdio.h // //int main() { // int arr[2][3] {1,2,3,4,5,6}; // for (int i 0; i 2; i)//生成行下标 // { // for (int j 0; j 3; j)//生成列下标 // { // printf(arr[%d][%d]%p\n, i, j, arr[i][j]); // } // } // // return 0; //} // 输出 //arr[0][0] 000000D6276FF6E8 //arr[0][1] 000000D6276FF6EC //arr[0][2] 000000D6276FF6F0 //arr[1][0] 000000D6276FF6F4 //arr[1][1] 000000D6276FF6F8 //arr[1][2] 000000D6276FF6FC //不难发现二维数组在内存中的存储也是连续所谓分行分列更像是一种分“区块”管理 //二维数组的初始化 //有了上面对二维数组在内存中的存储对于其初始化也很容以上手了 //初始化的思路是一行一行的填满这一行填满自动填向下一行 //完全与不完全的区别就是不完全初始化会把剩下元素自动初始化为0、 //按行初始化 //这个比较特殊吧 //就是你手动初始化时可以不用把一行填满就去填下一行 //依旧写一行举个例 //#includestdio.h // //int main() { // // int arr[3][3] { {1},{2,2},{3,3,3} }; // // for (int i 0; i 3; i) { // for (int j 0; j 3; j) { // printf(%d , arr[i][j]); // } // printf(\n); // } // // return 0; //} // 输出 //1 0 0 //2 2 0 //3 3 3 //这样应该很明确了吧 //二维数组的输入输出 //跟一维数组差不多只不过要嵌套循环来生成对应的行下标和列下标 //依旧举个例子: //#includestdio.h // //int main() { // // int arr[3][3] { 0 }; // // for (int i 0; i 3; i) { // for (int j 0; j 3; j) { // scanf(%d, arr[i][j]); // } // } // for (int i 0; i 3; i) { // for (int j 0; j 3; j) { // printf(%d , arr[i][j]); // } // printf(\n); // } // // return 0; //} //输入 //1 2 3 //2 3 1 //3 1 2 //输出 //1 2 3 //2 3 1 //3 1 2 //变长数组 //全名应该叫变量长度的数组就是填入[]的可以不是常数可以是变量 //c99后新加的语法 //但是我用的是vs //vs不支持VLA所以我就不演示了 //一个小练习 //打印一串字符串但是要有动画感 //ps:把字符串存入字符数组时打印时可以直接通过数组名来打印 //举个例 #includestdio.h #includestring.h #includewindows.h int main() { char arr1[] welcome to VCTCN!!!!; char arr2[] ********************; size_t left 0; size_t right strlen(arr1) - 1; while (left right) { arr2[left] arr1[left]; arr2[right] arr1[right--]; printf(%s, arr2); Sleep(500); system(cls); } return 0; }