当前位置:网站首页>指针和数组笔试题解析
指针和数组笔试题解析
2022-07-06 07:58:00 【拾至灬名瑰】
前言
大家好久不见哇!!!最近由于学校的考试,也没有更新博客,直到这两天才把学校的考试解决完,哈哈哈哈哈哈,已经迫不及待的给大家讲解啦!!!
今天我给大家讲讲关于数组和指针的面试题,内容可能会有些难度,有不会的知识点可以参考
还有一点本主机为32位环境,所以指针默认大小为4个字节!!!
一、指针和数组笔试题解析
1.一维数组
int main() {
int a[] = {
1,2,3,4 };
//sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小,单位是字节
printf("%d\n", sizeof(a));//16
//a不是单独放在sizeof内部,也没有取地址,所以a就是首元素地址,a+0还是首元素的地址
printf("%d\n", sizeof(a + 0));//4/8
//*a中的a是数组首元素的地址,*a就是对首元素的地址解引用,找到的就是首元素
//首元素的大小就是4个字节
printf("%d\n", sizeof(*a));//4
//这里a数组首元素的地址
//a+1是第二个元素的地址
//sizeof(a+1)就是地址的大小
printf("%d\n", sizeof(a + 1));//4/8
//计算的是第二个元素的大小
printf("%d\n", sizeof(a[1]));//4
//&a取出的数组的地址,数组的地址,也就是个地址
printf("%d\n", sizeof(&a));//4/8
//&a------>int(*)[4]
// &a拿到的是数组名的地址,类型是int(*)[4],是一组数组指针
//数组指针解引用相当于访问一个数组
// &*a---->a
//2.
//*和&抵消了 相当于sizeof(a)
printf("%d\n", sizeof(*&a));//16
//&a-->取出的是数组的指针
//&a-->int(*)[4]
//&a+1 是从数组a的地址向后跳过了一个(4个整形元素的)数组的大小
//&a+1还是地址,是地址就是4个字节
printf("%d\n", sizeof(&a + 1));//4/8
//&a[0]就是第一个元素的地址
//计算的是地址的大小
printf("%d\n", sizeof(&a[0]));//4/8
//&a[0]+1就是第二个元素的地址
//计算的是地址的大小
//&a[0]+1---->&a[1]
printf("%d\n", sizeof(&a[0] + 1));//4/8
return 0;
}
2.字符数组
int main() {
char arr[] = {
'a','b','c','d','e','f' };
//sizeof(数组名)
printf("%d\n", sizeof(arr));//6
//arr+0是数组首元素的地址
printf("%d\n", sizeof(arr + 0));//4/8
//*arr就是数组的首元素,大小是一个字节
//*arr--->arr[0]
//*(arr+0)---->arr[0]
printf("%d\n", sizeof(*arr));//1
//*arr就是数组的第二个元素,大小是一个字节
printf("%d\n", sizeof(arr[1]));//1
//&arr是数组的地址,是地址就是4/8个字节
printf("%d\n", sizeof(&arr));//4/8
//&arr + 1是数组后的地址
printf("%d\n", sizeof(&arr + 1));//4/8
//(&arr[0] + 1)就是数组的第二个元素,大小是一个字节
printf("%d\n", sizeof(&arr[0] + 1));//4/8
printf("%d\n", strlen(arr));//随机值
printf("%d\n", strlen(arr + 0));//随机值
//printf("%d\n", strlen(*arr));//--->strlen('a');--->strlen(97);//野指针
有问题
--->strlen('b');--->strlen(98);//野指针
//printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));//随机值
printf("%d\n", strlen(&arr + 1));//随机值-6
printf("%d\n", strlen(&arr[0] + 1));//随机值-1
return 0;
}
int main() {
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));//7
printf("%d\n", sizeof(arr + 0));//4/8
printf("%d\n", sizeof(*arr));//1
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//4/8
printf("%d\n", sizeof(&arr + 1));//4/8
printf("%d\n", sizeof(&arr[0] + 1));//4/8
//strlen是求字符串长度的,关注的是字符串中的\0,计算的是\0之前出现的字符的个数
//strlen是库函数,只针对字符串
//sizeof只关注占用内存空间的大小,不在乎内存中放的是什么
//sizeof是操作符
printf("%d\n", strlen(arr));//6
printf("%d\n", strlen(arr + 0));//6
有问题
//printf("%d\n", strlen(*arr));
//printf("%d\n", strlen(arr[1]));
//
printf("%d\n", strlen(&arr));//6
printf("%d\n", strlen(&arr + 1));//随机值
printf("%d\n", strlen(&arr[0] + 1));//5
return 0;
}
3.二维数组
int main() {
//二维数组
int a[3][4] = {
0 };
printf("%d\n", sizeof(a));//48
printf("%d\n", sizeof(a[0][0]));//4
//a[0]是第一行这一个一维数组的数组名,单独放在sizeof内部,a[0]表示第一个整个这个一维数组
//sizeof(a[0])计算的是这一行的大小
printf("%d\n", sizeof(a[0]));//16
//(a[0] + 1)--->&a[0][0]+1
//a[0]并没有单独放在sizeof内部,也没取地址
//a[0]就表示首元素的地址,就是第一行这个一维数组的第一个元素的地址
//a[0]+1就是第一行第二个元素的地址
printf("%d\n", sizeof(a[0] + 1));//4/8
printf("%d\n", sizeof(*(a[0] + 1)));//4
//a虽然是二维数组的地址,但是并没有单独放在sizeof内部,也没取地址
//a表示首元素的地址,二维数组的首元素是他的第一行,a就是第一行的地址
//a+1就是跳过第一行,表示第二行的地址
printf("%d\n", sizeof(a + 1));//4/8
//*(a + 1)是对第二行地址的解引用,拿到的是第二行
//*(a+1)--->a[1]
//sizeof(*(a+1))--->sizeof(a[1])
printf("%d\n", sizeof(*(a + 1)));//16
//&a[0]--对第一行的数组名取地址,哪出的是第一行的地址
//&a[0]+1--得到的是第二行的地址
printf("%d\n", sizeof(&a[0] + 1));//4/8
printf("%d\n", sizeof(*(&a[0] + 1)));//16
//a表示首元素的地址,就是第一行的地址
//*a就是对第一行地址的解引用,拿到的就是一行
printf("%d\n", sizeof(*a));//16
printf("%d\n", sizeof(a[3]));//16
return 0;
}
总结:
数组名的意义:
- sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
- &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
- 除此之外所有的数组名都表示首元素的地址。
二、指针笔试题
1.面试题1
int main()
{
int a[5] = {
1, 2, 3, 4, 5 };
int* ptr = (int*)(&a + 1);//&a的类型是 int(*)[5],所以需要强制类型转化为int*
printf("%d,%d", *(a + 1), *(ptr - 1));
return 0;
}
//程序的结果是什么?
2.面试题2
//由于还没学习结构体,这里告知结构体的大小是20个字节
struct Test
{
int Num;
char* pcName;
short sDate;
char cha[2];
short sBa[4];
}*p= (struct Test*)0x100000;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main()
{
printf("%p\n", p + 0x1);//0x00100014
//0x100000+20--->//0x100014
printf("%p\n", (unsigned long)p + 0x1);//0x00100001
//1,048,576+1--->1,048,577
//0x100001
printf("%p\n", (unsigned int*)p + 0x1);//0x00100004
//0x100000+4--->//0x100004
return 0;
}
3.面试题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;
}
4.面试题4
int main()
{
int a[3][2] = {
(0, 1), (2, 3), (4, 5) };
int* p;
p = a[0];//a[0]是第一行的数组名
//a[0]表示首元素的地址,即a[0][0]的地址,&a[0][0]
printf("%d", p[0]);
return 0;
}
5.面试题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]);//-4 -4
//地址相减的值是中间元素的个数
return 0;
}
6.面试题6
int main()
{
int aa[2][5] = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int* ptr1 = (int*)(&aa + 1);
int* ptr2 = (int*)(*(aa + 1));
printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));
return 0;
}
7.面试题7
int main()
{
char* a[] = {
"work","at","alibaba" };
char** pa = a;
pa++;
printf("%s\n", *pa);
return 0;
}
8.面试题8
int main()
{
char* c[] = {
"ENTER","NEW","POINT","FIRST" };
char** cp[] = {
c + 3,c + 2,c + 1,c };
char*** cpp = cp;
printf("%s\n", **++cpp);//point
printf("%s\n", *-- * ++cpp + 3);//er
printf("%s\n", *cpp[-2] + 3);// st
printf("%s\n", cpp[-1][-1] + 1);//ew
return 0;
}
在这里要注意的是++cpp是将cpp的地址改变了
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了关于数组和指针的面试题解析,本次文章内容有点多,需要大家慢慢理解,大家有不懂可以私聊我哦!!!
边栏推荐
- Qualitative risk analysis of Oracle project management system
- datax自检报错 /datax/plugin/reader/._drdsreader/plugin.json]不存在
- Solution: système de surveillance vidéo intelligent de patrouille sur le chantier
- 解决方案:智慧工地智能巡检方案视频监控系统
- onie支持pice硬盘
- Data governance: Data Governance under microservice architecture
- 2.10transfrom attribute
- Asia Pacific Financial Media | designer universe | Guangdong responds to the opinions of the national development and Reform Commission. Primary school students incarnate as small community designers
- Artcube information of "designer universe": Guangzhou implements the community designer system to achieve "great improvement" of urban quality | national economic and Information Center
- The ECU of 21 Audi q5l 45tfsi brushes is upgraded to master special adjustment, and the horsepower is safely and stably increased to 305 horsepower
猜你喜欢
将 NFT 设置为 ENS 个人资料头像的分步指南
Compliance and efficiency, accelerate the digital transformation of pharmaceutical enterprises, and create a new document resource center for pharmaceutical enterprises
National economic information center "APEC industry +": economic data released at the night of the Spring Festival | observation of stable strategy industry fund
Risk planning and identification of Oracle project management system
File upload of DVWA range
[factorial inverse], [linear inverse], [combinatorial counting] Niu Mei's mathematical problems
[1. Delphi foundation] 1 Introduction to Delphi Programming
Qualitative risk analysis of Oracle project management system
MEX有关的学习
Google may return to the Chinese market after the Spring Festival.
随机推荐
onie支持pice硬盘
Apache middleware vulnerability recurrence
NFT smart contract release, blind box, public offering technology practice -- jigsaw puzzle
数字经济时代,如何保障安全?
C # connect to SQLite database to read content
Generator Foundation
Data governance: Data Governance under microservice architecture
Opencv learning notes 8 -- answer sheet recognition
软件开发的一点随记
[KMP] template
"Designer universe": "benefit dimension" APEC public welfare + 2022 the latest slogan and the new platform will be launched soon | Asia Pacific Financial Media
649. Dota2 Senate
08- [istio] istio gateway, virtual service and the relationship between them
P3047 [USACO12FEB]Nearby Cows G(树形dp)
How to estimate the number of threads
数据治理:微服务架构下的数据治理
解决方案:智慧工地智能巡检方案视频监控系统
Le chemin du navigateur Edge obtient
Epoll and IO multiplexing of redis
Leetcode question brushing record | 203_ Remove linked list elements