栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c指针(面试经典题目练习)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c指针(面试经典题目练习)

文章目录
  • 第一题
  • 第二题
  • 第三题
  • 第四题
  • 第五题
  • 第六题
  • 第七题
  • 第八题

第一题
#include
#include
int main()
{
	int a[5] = {1,2,3,4,5};
	int* ptr = (int*)(&a + 1);//&a取得整个数组额地址,&a+1跳过整个数组
			//数组指针强类型转化为整形指针
	printf("%d,%dn",*(a+1),*(ptr-1));//指针的加减看指针类型ptr为整形指针,所以 ptr-1指向数组的最后
	return 0;
}

第二题
#include
#include

struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}* p;
//假设P的值为0x100000
//已知结构体test类型的变量大小是20个字节
int main()
{
	p = (struct Test*)0x100000;
	printf("%pn",p+0x1);//00100014 p是结构体指针,p+1跳过整个结构体
						 //00100000+00000014=00100014
	printf("%pn",(unsigned long)p+0x1);//00100001 p的指针类型转化为整形+1就是单纯加1
	printf("%pn",(unsigned int*)p+0x1);//00100004 p转换为整形指针,P+1就是走过4字节
	return 0;
}

第三题
#include
#include
int main()
{
	int a[4] = {1,2,3,4};
	int* ptr1 = (int*)(&a+1);//&a取得整个数组额地址,&a+1跳过整个数组
				
	int* ptr2 = (int*)((int)a+1);
	printf("%xn",ptr1[-1]);//4 ptr[-1]==*(ptr+(-1))==*(ptr-1)
				//数组指针强类型转化为整形指针ptr-1,指向最后一个元素
	printf("%xn",*ptr2);//2 00 00 00 注意小端存储
	return 0;
}


第四题
#include
#include
int main()
{
	int a[3][2] = {(0,1),(2,3),(4,5)};//注意打括号内是小括号,并不是大括号以及逗号运算符的使用
	//a[3][2]{(0,1),(2,3),(4,5)}=={1,3,5}=={1,3,5,0,0,0}={{1,3,5},
	//														{0,0,0}}
	int* p = a[0];//p是第一行数组的的指针
	printf("%dn",p[0]);//p[0]==第一行第一个元素的值
	return 0;
}

第五题
#include
#include
int main()
{
	int a[5][5];
	int(*p)[4];
	p = a;
	printf("%p,%dn",&p[4][2]-&a[4][2], &p[4][2] - &a[4][2]);
}

第六题
#include
#include
int main()
{
	int aa[2][5] = {1,2,3,4,5,6,7,8,9,10};
	int *ptr1 = (int*)(&aa + 1);//&aa代表整个数组的地址,&aa+1:跳过整个数组
	int *ptr2 = (int*)(*(aa + 1));//aa代表数组的首元素,首元素是一个一维数组;
								   //aa+1:第二行首元素的地址
								   //*(aa+1) 第二行第一个元素
	printf("%dn",*(ptr1-1));//10
	printf("%dn",*(ptr2-1));//5
	return 0;
}

第七题
#include
#include
int main()
{
	char* a[] = {"work","at","alibaba"};
	char** pa = a;
	pa++;
	printf("%sn",*pa);
	return 0;
}

第八题
#include
#include
int main()
{
	char* c[] = {"ANTER","NEW","POINT","FIRST"};
	char** cp[] = {c + 3,c + 2,c + 1,c};
	char*** cpp = cp;
	printf("%sn",**++cpp);//POINT 
	//cpp+1指向c+2,两次解引用后找到POINT
	
	printf("%sn", *--*++cpp + 3);//ER
	//++cpp:cpp指向c+1
	//*(++cpp):得到c指针数组的第二个元素的指针的内容
	//--(*(++cpp)):第二个元素指针-1,得到第一个元素指针的内容
	//*(--(*(++cpp))):解引用得到ENTER
	//*(--(*(++cpp)))+3:指向T,输出TR
	
	printf("%sn",*cpp[-2]+3);//ST
	//注意cpp到目前为止还是指向c+1,cpp[-2]指向的地址内容变化,cpp的指向并未变化
	//*cpp[-2]==*(*(cpp+(-2))) 所以*cpp[-2]指向,c+3,得到的是FIRST
	//*cpp[-2]+3指向S
	
	printf("%sn",cpp[-1][-1]+1);//EW
	//注意cpp到目前为止还是指向c+1
	//cpp[-1][-1]+1 == *(*(cpp-1)-1)+1
	//*(cpp-1)指向c+2;
	//*(*(cpp-1)-1)指向c[2]的内容;
	//*(*(cpp-1)-1)+1指向NEW中的N
	return 0;
}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/932097.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号