C语言习题~day21

简介: C语言习题~day21

1.关于strlen和sizeof说法错误的是?

A.strlen是库函数,求字符串长度,统计\0之前出现的字符的个数

B.sizeof是操作符,计算的数据占据内存的字节数,不在乎内存具体存储什么

C.strlen在求字符串长度时,字符串中没有\0,也没问题,能正常计算出结果。

D.strlen在求字符串长度的时候,要求字符串中必须有\0,否则可能计算出随机值

C

2.下面代码中print_arr函数参数设计哪个是正确的?( )

A.void print_arr(int arr[][],int row, int col);

B.void print_arr(int* arr, int row, int col);

C.void print_arr(int (*arr)[5], int row, int col);

D.void print_arr(int (*arr)[3], int row, int col);

二维数组相当于数组的数组,传到子函数变成数组的指针。int arr[3][5]相当于是3个元素的arr,每个元素是int [5],所以int [5]是类型说明不能省略。丢失的信息只有数组的元素个数,也就是3。A丢了类型中的5,B选项指针层级都错了,D选项5写成了3,故选C。

3.下面test函数设计正确的是:( )

char* arr[5] = {"hello", "TU"};
 
test(arr);

A.void test(char* arr);

B.void test(char** arr);

C.void test(char arr[5]);

D.void test(char* arr[5]);

指针的数组传递给子函数变为指针的指针,也就是二级指针。但是允许中括号写法,写成char **arr、char *arr[]、char * arr[5]都可。所以BD正确。

4.下面程序的结果是:( )

int main()
{
  int a[5] = {5, 4, 3, 2, 1};
  int *ptr = (int *)(&a + 1);
  printf( "%d,%d", *(a + 1), *(ptr - 1));
  return 0;
}

A.5, 1

B.4, 1

C.4, 2

D.5, 2

*(a + 1)等同于a[1],第一个是4,a的类型是int [5],&a的类型就是int(*)[5],是个数组指针。所以给int(*)[5]类型加一,相当于加了一个int [5]的长度。也就是这个指针直接跳过了a全部的元素,直接指在了刚好越界的位置上,然后转换成了int *后再减一,相当于从那个位置向前走了一个int,从刚好越觉得位置回到了1的地址处,所以第二个是1,故选B。

5.下面程序的结果是:( )

int main()
{
  int aa[2][5] = {10,9,8,7,6,5,4,3,2,1};
  int *ptr1 = (int *)(&aa + 1);
  int *ptr2 = (int *)(*(aa + 1));
  printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));
  return 0;
}

A.1, 6

B.10, 5

C.10, 1

D.1, 5

跟上题类似,&aa的类型是int (*)[2][5],加一操作会导致跳转一个int [2][5]的长度,直接跑到刚好越界的位置。减一以后回到最后一个位置1处。*(aa + 1)相当于aa[1],也就是第二行的首地址,自然是5的位置。减一以后由于多维数组空间的连续性,会回到上一行末尾的6处。故选A。

6.模仿qsort的功能实现一个通用的冒泡排序

#include<stdio.h>
 
//仿qsort函数重写冒泡排序
int cmp(void* e1, void* e2)   //所选择的比较方法
{
  return *((int*)e1) - *((int*)e2);
}
void swap(char* p1, char* p2, int width)   //实现数组元素的交换
{
  int t = 0;
  int i = 0;
  for (i = 0; i < width; i++)
  {
    t = *p1;
    *p1 = *p2;
    *p2 = t;
    p1++;
    p2++;
  }
}
void bubble_sort(void* arr, int sz, int width, int(*cmp)(void* e1, void* e2))
{
  int i = 0;
  int j = 0;
  for (i = 0; i < sz - 1; i++)
  {
    //冒泡排序趟数
    for (j = 0; j < sz - 1 - i; j++)   //每一趟冒泡排序
    {
      if (cmp((char*)arr + (j * width), (char*)arr + (j + 1) * width)>0)
      {
        //符合条件进行交换
        swap((char*)arr + (j * width), (char*)arr + (j + 1) * width,width);
      }
    }
  }
}
int main()
{
  int arr[] = { 10,9,8,7,6,5,4,3,2,1 };     //定义整型数组并初始化
  int sz = sizeof(arr) / sizeof(arr[0]);    //计算数组长度
  int i = 0;
  bubble_sort(arr, sz, sizeof(arr[0]), cmp);    //模拟qsort函数实现冒泡排序
  for (i = 0; i < sz; i++)                   
  {
    printf("%d ", arr[i]);                     //排序完后对数组进行打印,验证排序是否成功
  }
}


目录
相关文章
TU^
|
12天前
|
存储 C语言
C语言习题~day35
C语言习题~day35
TU^
11 1
TU^
|
12天前
|
编译器 C语言
C语言习题~day31
C语言习题~day31
TU^
8 2
TU^
|
12天前
|
算法 程序员 C语言
C语言习题~day36
C语言习题~day36
TU^
15 1
TU^
|
12天前
|
存储 C语言
C语言习题~day34
C语言习题~day34
TU^
9 1
TU^
|
12天前
|
算法 C语言
C语言习题~day33
C语言习题~day33
TU^
10 1
TU^
|
12天前
|
C语言
C语言习题~day32
C语言习题~day32
TU^
9 1
TU^
|
12天前
|
C语言
C语言习题~day30
C语言习题~day30
TU^
7 1
TU^
|
12天前
|
自然语言处理 C语言 C++
C语言习题~day29
C语言习题~day29
TU^
7 1
TU^
|
12天前
|
存储 C语言
C语言习题~day28
C语言习题~day28
TU^
7 1
TU^
|
12天前
|
C语言
C语言习题~day27
C语言习题~day27
TU^
9 1