笔记|指针和数组笔试题详解
准备 博主:大大怪先森(记得关注哦!)
编程环境:vs2013
提示:本文内容主要讲述指针和数组的笔试题(需要具备一定的C语言基础,了解指针和数组!!!)
文章目录
- 准备
- 前言
- 一、数组笔试题
-
- 1.一维数组
- 2.二维数组
- 3.字符数组
-
- 3.1笔试题
- 3.2笔试题
- 3.3笔试题
- 二、指针笔试题
-
- 1.笔试题
- 2.笔试题
- 3.笔试题
- 4.笔试题
- 5.笔试题
- 6.笔试题
- 7.笔试题
- 8.笔试题
- 三、qsort函数
-
- 1.qsort函数的基本使用
- 2.qsort函数模拟实现(冒泡排序版)
- 总结
前言 需知:
在小编的上一篇文章C语言指针篇(一篇文章让你不再晕“针”)!!!
相信你一定对指针有了更加深刻的理解,实践是检验真理的唯一标准。
我们趁热打铁,赶紧磨炼磨练我们知识的利刃。
本文小编准备了一些笔试题给各位大大试试身手。
提示:以下是本篇文章正文内容。
一、数组笔试题 1.一维数组 代码如下(示例):
int main()
{ //一维数组
int a[] = {
1, 2, 3, 4 };
printf("%d\n", sizeof(a));
//16
//数组名a单独放在sizeof内部,数组名表示整个数组,计算的是整个数组的大小
printf("%d\n", sizeof(a + 0));
//4/8
//a表示首元素的地址,a+0还是首元素的地址,地址的大小是4/8字节
printf("%d\n", sizeof(*a));
//4/8
//a表示首元素的地址,*a 就是首元素 ==> a[0] ,大小就是4
//*a += *(a + 0) == a[0]
printf("%d\n", sizeof(a + 1));
//4/8
///a表示首元素的地址,a+1是第二个元素的地址,大小就是4/8
printf("%d\n", sizeof(a[1]));
//4/8
//
printf("%d\n", sizeof(&a));
//4/8
//&a是取出整个元素的地址,但是还仍然是一个地址
printf("%d\n", sizeof(*&a));
//16
//*&a - &a是数组的地址,对数组的地址解引用拿到的是数组,所以大小时候16
printf("%d\n", sizeof(&a + 1));
//4
//取得是下一个数组的地址,虽然不知道大小但是我只是取了一个地址
printf("%d\n", sizeof(&a[0]));
//4/8
//&a是数组的地址,&a+1 是数组的地址+1,跳过整个数组,虽然跳过了数组,
printf("%d\n", sizeof(&a[0] + 1));
//4
return 0;
}
以下答案均按32位地址线地址大小为4个字节
16 4 4 4 4 4 16 4 4 42.二维数组 代码如下(示例):
int main()
{ 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]是第一行的数组名,数组名单独放在sizeof内部
printf("%d\n", sizeof(a[0] + 1));
//4
printf("%d\n", sizeof(*(a[0] + 1)));
//4
//a[0]是第一行的数组的数组名,并没有单独放在sizeof内部,也没有&,所以a[0]表示首元素的地址
printf("%d\n", sizeof(a + 1));
//4
printf("%d\n", sizeof(*(a + 1)));
//16
printf("%d\n", sizeof(&a[0] + 1));
//*(a[0] + 1) == *(*(a + 0) + 1)就是第一行第二个元素
//a[0]是第一行的数组名
//&a[0] 拿到的是第一行的地址
//&a[0]+1,就是第二行的地址
//int(*)[4]
//4
printf("%d\n", sizeof(*(&a[0] + 1)));
//16
printf("%d\n", sizeof(*a));
//*a - 第一行 - 第一行的数组名
//*a -> *(a+0) ->a[0]
//16
printf("%d\n", sizeof(a[3]));
a[3]假设存在,就是第四行的数组名,sizeof(a[3]),就相当于把第四行的数组名单独放在sizeof内部
//未知数
return 0;
}
48 4 16 4 4 4 4 16 4 16 16 未知数3.字符数组 3.1笔试题
代码如下(示例):
int main()
{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));
//未知数
printf("%d\n", strlen(arr + 0));
//19
printf("%d\n", strlen(*arr));
//erro
printf("%d\n", strlen(arr[1]));
//erro
printf("%d\n", strlen(&arr));
//erro
printf("%d\n", strlen(&arr + 1));
//erro
printf("%d\n", strlen(&arr[0] + 1));
//erro
return 0;
}
6 4 1 1 4 4 4 erro erro erro erro erro erro erro erro erro erro3.2笔试题
代码如下(示例):
int main()
{char arr[] = "abcdef";
printf("%d\n", sizeof(arr));
//7
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]));
//5
printf("%d\n", strlen(&arr));
//6
printf("%d\n", strlen(&arr + 1));
//未知数
printf("%d\n", strlen(&arr[0] + 1));
//5
return 0;
}
7 4 1 1 4 4 4 6 6 未知数 5 6 未知数 53.3笔试题
【笔记|指针和数组笔试题详解】代码如下(示例):
int main()
{ 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));
//erro
printf("%d\n", strlen(p[0]));
//erro
printf("%d\n", strlen(&p));
//未知数
printf("%d\n", strlen(&p + 1));
//未知数
printf("%d\n", strlen(&p[0] + 1));
//5
return 0;
4 4 1 1 4 4 4 6 5 erro erro 未知数 未知数 5二、指针笔试题 代码如下(示例):
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;
}
2 52.笔试题 代码如下(示例):
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;
}
0x1000001 0x10000143.笔试题 代码如下(示例):
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 未知数4.笔试题 代码如下(示例):
#include
int main()
{int a[3][2] = {
(0, 1), (2, 3), (4, 5) };
int *p;
p = a[0];
printf( "%d", p[0]);
return 0;
}
15.笔试题 代码如下(示例):
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;
}
FFFFFFFC,-46.笔试题 代码如下(示例):
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;
}
10 57.笔试题 代码如下(示例):
#include
int main()
{char *a[] = {
"work","at","alibaba"};
char**pa = a;
pa++;
printf("%s\n", *pa);
return 0;
}
at8.笔试题 代码如下(示例):
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;
}
POINT ER ST EW三、qsort函数 上一篇文章我们对回调函数有了大致的了解,
今天我们就用qsort函数的实现来温习一下回调函数应用和更好的理解和运用指针!!!
1.qsort函数的基本使用
void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );代码如下(示例):
base:需要排序的地址 num:元素个数 width:元素的大小(单位字节)compare:比较的内容
说明:size_t 是c语言库函数中 unsigned int 的定义
#include
//qosrt函数的使用者得实现一个比较函数
int int_cmp(const void * p1, const void * p2) {return (*( int *)p1 - *(int *) p2);
}
int main()
{int arr[] = {
1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
int i = 0;
qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof (int), int_cmp);
for (i = 0;
i< sizeof(arr) / sizeof(arr[0]);
i++)
{printf( "%d ", arr[i]);
}
printf("\n");
2.qsort函数模拟实现(冒泡排序版) 代码如下(示例):
int cmp_int(const void* e1, const void*e2)
{ return *(int*)e1 - *(int*)e2;
}void print_arr(int arr[], int sz)
{ int i = 0;
for (i = 0;
i < sz;
i++)
{printf("%d ", arr[i]);
}
}
void Swap(char* buf1, char* buf2, int width)
{ int i = 0;
for (i = 0;
i < width;
i++)
{char tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
//使用回调函数实现一个通用的冒泡排序函数void BubbleSort(void* base, size_t num, size_t width, int (*cmp)(const void*, const void*))
{ size_t i = 0;
//趟数
for (i = 0;
i < num - 1;
i++)
{//比较的对数
size_t j = 0;
for (j = 0;
j < num - 1 - i;
j++)
{//base[j] ==> *(base+j)
if (cmp((char*)base+j*width, (char*)base+(j+1)*width)>0)
{//交换
Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
}
}
}
}//测试自定义的BubbleSort();
void test()
{ int arr[] = {
9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
BubbleSort(arr, sz, sizeof(arr[0]), cmp_int);
//打印
print_arr(arr, sz);
}
int main()
{test();
return 0;
}
总结
希望本篇文章能给各位带来帮助,如有不足还请指正!!!
码字不易,各位大大给个收藏点赞吧!!!
文章图片
推荐阅读
- 急于表达——往往欲速则不达
- 第三节|第三节 快乐和幸福(12)
- EffectiveObjective-C2.0|EffectiveObjective-C2.0 笔记 - 第二部分
- 20170612时间和注意力开销记录
- 2.6|2.6 Photoshop操作步骤的撤消和重做 [Ps教程]
- 对称加密和非对称加密的区别
- 眼光要放高远
- 樱花雨
- 前任
- 2020-04-07vue中Axios的封装和API接口的管理