C语言习题~day17

简介: C语言习题

1.下面代码关于数组名描述不正确的是( )

int main()
{
  int arr[10] = {0};
  return 0;
}

A.数组名arr和&arr是一样的


B.sizeof(arr),arr表示整个数组


C.&arr,arr表示整个数组


D.除了sizeof(arr)和&arr中的数组名,其他地方出现的数组名arr,都是数组首元素的地址。


A选项错误明显。arr的类型是int [10],而&arr的类型是int (*)[10],根本不是一个类型,不可能是一样的。而在 sizeof(arr)和&arr中,arr都是看成整体的,而一般它代表一个数组的首地址。

2.下面哪个代码是错误的?( )

#include <stdio.h>
int main()
{
  int *p = NULL;
  int arr[10] = {0};
  return 0;
}

A.p = arr;


B.int (*ptr)[10] = &arr;


C.p = &arr[0];


D.p = &arr;


就数据类型来看,A左右两边都是int *,B左右两边都是 int (*)[10],C左右两边都是int *,D左边是 int *,右边是 int (*)[10],故选D。

3.关于二级指针描述描述正确的是:( )

A.二级指针也是指针,只不过比一级指针更大


B.二级指针也是指针,是用来保存一级指针的地址


C.二级指针是用来存放数组的地址


D.二级指针的大小是4个字节


答案解析:


A:错误,二级指针是指针,不能说起比一级指针大,只能说二级指针指向的空间中存储的也是一个地址


B:正确


C:错误,数组的地址一般用一级指针存储,或者用数组指针接收


D:二级指针是指针,但是否占4个字节不一定,要看具体的系统


因此:选择B

4.如何定义一个int类型的指针数组,数组元素个数为10个:( )

A.int a[10]

B.int (*a)[10]

C.int *a[10];

D.int (*a[10])(int);

题目要int的指针数组,A为int数组,B为int数组的指针,C为int的指针数组,D为int(*)(int)函数指针的数组,故选C

5.下面哪个是指针数组:( )

A. int* arr[10];


B.int * arr[];


C.int **arr;


D.int (*arr)[10];


答案解析:


指针数组是一个数组,该数组的每个元素是一个指针


A:正确,定义了一个数组,该数组中有10个元素,每个元素都是int*的指针类型


B:错误,编译失败,定义数组时,要给出空间的大小,如果没有给时,必须要给出初始化结果


C:错误,定义了一个二级指针


D:错误,*和arr先结合,说明arr不是数组。实际上arr是一个指针,一个指向数组的指针。


因此:选择A

6.下面关于"指针"的描述不正确的是:( )

A.当使用free释放掉一个指针内容后,指针变量的值被置为NULL


B.32位系统下任何类型指针的长度都是4个字节


C.指针的数据类型声明的是指针实际指向内容的数据类型


D.野指针是指向未分配或者已经释放的内存地址


A选项目前还没学,目前只需要了解free不会更改指针的指向。


B选项强调了32位系统,所以没问题。


CD选项是定义本身。


所以排除法也可以确定是A。

7.关于下面代码描述正确的是:( )   char* p = "hello bit";

A.把字符串hello bit存放在p变量中


B.把字符串hello bit的第一个字符存放在p变量中


C.把字符串hello bit的第一个字符的地址存放在p变量中


D.*p等价于hello bit


双引号引起来的这一段是一个常量字符串,本质是一个常量字符数组类型,赋给一个指针,相当于把一个数组的首地址赋给指针,即第一个元素h的地址。


只有选项C提到了第一个字符的地址,故选C

8.下面代码的执行结果是( )

#include <stdio.h>
int main()
{
  char str1[] = "hello bit.";
  char str2[] = "hello bit.";
  char *str3 = "hello bit.";
  char *str4 = "hello bit.";
  if(str1 == str2)
    printf("str1 and str2 are same\n");
  else
    printf("str1 and str2 are not same\n");
 
  if(str3 == str4)
    printf("str3 and str4 are same\n");
  else
    printf("str3 and str4 are not same\n");
 
  return 0; 
}

A.str1 and str2 are same str3 and str4 are same


B.str1 and str2 are same str3 and str4 are not same


C.str1 and str2 are not same str3 and str4 are same


D.str1 and str2 are not same str3 and str4 are not same


str1和str2是两个数组,数组的操作方式是将右边常量字符串的内容拷贝进来,所以他们是两个空间,只是内容相同,所以str1 != str2。而str3和str4是两个指针,编译器在处理的时候,会将相同的常量字符串做成同一个地址,所以,str3和str4指向的是同一个常量字符串,所以str3 == str4,故选C。


目录
相关文章
TU^
|
6月前
|
存储 C语言
C语言习题~day35
C语言习题~day35
TU^
31 1
|
4月前
|
机器学习/深度学习 C语言
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
要保持最小的步数,每一次汉诺塔问题(无论是最初还是递归过程中的),如果此时初始柱盘子数为偶数,我们第一步是把最上面的盘子移动到中转柱,如果为奇数,我们第一步则是将其移动到目标柱。
96 0
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
TU^
|
6月前
|
编译器 C语言
C语言习题~day31
C语言习题~day31
TU^
24 2
TU^
|
6月前
|
算法 程序员 C语言
C语言习题~day36
C语言习题~day36
TU^
43 1
TU^
|
6月前
|
存储 C语言
C语言习题~day34
C语言习题~day34
TU^
35 1
TU^
|
6月前
|
算法 C语言
C语言习题~day33
C语言习题~day33
TU^
31 1
TU^
|
6月前
|
C语言
C语言习题~day32
C语言习题~day32
TU^
19 1
TU^
|
6月前
|
C语言
C语言习题~day30
C语言习题~day30
TU^
24 1
TU^
|
6月前
|
自然语言处理 C语言 C++
C语言习题~day29
C语言习题~day29
TU^
25 1
TU^
|
6月前
|
存储 C语言
C语言习题~day28
C语言习题~day28
TU^
22 1