指针笔试题(含大厂题)

 笔试题1:

#include<stdio.h>
int main()
{
	int a[5] = { 1, 2, 3, 4, 5 };
	int* ptr = (int*)(&a + 1);//取地址a,取出整个数组的地址,加一,指向数组后面的地址
	printf("%d,%d", *(a + 1), *(ptr - 1));
	//*(a+1)数组名a是数组首元素地址,加一是数组第二个元素的地址,解引用是2,
	//ptr被强转为int*,所以减1,是取出数组第5个元素地址,解引用是5
	return 0;
}

笔试题2:

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("%p\n", p + 0x1);//结构体指针 加1就是加一个结构体大小20,地址是16进制所以答案就是00 10 00 14 
	printf("%p\n", (unsigned long)p + 0x1);//p被强转为(unsigned long)现在是一个整数,整数加一就是00 10 00 01
	printf("%p\n", (unsigned int*)p + 0x1);//p被强转为(int*),加一就是加一个int*类型,00 10 00 04
	return 0;
}

笔试题3:

int main()
{
	int a[4] = { 1, 2, 3, 4 };//在内存中小端存储即01000000 02000000 03000000 04000000
	int* ptr1 = (int*)(&a + 1);//取地址&数组名,拿到整个数组地址,加一就是拿到数组后面的地址
	int* ptr2 = (int*)((int)a + 1);//数组名是数组首元素地址,地址被强转类型转换成int,然后加1,又重新转化成int*,此时地址加一,
	//拿到的是00 00 00 02,再以小端还原出来就是02 00 00 00.
	printf("%x,%x", ptr1[-1], *ptr2);
	//ptr[-1]相当于*(ptr-1),就是数组第4个元素4.
	return 0;
}

 

 笔试题4:

int main()
{
	int a[3][2] = { (0, 1), (2, 3), (4, 5) };//注意里面是()逗号表达式,所以a数组里存的是
	//1 3
	//5 0
	//0 0
	int* p;
	p = a[0];//拿到第一行元素的地址
	printf("%d", p[0]);//打印第一行的首元素就是1
	return 0;
}

 

笔试题5 :

int main()
{
	int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int* ptr1 = (int*)(&aa + 1);//&aa拿到数组地址,加一就是数组后面的地址
	int* ptr2 = (int*)(*(aa + 1));//二维数组,数组名aa拿到第一行的地址,加1后拿到第二行地址,再被强转为int*
	printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));//ptr1-1拿到数组第10个元素的地址。ptr2-1拿到6前面的地址
	return 0;
}

 笔试题6:

#include <stdio.h>
int main()
{
	char* a[] = { "work","at","alibaba" };//常量字符串放到表达式里是放字符串的首字符
	char** pa = a;//拿到首元素地址
	pa++;//地址加一,拿到"at"的地址
	printf("%s\n", *pa);
	return 0;
}

 

 笔试题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);//++改变cpp的指向,指向cp的第二元素,第一个解引用拿到cp中的c+2的地址,
	//再解引用拿到POINT的地址,打印出POINT
	printf("%s\n", *-- * ++cpp + 3);//++再次改变cpp的指向,解引用拿到c+1,再--就是c,再解引用拿到c的首元素
	//c[0]存放'E'的地址,再加3,就是'E'的地址,打印就是ER
	printf("%s\n", *cpp[-2] + 3);//相当于**(cpp-2)+3,cpp指向cp第3个元素地址,-2就是第一个元素地址,解引用拿到c+3,再解引用c+3指向c的4个元素,
	//存放FIRST首元素F的地址,+3就是S的地址,打印就是ST
	printf("%s\n", cpp[-1][-1] + 1);//相当于*(*(cpp-1)-1)+1,cpp-1指向cp第二个元素,解引用拿到c+2,再-1就是c+1,再解引用得到c的第2个元素,
	//存放N的地址,加1就是E的地址,打印就是EW
}

 

有点难,建议收藏反复看 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

指挥部在下面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值