首页 > 其他分享 >C语言指针进阶笔试题(含解析)

C语言指针进阶笔试题(含解析)

时间:2024-09-19 16:21:59浏览次数:12  
标签:解析 进阶 int 笔试 C语言 char printf main

笔试题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;
}

 解析:*(a + 1),a是首元素的地址,加1 之后就是第二个元素的地址,解引用就是2。ptr是&a+1,取出的是整个数组的地址,加1跳过整个数组:

强转为int*之后 -1 :

笔试题2:

//告知这个结构体大小是20个字节,必须在x86环境下
struct Test
{
	int Num;
	char* pcName;
	short sData;
	char cha[2];
	short sBa[4];
}*p;
//假设p的值是0x100000. 0x是16进值
int main()
{
	printf("%p\n", p + 0x1);
	printf("%p\n", (unsigned long)p + 0x1);
	printf("%p\n", (unsigned int*)p + 0x1);
}

 解析:0x1 16进值也是1,所以第一个就是结构体指针加1,跳过一个结构体的大小,第二个被强转成整形,加1 就是加1 ,没什么意义。第三个强转的int*,所以加1就是跳过一个int类型。

笔试题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;
}

解析:ptr1很好理解,取出了整个数组的地址,加1之后被强转为int*,和第一天差不多,ptr[-1] == *(ptr - 1)。ptr2首先把地址强转成整形加1就是加1了,然后又被强转成int*,解引用是怎么样的?

 这是内存设置中的样子,int*取出四个字节。

笔试题4:

int main()
{
	int a[3][2] = { (0,1),(2,3),(4,5) };
	int* p;
	p = a[0];
	printf("%d", p[0]);
	return 0;
}

解析:二维数组初始化里有几个小括号,这几个小括号是逗号表达式,所以二维数组里的元素只有,1,3,5。a[0]是第一行数组的数组名,所以p[0]是第一行数组的第一个元素。

笔试题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;
}

解析:

%p 是以内存方式打印,打印地址的,不管是什么都打印成内存指针的样子。

笔试题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:

int main()
{
	char* a[] = { "work","at","alibaba" };
	char** pa = a;
	pa++;
	printf("%s\n", *pa);
	return 0;
}

解析: 

解引用pa之后找到的就是"a"的地址,所以打印出来是“at” 。

笔试题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);

	printf("%s\n", *--*++cpp+3);

	printf("%s\n", *cpp[-2]+3);

	printf("%s\n", cpp[-1][-1]+1);
}

解析: ​​​​​​​

(这题里有关于优先级的问题,可以上网查查)

答案大家可以自行复制代码打印看看 

标签:解析,进阶,int,笔试,C语言,char,printf,main
From: https://blog.csdn.net/m0_75122019/article/details/142330087

相关文章

  • 2024Mysql And Redis基础与进阶操作系列(4)作者——LJS[含MySQL FOREIGN KEY、CHECK 、D
    接上集1.FOREIGNKEY约束1.1作用限定某个表的某个字段的引用完整性。例如:员工表的员工所在部门的选择,必须在部门表能找到对应的部分。1.2关键字FOREIGNKEY1.3主表和从表/父表和子表主表(父表):被引用的表,被参考的表从表(子表):引用别人的表,参考别人的表例如:员工表的员工所在部门这......
  • 2024 Python3.10 系统入门+进阶(十五):文件及目录操作
    目录一、文件IO操作1.1创建或打开文件1.2读取文件1.2.1按行读取1.2.2多行读取1.2.3完整读取1.3写入文件1.3.1写入字符串1.3.2写入序列1.4上下文管理1.4.1with语句的使用1.4.2上下文管理器(拓展----可以学了面向对象之后再回来看)1.5文件的遍历二、os.pat......
  • Linux进阶系列(四)——awk、sed、端口管理、crontab
    目录1.写在前面2.awk——强大的文本处理工具2.1awk概述2.2awk脚本结构2.3awk的内置变量2.4awk的高级用法2.5awk实践3.sed——流式文本编辑器3.1sed的基本语法3.2sed常用命令3.3sed的高级用法4.Linux端口管理4.1端口的概念4.2查看端口状态4.3......
  • c语言学习---指针
    1.计算机内存划分为一个个内存单元,每个内存单元占1字节,而每个内存单元都有一个特点的编号,称为地址,也称为指针,通过指针可以找到对应的内存单元并调用内存单元内存放的数据.2.指针变量:存放指针的变量称为指针变量,表示形式如下:指向数据类型*变量名,通过*(解引用操作符)操作指针变......
  • c语言学习---操作符
    1.算术操作符:+ -  *  /  %,加减乘与数学上的算法相同,但 / 在运算两个整型数据时,算的是整数除法,不会四舍五入,只取整数部分,要算小数运算两个操作数至少要有一个浮点型数据.2.%(整型取模操作符)算的是两个整型操作符的余数,浮点数不能计算.3.单双目操作符:定义操作......
  • Kimi进阶,价值过万的知识图谱,kimi搞定
    大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300+款以上的AI应用工具。关注科技及大模型领域对社会的影响10年+。关注我一起驾驭AI工具,拥抱AI时代的到来。知识图谱是什么知识图谱在过去几年当中,都是学术研究和教学领域非常重要的一个研究方法和表......
  • 【面试经验】2024年9月滴滴后端笔试 java
    比较简单,两题编程。选择题好像是20题,有部分不确定,有C++的几题。题目记不清了,凭印象写一下。编程题第一题充电第一题:n个玩具,m电量,尽可能让一个大的区间内的玩具的电量充满。输出充满电的玩具个数。双指针+滑动窗口。importjava.util.Scanner;publicclassMa......
  • 扩展分析C语言单双引号、反斜杠与注释
    目录注释奇怪的注释C风格的注释无法嵌套一些特殊的注释注释的规则建议反斜杠'\'反斜杠有续行的作用,但要注意续行后不能添加空格回车也能起到换行的作用,那续行符的意义在哪?反斜杠的转义功能单引号和双引号字面值,字符串,字符,字符变量的大小为什么sizeof('1')的大小是4?char类型一......
  • 【MySQL】使用C语言连接数据库
           看到标题,可能会疑惑,我们学习的不是C++吗,为什么使用C语言去连接数据库呢??实际上,这两种语言都可以连接数据库,但是C语言提供的API没有进行封装,更有利于我们学习数据库连接。面向API编程,哈哈哈哈哈哈!!!!!一、安装适合自己平台的mysqlconnect库    因为我使用......
  • 2024Mysql And Redis基础与进阶操作系列(2)作者——LJS[含MySQL登录;DDL;DML;举例说明;编码
    目录1.MySQL的登录1.1服务的启动和停止方式1:使用图形界面工具步骤1:打开windows服务 步骤2:找到MySQL80(点击鼠标右键)→启动或停止(点击)编辑补充说明2点:1.2自带客户端的登录与退出登录方式1:MySQL自带客户端注意:退出登录2MySQL数据库基本操作-DDL和DML2.1.DDL解释2.......