当前位置:网站首页>指针和数组笔试题解析
指针和数组笔试题解析
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的地址改变了
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了关于数组和指针的面试题解析,本次文章内容有点多,需要大家慢慢理解,大家有不懂可以私聊我哦!!!
边栏推荐
- Yu Xia looks at win system kernel -- message mechanism
- Wireshark grabs packets to understand its word TCP segment
- Compliance and efficiency, accelerate the digital transformation of pharmaceutical enterprises, and create a new document resource center for pharmaceutical enterprises
- octomap averageNodeColor函数说明
- Description of octomap averagenodecolor function
- TS类型体操 之 字符串的妙用
- Cf1036c class numbers solution
- Hackathon ifm
- Launch APS system to break the problem of decoupling material procurement plan from production practice
- The Vice Minister of the Ministry of industry and information technology of "APEC industry +" of the national economic and information technology center led a team to Sichuan to investigate the operat
猜你喜欢
Key value judgment in the cycle of TS type gymnastics, as keyword use
07- [istio] istio destinationrule (purpose rule)
Pre knowledge reserve of TS type gymnastics to become an excellent TS gymnastics master
opencv学习笔记八--答题卡识别
[computer skills]
Comparison of usage scenarios and implementations of extensions, equal, and like in TS type Gymnastics
21. Delete data
Wireshark grabs packets to understand its word TCP segment
octomap averageNodeColor函数说明
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
随机推荐
让学指针变得更简单(三)
Hackathon ifm
CAD ARX gets the current viewport settings
数字经济时代,如何保障安全?
Luogu p1836 number page solution
Yu Xia looks at win system kernel -- message mechanism
49. Sound card driven article collection
将 NFT 设置为 ENS 个人资料头像的分步指南
Machine learning - decision tree
【T31ZL智能视频应用处理器资料】
Position() function in XPath uses
Go learning notes (3) basic types and statements (2)
Step by step guide to setting NFT as an ens profile Avatar
珠海金山面试复盘
It's hard to find a job when the industry is in recession
2.10transfrom attribute
Sanzi chess (C language)
flask返回文件下载
C intercept string
MES, APS and ERP are essential to realize fine production