当前位置 : 主页 > 编程语言 > c语言 >

笔试重点题

来源:互联网 收集:自由互联 发布时间:2023-09-03
一起成为更优秀的人 1.数组笔试重点考察 1.1整型数组与sizeof 1.2字符数组与sizeof 1.3sizeof与字符串 1.4strlen与字符串 2.指针笔试重点考察 2.1指针与sizeof 2.2指针与strlen sizeof与整型数组int a

一起成为更优秀的人

笔试重点题_数组

笔试重点题_数组_02

1.数组笔试重点考察

1.1整型数组与sizeof

1.2字符数组与sizeof

1.3sizeof与字符串

1.4strlen与字符串

2.指针笔试重点考察

2.1指针与sizeof

2.2指针与strlen

sizeof与整型数组 int a[] = { 1,2,3,4 }; printf("%d\n", sizeof(a)); printf("%d\n", sizeof(a+0)); printf("%d\n", sizeof(*a)); printf("%d\n", sizeof(a+1)); printf("%d\n", sizeof(a[1])); printf("%d\n", sizeof(&a)); printf("%d\n", sizeof(*&a)); printf("%d\n", sizeof(&a+1)); printf("%d\n", sizeof(&a[0])); printf("%d\n", sizeof(&a[0]+1));必须要知道的两点: 必须要知道的两点: 必须要知道的两点: (重要的事情说三遍) 数组名表示首元素地址!!! 除了这两个例外: 1.sizeof(数组名) -- 数组名放在sizeof里面,数组名表示的是整个数组 2.&数组名 -- 数组名表示的是整个数组:1) sizeof数组名-计算的是数组的总大小,单位字节:44=16 2)由于a没有单独放在sizeof内部,也没有&a,所以a表示数组首元素地址,a+0还是首元素地址 是地址,大小就是4/8个字节 (看平台) 3)由于a没有单独放在sizeof内部,也没有&a,所以a表示数组首元素地址,a找到了首元素 是一个int类型的整数,是4字节 4)由于a没有单独放在sizeof内部,也没有&a,所以a表示数组首元素地址,a+1表示第二个元素的地址,是地址就是4/8个字节 5)a[1] == (a+1) ,由于a没有单独放在sizeof内部,也没有&a,所以a表示数组首元素地址, a+1表示第二个元素地址, 再解引用操作,找到第二个元素,所以是4个字节 6)&a,a表示整个数组,&a取到了数组的地址,是地址,就是4/8个字节 7)&a ,&a取到了数组的地址,再解引用操作,找到了这个数组,相当于*&抵消了,所以 就是 a,单独放在sizeof内部,表示整个数组,大小是16字节 8)&a+1,&a表示数组的地址,+1还是地址,只是跳过了一个数组,是地址,就是4/8个字节 9)&a[0] == &*(a+0), &可以抵消,所以等于 (a+0)+1,由于a没有单独放在sizeof内部,也没有&a,所以a表示数组首元素地址,a+0+1就是第二个元素地址,是地址,就是4/8个字节 10)&a[0] +1 == &(a+0) +1,前面说过,&*可以抵消 就等于 (a+0)+1,a没有单独放在sizeof内部,所以a表示数组首元素地址,再+1,表示第二个元素地址,是地址,就是4/8个字节我的环境是32位平台下:

sizeof与字符数组 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));1)arr单独放在sizeof内部,计算数组大小,6*1=6字节 2)arr不再单独放在sizeof内部,arr表示数组首元素地址 +0还是地址,是地址,就是4/8字节 3)arr表示首元素地址,*arr找到了首元素 即 字符a,大小是1字节 4)arr[1] == (arr+1) ,首元素地址+1再解引用, 找到了第二个元素,大小是1字节 5)&arr,arr表示整个数组,&arr取到了数组的地址,是地址,就是4/8个字节 6)&arr+1,还是地址,只不过+1跳过了一个数组,是地址,就是4/8字节 7)&arr[0]+1 == &(arr+0) +1,&*可以抵消,就等于arr+0+1,arr表示数组首元素地址,+1是第二个元素地址,是地址,就4/8个字节结果如下:

