目录

​​一、数组笔试题解析​​

​​知识点:​​

​​1、一维数组题目​​

​​题目1:​​

​​ 2、字符数组题目​​

​​题目一:字符​​

​​题目二:字符串​​

​​题目三:指针变量​​

​​ 3、二维数组题目​​

​​二、指针笔试题​​

​​笔试题1:​​

​​ 笔试题2:​​

​​笔试题3:​​

​​笔试题4:​​

​​ 笔试题5:​​

​​笔试题6:​​

​​ 笔试题7:​​

​​笔试题8:​​

​​结语:​​




一、数组笔试题解析

知识点:

只要是地址就是4/8个字节


 数组名

数组名是数组首元素的地址
但是有2个例外:
1. sizeof(数组名) - 数组名表示整个数组,计算的是整个数组的大小,单位是字节
2. &数组名 - 数组名也表示整个数组,取出的是整个数组的地址
除了这个2个例外,你见到的所有的数组名都表示首元素的地址


 sizeof

sizeof 是计算对象或者类型创建的对象所占内存空间的大小,单位是字节
sizeof 是操作符,不是函数


strlen

strlen 求字符串长度的,计算的是字符串中\0之前出现的字符的个数
统计到\0为止,如果没有看到\0,会继续往后找
strlen 是库函数

1、一维数组题目

题目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;
}

【C】数组和指针练习_笔试题 运行结果:

【C】数组和指针练习_题目解析_02

【C】数组和指针练习_笔试题_03​编辑题目解析:

【C】数组和指针练习_数组名_04

【C】数组和指针练习_数组名_05​编辑


 2、字符数组题目

题目一:字符

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));
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;
}

【C】数组和指针练习_笔试题_06

这里的printf("%d\n", strlen(*arr)); printf("%d\n", strlen(arr[1]))在运行时会报错,所以下面的运行结果不包括这两个,具体原因见后文

 运行结果:

【C】数组和指针练习_笔试题_07

【C】数组和指针练习_笔试题_08​编辑 题目解析:

【C】数组和指针练习_笔试题_09

【C】数组和指针练习_数组名_10编辑


题目二:字符串

此题目与上述题目类似,若上面的例子已完全掌握,此题将手到擒来

因此,这里只提供运行结果与必要的暗示

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));

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;
}

【C】数组和指针练习_笔试题_11 题目解析及运行结果:

【C】数组和指针练习_题目解析_12

【C】数组和指针练习_数组名_13编辑


 题目三:指针变量

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));
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));

【C】数组和指针练习_笔试题_14

题目解析及运行结果

【C】数组和指针练习_数组名_15

【C】数组和指针练习_笔试题_16编辑

【C】数组和指针练习_笔试题_17

【C】数组和指针练习_笔试题_18编辑


 3、二维数组题目

int a[3][4] = {0};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a[0][0]));
printf("%d\n",sizeof(a[0]));
printf("%d\n",sizeof(a[0]+1));
printf("%d\n",sizeof(*(a[0]+1)));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(*(a+1)));
printf("%d\n",sizeof(&a[0]+1));
printf("%d\n",sizeof(*(&a[0]+1)));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a[3]));

【C】数组和指针练习_数组名_19题目解析及运行结果:

【C】数组和指针练习_笔试题_20

【C】数组和指针练习_笔试题_21编辑

【C】数组和指针练习_笔试题_22

【C】数组和指针练习_笔试题_23编辑


二、指针笔试题

笔试题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;
}
//程序的结果是什么?

【C】数组和指针练习_题目解析_24

【C】数组和指针练习_笔试题_25

【C】数组和指针练习_笔试题_26编辑


 笔试题2:

/由于还没学习结构体,这里告知结构体的大小是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;
}

【C】数组和指针练习_笔试题_27题目解析及运行结果:

【C】数组和指针练习_数组名_28

【C】数组和指针练习_题目解析_29编辑


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

//%p - 是打印地址
//%x - 是16进制的格式打印
return 0;
}

【C】数组和指针练习_数组名_30

题目解析及运行结果:

【C】数组和指针练习_题目解析_31

【C】数组和指针练习_数组名_32编辑


笔试题4:

#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;
}

【C】数组和指针练习_数组名_33

题目解析及运行结果:

【C】数组和指针练习_数组名_34

【C】数组和指针练习_笔试题_35编辑


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

【C】数组和指针练习_数组名_36

题目解析及运行结果:

【C】数组和指针练习_笔试题_37

【C】数组和指针练习_数组名_38编辑


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

【C】数组和指针练习_题目解析_39题目解析及运行结果:

【C】数组和指针练习_题目解析_40

【C】数组和指针练习_题目解析_41编辑


 笔试题7:

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

【C】数组和指针练习_笔试题_42题目解析及运行结果:

【C】数组和指针练习_题目解析_43

【C】数组和指针练习_笔试题_44编辑


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

【C】数组和指针练习_笔试题_45题目解析及运行结果:

【C】数组和指针练习_笔试题_46

【C】数组和指针练习_数组名_47编辑


结语:

这里我们关于指针笔试题的内容就介绍完了,如果小伙伴还有不理解的内容,可以参考之前关于指针进阶的博文。
文章中某些内容我们之前有介绍,所以只是一笔带过,还请谅解。
希望以上内容对大家有所帮助👀,如有不足望指出🙏

加油!!