当前位置: 首页 > news >正文

教育网站建设的必要性网页升级访问永久更新

教育网站建设的必要性,网页升级访问永久更新,中国焊接外包加工网,怎样建立门户网站写在前面#xff1a;在上次我们学习了指针的相关类型的知识#xff0c;对指针家族的成员基本有了了解#xff0c;这次让我们跟着一些题目来练习和补充一些知识#xff0c;这有助于我们强化理解这些知识。 话不多说#xff0c;我们马上开始#xff1a; 1.指针和数组的笔…       写在前面在上次我们学习了指针的相关类型的知识对指针家族的成员基本有了了解这次让我们跟着一些题目来练习和补充一些知识这有助于我们强化理解这些知识。 话不多说我们马上开始 1.指针和数组的笔试题解析 1.1一维数组 int a[] {1,2,3,4}; printf(%d\n,sizeof(a)); printf(%d\n,sizeof(a0)); printf(%d\n,sizeof(*a)); printf(%d\n,sizeof(a1)); printf(%d\n,sizeof(a[1])); printf(%d\n,sizeof(a)); printf(%d\n,sizeof(*a)); printf(%d\n,sizeof(a1)); printf(%d\n,sizeof(a[0])); printf(%d\n,sizeof(a[0]1)); 先来给出输出结果 这里我们来挑些易错的进行分析和讲解 1.sizeof(a):这个不用多说我们都知道一维数组的数组名表示首地址但是前面我们了解到了有两个特殊的情况一种是sizeof数组名的时候表示的是整个数组中的所有元素所占的总字节数还有一种就是(数组名的时候取出的是整个数组的地址虽然和数组首元素地址相同但是它加1跳过的是一整个数组的长度而普通的数组名加1只是跳到数组的下一个元素而已 2.sizeof(a0)这个和sizeof(a)不是一样的......吗稍等你要是这么认为你就错了让我们来慢慢分析首先我们应该知道sizeof这个函数的一些原理sizeof计算的是括号内所占的内存的空间的大小单位是字节不关注内存中到底存放的是什么sizeof是操作符并不是函数 我们说sizeof内部只有单独放一个数组名的时候才表示数组首元素的地址但是它现在加了0所以就变成了数组首元素的地址加了0其结果导致其变成了地址的运算也就间接导致了sizeof认为现在在他要算的其实就是一个指针变量而已并不是一个数组所以sizeof会返回数字4x8632位环境下或者是x6464位环境下 3.sizeof(*a)  首先我们来看该括号里面既不是只有数组名也不是取地址数组名所以括号里的a就表示数组首元素的地址对其解引用就得到a[0]的值也就是四个字节的int型 4.sizeof(a1)同上原理现在a表示的是数组首元素的地址所以我们的加1操作就是得到了第二个元素的地址所以返回值为指针大小4或8) 5.szieof(a)现在有了取地址数组名所以我们现在a表示的是整个数组的地址但是sizeof计算的仍然是指针大小即4或8 6.sizeof(*a)我们规定解引用操作与取地址操作可以相互抵消所以返回的相当于sizeof(a); 7.sizeof(a1):整个数组的地址加1将会跳过一个数组的字节数的步长现在的指针指向的是a数组的最后一个元素的末尾但是其本身还是地址所以其返回值仍然为指针的大小 1.2 字符数组 什么你说上面的题没难住你那接下来就会更难些了准备好我们就出发吧...... 温馨提示这边由于c和c存在不兼容问题导致strlen函数在cpp文件运行时会出现问题我这边用.c文件进行编译运行 //1.char arr[] { a,b,c,d,e,f };printf(%d\n, sizeof(arr));printf(%d\n, sizeof(arr 0));printf(%d\n, sizeof(*arr));printf(%d\n, sizeof(arr[1]));printf(%d\n, sizeof(arr));printf(%d\n, sizeof(arr 1));printf(%d\n, sizeof(arr[0] 1));printf(%d\n, strlen(arr));printf(%d\n, strlen(arr 0));printf(%d\n, strlen(*arr));printf(%d\n, strlen(arr[1]));printf(%d\n, strlen(arr));printf(%d\n, strlen(arr 1));printf(%d\n, strlen(arr[0] 1));//2. char arr[] abcdef;printf(%d\n, sizeof(arr));printf(%d\n, sizeof(arr 0));printf(%d\n, sizeof(*arr));printf(%d\n, sizeof(arr[1]));printf(%d\n, sizeof(arr));printf(%d\n, sizeof(arr 1));printf(%d\n, sizeof(arr[0] 1));printf(%d\n, strlen(arr));printf(%d\n, strlen(arr 0));printf(%d\n, strlen(*arr));printf(%d\n, strlen(arr[1]));printf(%d\n, strlen(arr));printf(%d\n, strlen(arr 1));printf(%d\n, strlen(arr[0] 1));//3. char* p abcdef;printf(%d\n, sizeof(p));printf(%d\n, sizeof(p 1));printf(%d\n, sizeof(*p));printf(%d\n, sizeof(p[0]));printf(%d\n, sizeof(p));printf(%d\n, sizeof(p 1));printf(%d\n, sizeof(p[0] 1));printf(%d\n, strlen(p));printf(%d\n, strlen(p 1));printf(%d\n, strlen(*p));printf(%d\n, strlen(p[0]));printf(%d\n, strlen(p));printf(%d\n, strlen(p 1));printf(%d\n, strlen(p[0] 1)); 首先我们来看一下sizeof和strlen有什么不同 1.sizeof计算占用内存空间的大小单位是字节不关注内存中到底放的是什么也不会对内存中的表达式进行求值 2.sizeof是操作符strlen是函数 3.strlen是针对字符串的本质上是求出在\0之前出现的字符的个数。 1.2.1  第一部分 运行结果 我们来分析一下 首先字符数组和字符串的区别有无’\0这个比较重要对于sizeof来说不管有无\0它都会正确的计算字节数并返回对于strlen来说没有\0相当于字符串没有终止标志得到的可能就是一个随机值。 1.sizeof(arr 0)我们说sizeof括号内部只有单独放着数组名或者(数组名)的时候不一样那么现在加了0会不会相当于没加呢不如这样我们来调试一个就知道了 上面的调试显示出了arr和arr0明显是两个不同的变量arr0表示的是第一个元素的地址arr则表示的是整个数组所以sizeofarr就是返回int*的大小4或8 2.sizeof*arr此时arr表示的由整个数组的范围缩减到了数组首元素的地址*a*(a[0])a[0]所以返回char类型的大小1 3.sizeofarr相当于整个数组的地址但是其本质上还是指针所以大小固定为4或8个字节 4.sizeof(arr1)这个arr1其实是指向了非法内存arr末尾元素的下一个地址但是sizeof不会管那么多 5.sizeofarr[0]1:这个无可厚非表示的是第二个元素的地址4或8个字节 6.strlenarr此处arr为字符数组意味不知道终止符\0的位置所以该返回值为随机值 7.strlenarr0此处相当于将arr[0]传入strlen返回值和strlenarr一样为随机值 8.strlen(*arr):*arr*(arr[0])a[0]a97,strlen会将97作为地址进行寻找形成非法访问操作 9.strlenarr也为随机值arr拿到的就是整个数组的地址也是从arr[0]开始数所以拿到的随机值应和6,7保持一致 10.strlenarr1随机值与前面的随机数长度差6一个字符数组的长度 11.strlenarr[0]1随机值与6,7,9中的随机值相差1 1.2.2  第二部分 运行结果 几点需要注意 1.sizeofarr会计算\0字符 2.sizeofarr0表示的是arr[0] 3.sizeof(*arr)表示的是sizeof(arr[0]); 4.arr,arr1,arr[0]1分别为整个字符串的地址监视窗口如下 注意此时arr1是跳过了\0直接取到了\0的后面的位置可以由两处起始地址的差值来求 5.strlen不和sizeof一样没有arr和arr0的区分对于strlen都一样 6.strlenarrstrlenarr),不建议使用 7.strlenarr1指向了字符串的\0的后面返回随机值 8.strlenarr[0]1)strlen(arr[1])6-15; 1.2.3 第三部分 输出结果 1.p中存储的是字符串首元素的地址pa 2.p1为字符b的地址 3.p,p1均与原字符串无关 4.p[0]1a1b; 1.3 二维数组 关于指针的问题最抽象和难理解的也就是二维数组的相关操作了吧不要着急我们来边看题目边分析 int a[3][4] { 0 };printf(%d\n, sizeof(a));printf(%d\n, sizeof(a[0][0]));printf(%d\n, sizeof(a[0]));printf(%d\n, sizeof(a[0] 1));printf(%d\n, sizeof(*(a[0] 1)));printf(%d\n, sizeof(a 1));printf(%d\n, sizeof(*(a 1)));printf(%d\n, sizeof(a[0] 1));printf(%d\n, sizeof(*(a[0] 1)));printf(%d\n, sizeof(*a));printf(%d\n, sizeof(a[3])); 首先是输出结果 首先对于以上的二维数组我们平时做题通常认为它是这样的 而实际上它真正在内存中的存储是这样的 这一点还希望大家知晓接着我们来看题目 1.sizeof(a[0])由于是二维数组组所以说a[0]表示的是第一行的一维数组问题也就转化为了第一行的数组的数组名也就是求第一行数组所占的字节数4*416 2.sizeof(a[0] 1)有的读者是不是认为a[0]1相当于a[1]啊敲黑板了重点来了我告诉你并不是由于我们的a[0]不是单独放在sizeof内部还加上了1导致其所代表的的指针的地址范围“缩小”或者“降级”该名词仅为笔者叙述词不具有实际意义不要深挖也就是说原来a[0]代表的是第一行的地址而现在a[0]就变成了普通的第一行的首元素的地址即a[0][0]再加上1就变成了a[0][1]其大小为4或8个字节。 3.sizeof(*(a[0] 1)):同2a[0]此处代表a[0][0]加1位a[0][1]再解引用所以括号内表示a[0][1],也就是4个字节 4.sizeof(a 1)a并未单独放在sizeof内部所以a表示二维数组首元素的地址a[0])所以a1a[1]注意二维数组的首元素是第一行的整行并不是a[0][0]这一个元素这里的a就是第一行的地址其类型是int (*)[4]数组指针是一行为整形的4个数据组成的数组的指针a1就相当于跳过了第一行所以其结果仍然为一个指针的大小4或8 5.sizeof(*(a 1))a没有单独存在所以a会“降一级”变为数组首元素的地址a[0]再加1则表示a[1]再解引用就得到第二行数组返回的就是第二行数组的字节数16第二种就是*(a1)可直接表示为a[1],也正确 6.sizeof(a[0] 1)由上面的分析得出其表示第二行的地址返回值为一个指针大小 7.sizeof(*(a[0] 1)a[0]1a[1],*a[1]a[1]所以返回值为16 8.sizeof(*a)此时数组名变成首元素的地址二维数组首元素的地址为第一行一维数组的地址也即*a*(a[0]a[0],返回的就是第一行的所有元素的字节数16 9.sizeof(a[3])“xd你题目写错了吧a[3][4]的二维数组行数只能为0-2你这写个3这不明摆的坑我们吗”稍等不放你可以先去上面看看运行结果显示是能运行的这就奇怪了sizeof这个操作符吧他比较懒不会跟你计较越不越界sizeof在程序编译期间就会处理其返回值至于内部数据的类型有关并不会参与内部的运算这样就不会需要内部运算了sizeof就会根据原来的数组结构进行推断哎~原来的数组一行有四个int那我的第四行应该也是四个int吧哎不管了就当四个int返回吧我累了~~~也就检测不出越界访问了我们来看个例子 从上面看出b并没有返回我们认为的int型而是继续保持原来的数据同样间接证明了a2没有进行。 下面是二维数组的运行时相关数组内容监视窗口增添数据以观测不同点 2.指针的笔试题 下面就是一些精华的应用场景了准备好了我们就发车吧~~~ 2.1  int main() {int a[5] { 1, 2, 3, 4, 5 };int *ptr (int *)(a 1);printf( %d,%d, *(a 1), *(ptr - 1));return 0; } //程序的结果是什么 你做对了没 解析a1表示整个元素的地址再向后移动一位处的地址将其减去一正好是数组的最后一个元素而*a1表示a[1]; 2.2 struct Test {int Num;char *pcName;short sDate;char cha[2];short sBa[4]; }*p; //假设p 的值为0x100000。 如下表表达式的值分别为多少 //已知结构体Test类型的变量大小是20个字节 int main() {p(struct Test*)0x100000;printf(%p\n, p 0x1);printf(%p\n, (unsigned long)p 0x1);printf(%p\n, (unsigned int*)p 0x1);return 0; 输出结果如下 其中的0x1其实就是十六进制数字的1相当于p1的作用那么p1要加上二十个字节的长度也就是p10x100014第二个将p强制类型转换为了一个unsigned long型的整形数据所以加1就变成了真正意义要上的加1也就是相当于0x100001再看最后一个将本来大小为20个字节的指针强制类型转换成了4个字节大小的指针所以加1就会跳过四个字节即0x100004 2.3 int main() {int a[4] { 1, 2, 3, 4 };int *ptr1 (int *)(a 1);int *ptr2 (int *)((int)a 1);printf( %x,%x, ptr1[-1], *ptr2);return 0; } 输出结果基于小端的x86环境下 此处的ptr[-1]可以看成是*ptr-1就相当于ptr的地址减1也就是指向了4这个元素第二个是比较难理解的我们不妨先来看一看他们代表的内存都是啥吧 从上面我们可以得出ptr的地址只是比a[0]的地址多了1 这就涉及到了字节偏移的问题我们的ptr2比a[0]多1的话相当于它指向a[0]的末尾又由于小端存储所以低地址上方低位字节又因为ptr2为int*会自动向后寻找四个字节 2.4  #include stdio.h int main() {int a[3][2] { (0, 1), (2, 3), (4, 5) };int *p;p a[0];printf( %d, p[0]);return 0; } 其输出结果为1 首先关于逗号表达式其最终返回值就是最后的那条语句数组里面真正存储的是1,3,5三个数字剩下的就都默认初始化为0了 2.5 int main() {int a[5][5];int(*p)[4];p a;printf( %p,%d\n, p[4][2] - a[4][2], p[4][2] - a[4][2]);return 0; }注意还是要用.c文件编译c规定比c多 上来我们就注意到两个数组大小不同其实如果非要这样运行的话我们可以这样想 可见要求的结果地址相差4个字节结果为-4但是作为地址不会管你整数还是负数它会直接把-4转换为地址来打印。 2.6 #include stdio.h int main() {char *a[] {work,at,alibaba};char**pa a;pa;printf(%s\n, *pa);return 0; }输出结果 at 解析a的每个数组元素是char*也就是a的每个数组元素表示的是字符串的地址而pa的类型为char**也就是说pa指向的是a数组如下图  而我们又知道当有int *p时p1表示的是p的地址向后移动4个字节所以char**pa的时候pa就相当于pa向后移动了char*个字节如下图 2.7 int main() {char *c[] {ENTER,NEW,POINT,FIRST};char**cp[] {c3,c2,c1,c};char***cpp cp;printf(%s\n, **cpp);printf(%s\n, *--*cpp3);printf(%s\n, *cpp[-2]3);printf(%s\n, cpp[-1][-1]1);return 0; }输出结果还是.c文件吧你懂得 解析这后面的提酒相对较难一些了需要仔细分析还会有很多的坑话不多说先画个图 一目了然~~~呃~~~我们再看看吧 这样只能解决第一个问题从第二个问题开始我们就要考虑符号优先级问题了我们有前后置大与解引用*也大于所以对与第二个式子我们的运算顺序为*--*cpp3最后我们计算可得出结果为第一个字符串的第四个字符往后注意此时的cpp在第一步中已经指向了c2同理第三个也可以变成**cpp-1-11也可得出结果重点是要熟悉数组和指针的相互转换关系。 一件不幸的事我的笔记本要没电了所以就先到这吧需要更新我会尽快补上的~~~
http://www.dnsts.com.cn/news/38163.html

