首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >指针进阶试题

指针进阶试题

作者头像
绝活蛋炒饭
发布2024-12-16 15:33:00
发布2024-12-16 15:33:00
900
举报
文章被收录于专栏:绝活编程学习绝活编程学习

1. 指针和数组笔试题解析

1.1一维数组

代码语言:javascript
复制
int a[] = { 1,2,3,4 };

	printf("%d\n", sizeof(a));//16
	printf("%d\n", sizeof(a + 0));//4(这里a表示首元素地址)
	printf("%d\n", sizeof(*a));//4
	printf("%d\n", sizeof(a + 1));//4
	printf("%d\n", sizeof(a[1]));//4
	printf("%d\n", sizeof(&a));//4(取出的整个数组的地址,但是地址的大小只是4)
	printf("%d\n", sizeof(*&a));//16(这里解引用出来的是全部数组的内容)
	printf("%d\n", sizeof(&a + 1));//4
	printf("%d\n", sizeof(&a[0]));//4
	printf("%d\n", sizeof(&a[0] + 1));//4

1.2字符数组

代码语言:javascript
复制
//字符数组
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", sizeof(arr));//6
	printf("%d\n", sizeof(arr + 0));//4
	printf("%d\n", sizeof(*arr));//1
	printf("%d\n", sizeof(arr[1]));//1
	printf("%d\n", sizeof(&arr));//4
	printf("%d\n", sizeof(&arr + 1));//4
	printf("%d\n", sizeof(&arr[0] + 1));//4

	printf("%d\n", strlen(arr));//因为字符数组中没有'\0',所以是随机值
	printf("%d\n", strlen(arr + 0));//首元素地址,随机值
	printf("%d\n", strlen(*arr));//当我们传递a时,'a'的ASCII值是97,那97就作为地址传参,以97作为地址向后找,那就是非法访问内存
	printf("%d\n", strlen(arr[1]));//非法访问内存
	printf("%d\n", strlen(&arr));//arr是数组的地址,数组的地址和首元素地址的值是一样的
	printf("%d\n", strlen(&arr + 1));//随机值
	printf("%d\n", strlen(&arr[0] + 1));//随机值

1.3字符串数组

代码语言:javascript
复制
char arr[] = "abcdef";
	printf("%d\n", sizeof(arr));//7(别忘记\0)
	printf("%d\n", sizeof(arr + 0));//4
	printf("%d\n", sizeof(*arr));//1
	printf("%d\n", sizeof(arr[1]));//1
	printf("%d\n", sizeof(&arr));//4
	printf("%d\n", sizeof(&arr + 1));//4
	printf("%d\n", sizeof(&arr[0] + 1));//4

	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

1.4字符指针

代码语言:javascript
复制
char* p = "abcdef";
	printf("%d\n", sizeof(p));//4
	printf("%d\n", sizeof(p + 1));//4
	printf("%d\n", sizeof(*p));//1
	printf("%d\n", sizeof(p[0]));//1
	printf("%d\n", sizeof(&p));//4
	printf("%d\n", sizeof(&p + 1));//4
	printf("%d\n", sizeof(&p[0] + 1));//4

	printf("%d\n", strlen(p));//6
	printf("%d\n", strlen(p + 1));//5
	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));//5

1.5二维数组

代码语言:javascript
复制
//二维数组
	int a[3][4] = { 0 };

	printf("%d\n", sizeof(a));//48
	printf("%d\n", sizeof(a[0][0]));//4
	printf("%d\n", sizeof(a[0]));//16 对于二维数组来说,a[0]就是第一行这个一维数组的数组名
	printf("%d\n", sizeof(a[0] + 1));//4 a[0]作为第一行数组名,此时表示数组首元素地址,即a[0][0].a[0]+1,第一行第二个元素的地址
	printf("%d\n", sizeof(*(a[0] + 1)));//4
	printf("%d\n", sizeof(a + 1));//4 第二行的地址
	printf("%d\n", sizeof(*(a + 1)));//4*4=16
	printf("%d\n", sizeof(&a[0] + 1));//4 第二行的地址
	printf("%d\n", sizeof(*(&a[0] + 1)));//4*4=16
	printf("%d\n", sizeof(*a));//4
	printf("%d\n", sizeof(a[3]));//16

总结: 数组名的意义:

1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。 2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。 3. 除此之外所有的数组名都表示首元素的地址。


2. 指针笔试题

笔试题1:

代码语言:javascript
复制
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int *)(&a + 1);
printf( "%d,%d", *(a + 1), *(ptr - 1));
return 0;
}
//程序的结果是什么?

笔试题2

代码语言:javascript
复制
//由于还没学习结构体,这里告知结构体的大小是20个字节
struct Test
{
int Num;
char *pcName;
short sDate;
char cha[2];
short sBa[4];
}*p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main()
{
printf("%p\n", p + 0x1);
printf("%p\n", (unsigned long)p + 0x1);
printf("%p\n", (unsigned int*)p + 0x1);
return 0;
}

//指针加一跳过几,取决于指针类型 

0x100014 0x100001 0x100004


笔试题3

代码语言:javascript
复制
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

代码语言:javascript
复制
#include <stdio.h>
int main()
{
	int a[3][2] = { (0, 1), (2, 3), (4, 5) };
	int* p;
	p = a[0];
	printf("%d", p[0]);
	return 0;
}

笔试题5

代码语言:javascript
复制
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;
}

笔试题6

代码语言:javascript
复制
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

代码语言:javascript
复制
#include <stdio.h>
int main()
{
	char* a[] = { "work","at","alibaba" };
	char** pa = a;
	pa++;
	printf("%s\n", *pa);
	return 0;
}

笔试题8

代码语言:javascript
复制
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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 指针和数组笔试题解析
    • 1.1一维数组
    • 1.2字符数组
    • 1.3字符串数组
    • 1.4字符指针
    • 1.5二维数组
  • 2. 指针笔试题
    • 笔试题1:
    • 笔试题2
    • 笔试题3
    • 笔试题4
    • 笔试题5
    • 笔试题6
    • 笔试题7
    • 笔试题8
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档