当前位置:首页 » 《随便一记》 » 正文

指针和数组笔试题详解_wzd547191555的博客

24 人参与  2022年03月04日 10:01  分类 : 《随便一记》  评论

点击全文阅读


准备

博主:大大怪先森(记得关注哦!)
编程环境: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 4

2.二维数组

代码如下(示例):

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 erro

3.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 未知数 5

3.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 5

2.笔试题

代码如下(示例):

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 0x1000014

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

4 未知数

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

1

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

FFFFFFFC,-4

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

10 5

7.笔试题

代码如下(示例):

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

at

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

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

总结

希望本篇文章能给各位带来帮助,如有不足还请指正!!!
码字不易,各位大大给个收藏点赞吧!!!

在这里插入图片描述


点击全文阅读


本文链接:http://zhangshiyu.com/post/35727.html

笔试  数组  示例  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1