【绝密】指针大厂笔试题

👦个人主页:@Weraphael

✍🏻作者简介:目前是C语言学习者

✈️专栏:C语言刷题
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬  点赞👍🏻 收藏 📂 加关注😍


前言

  • 对指针或者数组的某个知识点不了解,请参考以下链接

数组篇:点击跳转

指针篇:点击跳转

  • 重要的知识点

①sizeof(数组名),sizeof内部单独放一个数组名,计算的是整个数组的大小,单位:字节

②&数组名,取出的是整个数组的地址

③除此之外所有的数组名都表示首元素地址

④指针的大小为4/8个字节(取决于环境)

目录

 一、数组笔试题

1、一维数组

2、字符数组 

        (1)sizeof

        (2)strlen

3、 字符串

        (1)sizeof

        (2)strlen

4、字符指针

        (1)sizeof

        (2)strlen

5、二维数组

二、指针笔试题


一、数组笔试题

1、一维数组

#include <stdio.h>
int main()
{
    int a[] = { 1,2,3,4 };
    printf("%d\n",sizeof(a));
    printf("%d\n",sizeof(a + 0));
    printf("%d\n",sizeof(*a));
    printf("%d\n",sizeof(a + 1));
    printf("%d\n",sizeof(a[1]));
    printf("%d\n",sizeof(&a));
    printf("%d\n",sizeof(*&a));
    printf("%d\n",sizeof(&a + 1));
    printf("%d\n",sizeof(&a[0]));
    printf("%d\n",sizeof(&a[0] + 1));
    
    return 0;
}

【答案解析】

 【程序结果】

x86环境下

 2、字符数组 

(1)sizeof

#include <stdio.h>
int main()
{
    char arr[]  = { 'a','b','c','d','e','f' };
    printf("%d\n",sizeof(arr));
    printf("%d\n",sizeof(arr + 0));
    printf("%d\n",sizeof(*arr));
    printf("%d\n",sizeof(arr[1]));
    printf("%d\n",sizeof(&arr));
    printf("%d\n",sizeof(&arr + 1));
    printf("%d\n",sizeof(&arr[0] + 1));
    return 0;
}

【答案解析】

 【程序结果】

x86环境

 (2)strlen

strlen只求字符串长度,统计的是'\0'之前出现的字符个数(不包括\0),找到'\0'才算结束。

#include <stdio.h>
#include <string.h>

int main()
{
    char arr[]  = { 'a','b','c','d','e','f' };
    
    printf("%d\n",strlen(arr));
    printf("%d\n",strlen(arr + 0));
    printf("%d\n",strlen(*arr));
    printf("%d\n",strlne(arr[1]));
    printf("%d\n",strlen(&arr));
    printf("%d\n",strlen(&arr + 1));
    printf("%d\n",strlen(&arr[0] + 1));
    
    return 0;
}

【答案解析】

 【非法访问】

3、 字符串

(1)sizeof

#include <stdio.h>

int main()
{
    char arr[]  = "abcdef";
    printf("%d\n",sizeof(arr));
    printf("%d\n",sizeof(arr + 0));
    printf("%d\n",sizeof(*arr));
    printf("%d\n",sizeof(arr[1]));
    printf("%d\n",sizeof(&arr));
    printf("%d\n",sizeof(&arr + 1));
    printf("%d\n",sizeof(&arr[0] + 1));
    return 0;
}

【答案解析】

 (2)strlen

#include <stdio.h>
#include <string.h>

int main()
{
    char arr[]  = "abcdef";
    printf("%d\n",strlen(arr));
    printf("%d\n",strlen(arr + 0));
    printf("%d\n",strlen(*arr));
    printf("%d\n",strlen((arr[1]));
    printf("%d\n",strlen((&arr));
    printf("%d\n",strlen((&arr + 1));
    printf("%d\n",strlen((&arr[0] + 1));
    return 0;
}

【答案解析】

 4、字符指针

(1)sizeof

#include <stdio.h>
int main()
{
    char* p = "abcdef";
    printf("%d\n",sizeof(p));
    printf("%d\n",sizeof(p + 1));
    printf("%d\n",sizeof(*p));
    printf("%d\n",sizeof(p[0]));
    printf("%d\n",sizeof(&p));
    printf("%d\n",sizeof(&p + 1));
    printf("%d\n",sizeof(&p[0] + 1));
    
    return 0;
}

 【答案解析】

(2)strlen

#include <stdio.h>
#include <string.h>
int main()
{
    char* p = "abcdef";
    printf("%d\n",strlen(p));
    printf("%d\n",strlen(p + 1));
    printf("%d\n",strlen(*p));
    printf("%d\n",strlen(p[0]));
    printf("%d\n",strlen(&p));
    printf("%d\n",strlen(&p + 1));
    printf("%d\n",strlen(&p[0] + 1));
    
    return 0;
}

【答案解析】

5、二维数组

#include <stdio.h>
int main()
{
    int arr[3][4] = {0};
    printf("%d\n",sizeof(arr));
    printf("%d\n",sizeof(arr[0][0]));
    printf("%d\n",sizeof(arr[0]));
    printf("%d\n",sizeof(arr[0] + 1));
    printf("%d\n",sizeof(*(arr[0] + 1));
    printf("%d\n",sizeof(arr + 1);
    printf("%d\n",sizeof(*(arr + 1));
    printf("%d\n",sizeof(&arr[0] + 1));
    printf("%d\n",sizeof(*(&arr[0] + 1));
    printf("%d\n",sizeof(*arr));
    printf("%d\n",sizeof(arr[3]));
}

 【答案解析】

上半部分

 下半部分

二、指针笔试题

第一题

#include <stdio.h>
int main()
{
    int a[5] = {1,2,3,4,5};
    
    int *p = (int*)(&a + 1);
    
    printf("%d,%d\n",*(a + 1),*(p - 1));
    
    return 0;
}

 【答案解析】

第二题

#include <stdio.h>

//已知结构体的大小为20个字节
//p的值为0x100000

struct Test
{
    int num;
    char* name;
    short xhz;
    char cha[2];
    short cxk[4];
}*p;

int main()
{
    printf("%p\n",p + 0x1);
    printf("%p\n",(unsigned long)p + 0x1);
    printf("%p\n",(unsigned int*)p + 0x1);
    return 0
}

【答案解析】

【程序运行结果】 

第三题

#include <stdio.h>
int main()
{
    int arr[4] = {1,2,3,4};
    int *p = (int*)(&arr + 1);
    int *ptr = (int *)((int)arr + 1);
    printf("%x,%x",p[-1],*ptr);
    return 0;
}

 【答案解析】

 第四题

#include <stdio.h>
int main()
{
	int a[3][2] = { (0,1),(2,3),(4,5) };
	int* p;
	p = a[0];
	printf("%d\n", p[0]);
	return 0;
}

 【答案解析】

第五题

#include <stdio.h>
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;
}

 【答案解析】

第六题

#include <stdio.h>
int main()
{
	int a[2][5] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = (int*)(&a + 1);
	int* ptr = (int*)(*(a + 1));
	printf("%d %d", *(p - 1), *(ptr - 1));
	return 0;
}

【答案解析】

第七题

#include <stdio.h>
int main()
{
	char* a[] = { "work","at","alibaba" };
	char** p = a;
	p++;
	printf("%s\n", *p);
	return 0;
}

 【答案解析】

第八题

#include <stdio.h>
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);
	return 0;
}

 【答案解析】

 

评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值