【C语言】数组练习题分享
慕雪年华

好久没记录(氵)博客了,今天记录一下昨天学习的数组练习题中的内容

数组练习题

[TOC]


昨天学习的练习题挺多的,下面只记录了几个我个人认为比较重要和典型的内容

(1)错误的引用数组

题目:

1
int arr[10]={0};

下面错误的引用方式是:

A. arr[0]=1 B.arr[0]=5*2 C. arr[10]=2 D.arr[1]=arr[2]*arr[0]

arr[10]代表数组中有10个元素,但是arr[10]的引用是下标,指第11个元素

这超出了数组10个元素的范围

答案是 C


(2)数组中的逗号表达式

请问以下代码输出的结果是什么?

1
2
3
4
5
6
7
#include<stdio.h>
int main()
{
int arr[]={1,2,(3,4),5};
printf("%d\n", sizeof(arr));
return 0;
}

首先,arr数组中的每个元素都是一个整型元素,占用的字节是4个bit位

所以sizeof计算数组中的元素个数,将它们所占空间相加

  • 其中逗号表达式(3,4) —–> 只产生一个结果,4

以防万一,这里提一下逗号表达式的概念

逗号表达式

逗号表达式中的内容可以是数字,也可以是表达式

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
int main()
{
int a =3;
int b=5;
int c=0;
//逗号表达式
int d=(c=1,a=c+3,b=a-4,c+=b);
printf("%d\n",d);
return 0;
}

这个代码的结果是1

运算过程如下

  • c=1
  • a=c+3=1+3=4
  • b=a-4=4-4=0
  • c+=b —-> c=c+b=1+0=1

逗号表达式会从左到右依次计算里面的每个表达式

输出的结果是逗号表达式中最后一个表达式的结果

所以上面数组中(3,4)这个逗号表达式产生的结果是4

printf输出的结果是16(4个元素)


(3)数组中字符串和字符元素的区别

1
2
int arr1[]={"abcdef"};
int arr2[]={'a','b','c','d','e','f'};
  • 数组arr1和arr2等价 ×

一个是字符串,一个是字符元素,它们的含义是不同的

  • 数组arr1和arr2的长度相同 ×

这两个的长度实际上是不同的

因为“abcdef”这个字符串的后面,是有一个字符串结束标志\0的

  • 数组arr1的长度大于arr2的长度 √

(这里我可能有错的地方,还请dalao无情指正)


(4)自定义函数与数组的简单练习题

题目如下

创建一个整形数组,实现以下操作

1.实现函数init()初始化数组为全0

2.实现print()打印数组中的每个元素

3.实现reverse()函数完成数组元素的逆置

前两个自定义函数的实现形式非常相似

我们只需要用一个for循环,利用i依次访问数组中的每个元素,将它们打印出来或者赋值为0实现初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void print(int arr[], int sz)//打印数组中的每个元素
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
void init(int arr[], int sz)//将数组中的每个元素都初始化为0
{
int i = 0;
for (i = 0; i < sz; i++)
{
arr[i] = 0;
}
}

这里需要注意的一个点是sz(数组元素个数)我们必须在主函数main中计算,不能在自定义函数中计算

因为传过来的数组是首元素的地址,这时候用sizeof计算的数组元素长度是不准确的

主函数main如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof (arr)/sizeof( arr[0]);
printf("%d\n", sz);

print(arr, sz);
reverse(arr, sz);
print(arr, sz);

init(arr, sz);
print(arr, sz);

return 0;
}

reverse函数的基本理念和另外两个函数其实是相似的

这里我们依旧会用到“空盒子”tmp来完成我们的交换

同时我们需要使用循环来确认什么时候停止交换

即左右两个数组元素的下标一样的时候(或者值一样)就停止交换

1
2
3
4
5
6
7
8
9
10
11
12
13
void reverse(int arr[], int sz)//数组元素的逆置
{
int left = 0;
int right = sz - 1;
while(left < right)
{
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}

当我们进行两个数组之间的元素调换的时候,也需要用for循环+tmp空盒子的方式一一交换每个数组对应下标的元素

  • 前提,两个数组的元素个数相同

下面这种代码是错误的

1
2
3
int tmp=arr1
arr1=arr2
arr2=tmp

实现形式和上面打印和初始化的自定义函数的思路是一样的,这里不再赘述!


如果本博客对你有帮助,还请点赞支持一下!这是对我的最大鼓励