密云网站制作案例,借贷网站开发是否合法,青岛外贸网站建站公司,网站建设的原因有什么#x1f921;博客主页#xff1a;醉竺 #x1f970;本文专栏#xff1a;《C语言深度解剖》 #x1f63b;欢迎关注#xff1a;感谢大家的点赞评论关注#xff0c;祝您学有所成#xff01; ✨✨#x1f49c;#x1f49b;想要学习更多数据结构与算法点击专栏链接查看博客主页醉竺 本文专栏《C语言深度解剖》 欢迎关注感谢大家的点赞评论关注祝您学有所成 ✨✨想要学习更多数据结构与算法点击专栏链接查看✨✨ 1. 一维数组的创建和初始化
1.1 数组的创建
数组是一组相同类型元素的集合。
数组的创建方式
type_t arr_name [const_n];
//type_t 是指数组的元素类型
//const_n 是一个常量表达式用来指定数组的大小
数组创建的实例
//代码1
int arr1[10];//代码2
int count 10;
int arr2[count];//数组时候可以正常创建//代码3
char arr3[10];
float arr4[1];
double arr5[20]; 注数组创建在C99标准之前 [ ] 中要给一个常量才可以不能使用变量。在C99标准支持了变长数组的概念数组的大小可以使用变量指定但是数组不能初始化。 1.2 数组的初始化
数组的初始化是指在创建数组的同时给数组的内容一些合理初始值初始化。
看代码
int arr1[10] { 1,2,3 }; //不完全初始化剩余元素默认初始化为0
int arr2[] { 1,2,3,4 };
int arr3[5] { 12345 }
char arr4[3] { a,98, c };
char arr5[] { a,b,c };
char arr6[] abcdef;
数组在创建的时候如果想不指定数组的确定的大小就得初始化。数组的元素个数根据初始化的内容来确 定。 但是对于下面的代码要区分内存中如何分配。
char arr1[] abc;
char arr2[3] { a,b,c };
数组长度: char arr1[] abc; 这行代码声明了一个字符数组arr1并初始化为字符串abc。数组的长度是4因为字符串的结尾有一个空字符null terminator\0这是C语言字符串的标准表示方式。所以arr1实际上包含a, b, c, 和 \0。char arr2[3] { a,b,c }; 这行代码声明了一个长度为3的字符数组arr2并初始化为三个字符a, b, 和 c。这里并没有包含空字符\0因此arr2不是一个有效的C语言字符串。用途: arr1可以被用作一个字符串因为它以空字符结尾。你可以使用像printf(%s, arr1);这样的函数来打印整个字符串。arr2通常不会被当作字符串来使用因为它没有空字符结尾。如果你试图将它作为字符串传递给像printf这样的函数结果可能会是未定义的因为它会试图读取数组后面的内存来寻找空字符这可能导致程序崩溃或输出乱码。
1.3 一维数组的使用
对于数组的使用我们之前介绍了一个操作符 [] 下标引用操作符。它其实就数组访问的操作符。 我们来看代码
#include stdio.h
int main()
{int arr[10] { 0 };//数组的不完全初始化//计算数组的元素个数int sz sizeof(arr) / sizeof(arr[0]);//对数组内容赋值,数组是使用下标来访问的下标从0开始。所以int i 0;//做下标for (i 0; i 10; i)//这里写10好不好{arr[i] i;}//输出数组的内容for (i 0; i 10; i){printf(%d , arr[i]);}return 0;
}
总结:
数组是使用下标来访问的下标是从0开始。数组的大小可以通过计算得到。
int arr[10];
int sz sizeof(arr)/sizeof(arr[0]);
1.4 一维数组在内存中的存储
接下来我们探讨数组在内存中的存储。
看代码
#include stdio.h
int main()
{int arr[8] { 0 };int i 0;int sz sizeof(arr) / sizeof(arr[0]);for (i 0; i sz; i){printf(arr[%d] %p\n, i, arr[i]);}return 0;
}
输出的结果如下 仔细观察输出的结果我们知道随着数组下标的增长元素的地址也在有规律的递增。
由此可以得出结论数组在内存中是连续存放的。
2. 二维数组的创建和初始化
2.1 二维数组的创建
//数组创建
int arr[3][4];
char arr[3][5];
double arr[2][4];
2.2 二维数组的初始化
//数组初始化
int arr[3][4] { 1,2,3,4 };
int arr[3][4] { {1,2},{4,5} };
int arr[][4] { {2,3},{4,5} };//二维数组如果有初始化行可以省略列不能省略
2.3 二维数组的使用
二维数组的使用也是通过下标的方式。
看代码
#include stdio.h
int main()
{int arr[3][4] { 0 };int i 0;for (i 0; i 3; i){int j 0;for (j 0; j 4; j){arr[i][j] i * 4 j;}}for (i 0; i 3; i){int j 0;for (j 0; j 4; j){printf(%d , arr[i][j]);}}return 0;
}
2.4 二维数组在内存中的存储
像一维数组一样这里我们尝试打印二维数组的每个元素。
#include stdio.h
int main()
{int arr[3][4];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]);}}return 0;
}
输出的结果 通过结果我们可以分析到其实二维数组在内存中也是连续存储的。 深入理解 二维数组是一维数组的数组可以理解为二维数组的每个元素就是一个一维数组。 二维数组名是本质是 一个一维数组的地址。 例如int arr[2][3] {{11,12,13},{21,22,23}}; arr是二维数组名该数组有2个元素每一个元素本身又是一个数组长度为3的一维整型数组。arr这个二维数组名可以理解为数组长度为3的存放整型数据类型的数组指针如果存放arr 的值要用数组长度为3的整型数组类型的数组指针。 上述有不理解的没关系后期深入学习了指针再回头来看就理解了后面的文章中会打算专门写一篇文章关于指针和数组的关系。
3. 数组越界
数组的下标是有范围限制的。
数组的下规定是从0开始的如果数组有n个元素最后一个元素的下标就是n-1。 所以数组的下标如果小于0或者大于n-1就是数组越界访问了超出了数组合法空间的访问。
C语言本身是不做数组下标的越界检查编译器也不一定报错但是编译器不报错并不意味着程序就是正确的 所以程序员写代码时最好自己做越界的检查。
#include stdio.h
int main()
{int arr[10] { 1,2,3,4,5,6,7,8,9,10 };int i 0;for (i 0; i 10; i){printf(%d\n, arr[i]);//当i等于10的时候越界访问了}return 0;
}
二维数组的行和列也可能存在越界。
4. 数组作为函数参数
往往我们在写代码的时候会将数组作为参数传个函数比如我要实现一个冒泡排序函数将一个整形数组排序。深入理解冒泡排序算法的可以看这一篇文章《冒泡排序和快速排序》下面重点讲解数组作为函数参数时有什么特点和注意事项。
那我们将会这样使用该函数
4.1 冒泡排序函数的错误设计
//方法1
#include stdio.h
void bubble_sort(int arr[])
{int sz sizeof(arr) / sizeof(arr[0]);//这样对吗int i 0;for (i 0; i sz - 1; i){int j 0;for (j 0; j sz - i - 1; j){if (arr[j] arr[j 1]){int tmp arr[j];arr[j] arr[j 1];arr[j 1] tmp;}}}
}
int main()
{int arr[] { 3,1,7,5,8,9,0,2,4,6 };bubble_sort(arr);//是否可以正常排序for (int i 0; i sizeof(arr) / sizeof(arr[0]); i){printf(%d , arr[i]);}return 0;
}
运行结果 方法1出了问题并没有拍好顺序。那我们找一下问题调试之后可以看到 bubble_sort 函数内部的 sz 是1。 难道数组作为函数参数的时候不是把整个数组的传递过去 先不着急解答继续往下看。
4.2 数组名是什么 由运行结果可知数组名和数组第一个元素的地址是一样的。
结论 数组名是数组首元素的地址。有两个例外 如果数组名是首元素地址那么
int arr[10] { 0 };
printf(%d\n, sizeof(arr));// 为什么输出的结果是40
补充 sizeof(数组名)计算整个数组的大小sizeof内部单独放一个数组名数组名表示整个数 组。数组名取出的是数组的地址。数组名数组名表示整个数组。 除1,2两种情况之外所有的数组名都表示数组首元素的地址。 知道了这个我们来解决上面4.1节冒泡排序为什么无法正常排序的问题了请看下图 当数组传参的时候实际上只是把数组的首元素的地址传递过去了。 所以即使在函数参数部分写成数组的形式 int arr[] 表示的依然是一个指针 int *arr 。 那么函数内部的 sizeof(arr) 结果是4。 4.3 冒泡排序函数的正确设计
如果方法1错了该怎么设计
#include stdio.h
//方法2
void bubble_sort(int arr[], int sz)//参数接收数组元素个数
{//代码同上面函数
}
int main()
{int arr[] { 3,1,7,5,8,9,0,2,4,6 };int sz sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz);//是否可以正常排序for (int i 0; i sz; i){printf(%d , arr[i]);}return 0;
} 文章转载自: http://www.morning.qbjrl.cn.gov.cn.qbjrl.cn http://www.morning.lxfqc.cn.gov.cn.lxfqc.cn http://www.morning.rrcxs.cn.gov.cn.rrcxs.cn http://www.morning.fjgwg.cn.gov.cn.fjgwg.cn http://www.morning.wmfny.cn.gov.cn.wmfny.cn http://www.morning.rnwmp.cn.gov.cn.rnwmp.cn http://www.morning.kjtdy.cn.gov.cn.kjtdy.cn http://www.morning.gdpai.com.cn.gov.cn.gdpai.com.cn http://www.morning.mfxcg.cn.gov.cn.mfxcg.cn http://www.morning.lggng.cn.gov.cn.lggng.cn http://www.morning.lzqnj.cn.gov.cn.lzqnj.cn http://www.morning.rntgy.cn.gov.cn.rntgy.cn http://www.morning.wschl.cn.gov.cn.wschl.cn http://www.morning.ptysj.cn.gov.cn.ptysj.cn http://www.morning.bwmq.cn.gov.cn.bwmq.cn http://www.morning.mqmxg.cn.gov.cn.mqmxg.cn http://www.morning.xxknq.cn.gov.cn.xxknq.cn http://www.morning.qnypp.cn.gov.cn.qnypp.cn http://www.morning.dpzcc.cn.gov.cn.dpzcc.cn http://www.morning.cwpny.cn.gov.cn.cwpny.cn http://www.morning.mnclk.cn.gov.cn.mnclk.cn http://www.morning.lthpr.cn.gov.cn.lthpr.cn http://www.morning.lonlie.com.gov.cn.lonlie.com http://www.morning.touziyou.cn.gov.cn.touziyou.cn http://www.morning.bojkosvit.com.gov.cn.bojkosvit.com http://www.morning.qjxxc.cn.gov.cn.qjxxc.cn http://www.morning.lqypx.cn.gov.cn.lqypx.cn http://www.morning.jjzrh.cn.gov.cn.jjzrh.cn http://www.morning.fdrb.cn.gov.cn.fdrb.cn http://www.morning.tpps.cn.gov.cn.tpps.cn http://www.morning.gzgwn.cn.gov.cn.gzgwn.cn http://www.morning.lcbt.cn.gov.cn.lcbt.cn http://www.morning.haolipu.com.gov.cn.haolipu.com http://www.morning.nchlk.cn.gov.cn.nchlk.cn http://www.morning.tkztx.cn.gov.cn.tkztx.cn http://www.morning.zqwp.cn.gov.cn.zqwp.cn http://www.morning.mqtzd.cn.gov.cn.mqtzd.cn http://www.morning.rfpq.cn.gov.cn.rfpq.cn http://www.morning.nhrkc.cn.gov.cn.nhrkc.cn http://www.morning.fglzk.cn.gov.cn.fglzk.cn http://www.morning.krdxz.cn.gov.cn.krdxz.cn http://www.morning.mpngp.cn.gov.cn.mpngp.cn http://www.morning.ykrss.cn.gov.cn.ykrss.cn http://www.morning.nkpls.cn.gov.cn.nkpls.cn http://www.morning.rbrhj.cn.gov.cn.rbrhj.cn http://www.morning.yslfn.cn.gov.cn.yslfn.cn http://www.morning.jpqmq.cn.gov.cn.jpqmq.cn http://www.morning.kkwgg.cn.gov.cn.kkwgg.cn http://www.morning.hjwxm.cn.gov.cn.hjwxm.cn http://www.morning.kdhrf.cn.gov.cn.kdhrf.cn http://www.morning.hnk25076he.cn.gov.cn.hnk25076he.cn http://www.morning.mlfmj.cn.gov.cn.mlfmj.cn http://www.morning.zntf.cn.gov.cn.zntf.cn http://www.morning.bpmfq.cn.gov.cn.bpmfq.cn http://www.morning.ynrzf.cn.gov.cn.ynrzf.cn http://www.morning.sthp.cn.gov.cn.sthp.cn http://www.morning.frsbf.cn.gov.cn.frsbf.cn http://www.morning.zkqjz.cn.gov.cn.zkqjz.cn http://www.morning.glpxx.cn.gov.cn.glpxx.cn http://www.morning.nrxsl.cn.gov.cn.nrxsl.cn http://www.morning.lksgz.cn.gov.cn.lksgz.cn http://www.morning.ypcbm.cn.gov.cn.ypcbm.cn http://www.morning.ykmtz.cn.gov.cn.ykmtz.cn http://www.morning.djxnw.cn.gov.cn.djxnw.cn http://www.morning.dfdhx.cn.gov.cn.dfdhx.cn http://www.morning.kngqd.cn.gov.cn.kngqd.cn http://www.morning.btcgq.cn.gov.cn.btcgq.cn http://www.morning.mczjq.cn.gov.cn.mczjq.cn http://www.morning.ttrdr.cn.gov.cn.ttrdr.cn http://www.morning.lbcfj.cn.gov.cn.lbcfj.cn http://www.morning.lxfdh.cn.gov.cn.lxfdh.cn http://www.morning.hxxyp.cn.gov.cn.hxxyp.cn http://www.morning.chzbq.cn.gov.cn.chzbq.cn http://www.morning.ktntj.cn.gov.cn.ktntj.cn http://www.morning.sdamsm.com.gov.cn.sdamsm.com http://www.morning.pzlhq.cn.gov.cn.pzlhq.cn http://www.morning.gygfx.cn.gov.cn.gygfx.cn http://www.morning.hsklc.cn.gov.cn.hsklc.cn http://www.morning.gbybx.cn.gov.cn.gbybx.cn http://www.morning.kjmcq.cn.gov.cn.kjmcq.cn