未来笔试重点(1)

简介: 1.数组笔试重点考察1.1整型数组与sizeof1.2字符数组与sizeof1.3sizeof与字符串1.4strlen与字符串2.指针笔试重点考察2.1指针与sizeof2.2指针与strlensizeof与整型数组

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位平台下:

c4d1409df4c0487aa0eec0b4e8518c88.png

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个字节

e8b4c40c5ef947f6a7642fc0363a4788.png

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字节

5df24e69024f4f6b8cf1d10cb9d4fe30.png

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,即返回6


2)

arr+0等价于arr,返回6

3)

arr表示首元素地址,*arr找到了首元素,即字符a,

'a’对应的ascii码值是97,意味着将97作为strlen 的地址,strlen会顺着97找下去,这是一个

错误的代码,所以程序会崩溃

82d5462a6d2745f69636b1c44e06fa8d.png

如上图:

4)

与 3)相同,找到字符b,程序会崩溃

5)

这里会有一个警告:原因:arr是数组,数组的地址应该用数组指针来接收: char(p)[7] = &arr;

但是strlen的参数是:strlen(const char arr);

参数不同,故报错,但不影响strlen的计算结果,为6

6)

&arr取到字符串的地址,+1跳过了一个字符串,

ea5b67ca2bf44b98b6cc99fc7664cb8d.png

至于后面是什么,我们不得而知,也不知道strlen何时读取到\0,所以这里输出随机值

7)

&arr[0]+1 == &*(arr+0) +1,&*抵消了,==arr+0+1,

即找到了第二个元素的地址,也就是字符b的地址,从b开始往后数,答案就是5

结果如下:

bbe43a043f1c43f1b5d43e914babe218.png

指针和sizeof

  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字节

1afdc37e20534fb9a2a5aa472baaddf0.png

指针和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


结果如下:

3b7483986ca84d86b6b625650665f744.png

相关文章
|
18天前
|
网络安全 Windows
PentestGPT-V0(1),网络安全面试题2024笔试
PentestGPT-V0(1),网络安全面试题2024笔试
|
21天前
|
分布式计算 监控 大数据
《吊打面试官》- 大数据工程师50道中大厂面试真题保姆级详解
《吊打面试官》- 大数据工程师50道中大厂面试真题保姆级详解
30 1
《吊打面试官》- 大数据工程师50道中大厂面试真题保姆级详解
|
21天前
|
存储 算法 Java
盛算信息-面试经历-笔试部分-完整题目(一)
盛算信息-面试经历-笔试部分-完整题目(一)
46 2
|
21天前
|
缓存 算法 安全
2022最新Java后端面试题(带答案),重点都给画出来了!你不看?
2022最新Java后端面试题(带答案),重点都给画出来了!你不看?
110 0
|
11月前
|
网络协议 算法 前端开发
|
12月前
|
JSON 缓存 JavaScript
web前端面试宝典——带你直击面试重难点(40个经典题目,涵盖近90%的考点,码字2w,干货满满!)
web前端面试宝典——带你直击面试重难点(40个经典题目,涵盖近90%的考点,码字2w,干货满满!)
151 0
|
12月前
|
架构师 算法 Dubbo
划重点!2023面试必刷461道大厂架构面试真题汇总+面经+简历模板
在过去的一年里,LZ看到很多小伙伴在面试的时候都拿到了自己心仪的Offer,同时也在各大论坛博客平台看到了大家分享出来的面经,面试题。趁着年末时间多,公司上我手头的活基本完事了,就在业余时间把阿里,字节等大厂的Java岗面试真题为大家简单汇总了一下,一共是22个主流技术;除面试汇总外还有一份阿里七面面经与架构师简历模板,想要在金三银四面试的小伙伴可以好好看看,多少对你们有所帮助!
|
SQL 域名解析 负载均衡
面试:第十五章:蚂蚁金服面试以及答案(下)
面试:第十五章:蚂蚁金服面试以及答案
375 0
|
XML 缓存 监控
面试:第十五章:蚂蚁金服面试以及答案(上)
面试:第十五章:蚂蚁金服面试以及答案
509 0
|
SQL 安全 Java
面试突击76:${} 和 #{} 有什么区别?
面试突击76:${} 和 #{} 有什么区别?
224 1

热门文章

最新文章