笔记|指针和数组笔试题详解

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

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

笔记|指针和数组笔试题详解
文章图片

    推荐阅读