相关文章:

  • 中企动力做的网站怎么登陆抖音代运营公司
  • 公司建一个网站要多少钱wordpress 获取栏目名称
  • 室内设计网站案例本手机原有微信网站
  • 电子商务网站建设规划的内容wordpress the7 3.80
  • 免费网站app哪个好asp.net开发移动网站模板下载
  • 网站开发微博网站开发环境包括什么
  • 单位网站建设存在问题情况汇报做社区网站用什么程序
  • 网站建设价格如何西宁做网站需要多少钱
  • 怎么将自己做的网站上线seo搜索引擎优化知乎
  • wordpress还原站点反钓鱼网站建设期
  • 郴州做网站的公司安卓app开发软件有哪些
  • 专做热血电影的网站宁波网站开发公司
  • 用易语言做网站抢购软件苏州专业网站建设设计公司排名
  • 网站开发的公司名称广西网红排名前20名
  • 建设银行u盾不能弹出银行网站机场网站建设需求
  • dw表格怎么做网站搜索如何搜索到自己的网站
  • 中小企业建站系统ssh框架做的网站问题
  • 郑州网站建设价格宁波人流多少钱
  • 南城网站建设wordpress 教学视频
  • 微信公众号做推送的网站wordpress d8 3.0
  • 做网站需要什么人员wordpress query post
  • 公司年前做网站好处中英文网站建设公司
  • 微软网站开发软件天津做一个简单的网站
  • 全国最大的设计网站定制开发软件开发
  • 东莞网站制作哪家最便宜网站的域名都有哪些
  • 招聘网站建设与开发要求网站排名按天付费
  • 电商网站首页图片切换怎么做的小程序源码网免费
  • 家政网站模板下载上海公司注册网上核名
  • 开一个免费网站临沂网站建设培训班
  • swing做网站专业手机建站公司