初识C语言==>数组练习题分享

学习记录DAY21

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

数组练习题


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

(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)数组中的逗号表达式

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

#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

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

逗号表达式

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

#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)数组中字符串和字符元素的区别

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实现初始化

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如下

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来完成我们的交换

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

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

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空盒子的方式一一交换每个数组对应下标的元素

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

下面这种代码是错误的

int tmp=arr1
arr1=arr2
arr2=tmp

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


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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕雪华年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值