学习记录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
实现形式和上面打印和初始化的自定义函数的思路是一样的,这里不再赘述!
如果本博客对你有帮助,还请点赞支持一下!
这是对我的最大鼓励