sizeof与字符串 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));这是一个数组,放了一串字符串,后面有\0 1)arr单独放在sizeof内部,表示数组整个数组,由于存在一个\0 大小是7个字节 2)arr不再单独放在sizeof内部,arr表示数组首元素地址,是地址就是4/8字节 3)此时arr表示数组首元素地址,*arr,找到了首元素,大小是1字节 4)arr[1] == *(arr+1),arr表示首元素地址,+1是第二个元素地址,操作后,找到了第二个元素,大小1字节 5)&arr,arr表示整个数组,&arr取到了数组的地址,是地址就是4/8字节 6),+1后还是地址,只是跳过了一个数组,是地址就是4/8字节 7)&arr[0]+1,==&(arr+0)+1,&*抵消了,==arr+0+1,表示第二个元素的地址,是地址就是4/8字节

strlen与字符串 char arr[] = "abcdef"; 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));首先清楚strlen函数的参数是 const char* arr,传递的是一个地址 strlen会顺着这个地址往下找,直到找到 \0 为止,返回的是字符串的长度1)arr不并不是再sizeof内部,也不是&arr,所以arr表示数组首元素地址,即 "abcdef"中 a 的地址,strlen会顺着地址往下找,找到\0为止,并且不算\0,即返回62)arr+0等价于arr,返回6 3)arr表示首元素地址,*arr找到了首元素,即字符a, 'a'对应的ascii码值是97,意味着将97作为strlen 的地址,strlen会顺着97找下去,这是一个 错误的代码,所以程序会崩溃 如上图: 4)与 3)相同,找到字符b,程序会崩溃 5)这里会有一个警告:原因:arr是数组,数组的地址应该用数组指针来接收: char(p)[7] = &arr; 但是strlen的参数是:strlen(const char arr); 参数不同,故报错,但不影响strlen的计算结果,为6 6)&arr取到字符串的地址,+1跳过了一个字符串, 至于后面是什么,我们不得而知,也不知道strlen何时读取到\0,所以这里输出随机值7)&arr[0]+1 == &*(arr+0) +1,&*抵消了,==arr+0+1, 即找到了第二个元素的地址,也就是字符b的地址,从b开始往后数,答案就是5结果如下:

char* p = "abcdef"; p是一个指针,指针存放的是地址,放不了一个字符串长度,只能存放a的地址 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));1)p是一个指针,存放的是a的地址,是地址就是4/8字节2)p+1就是指向了第二个字符的地址,即b的地址,4/8 3)p放的是a的地址,p找到了a,即p==a,就是1字节 4)p[0] == (p+0) ,1字节 5)&p,取到的是p的地址(不是字符串abcdef的地址) 是地址,就是4/8字节 6)&p+1,跳过了一个指针p,还是地址,就是4/8字节 7)&p[0]+1,等价于&(p+0)+1,&*抵消了,等价于p+0+1,即b的地址,是地址,就是4/8字节结果如下:

指针和strlen char* p = "abcdef"; printf("%d\n", strlen(p)); printf("%d\n", strlen(p+1));//5 printf("%d\n", strlen(*p));//error printf("%d\n", strlen(p[0]));//err printf("%d\n", strlen(&p)); printf("%d\n", strlen(&p+1));//随机值 printf("%d\n", strlen(&p[0] + 1));1)p是char指针,存放的是a的地址,将该地址传递给strlen,strlen会顺着a的地址往后找,直到找到\0为止,所以长度是6字节 2)p+1找到b的地址,strlen从该地址处往后找,结果是5 3)p指向a的地址,p找到了a,把a作为strlen的地址,a的ascii码值是97,即将97作为strlen 的地址,是错误的 4)p[0]==(p+0),一样是错误的 5) ,&p,取到的是p的地址,注意是p的地址,不是a的地址,p的地址无法确定,所以是一个随机值 6)同5),&p+1只是向前移动了1,但地址仍然是未知的 7)&p[0]+1 == &(p+0) +1,&*可以抵消,== p+0+1,即找到了b的地址,所以答案是5结果如下: 关注我,持续为你输出高质量博文

【感谢龙石为本站提供信息共享平台 http://www.longshidata.com/pages/exchange.html】
网友评论