C语言初阶——4.扩展:数组
1. 返回值含义
返回值有时存在两种情况:合法值和非法值。
如果有非法值的情况,通常使用一些特定的值指代特殊情况。例如:数组下标只能是0和正数。我们实现数组查找元素下标时,存在找不到元素的情况,这时,使用-1
可以作为这种情况的返回值。
返回值的含义以及值是人为定义的。
2. 二维数组指针用法
- 一维数组指针用法
No. | 操作 | 下标 | 指针 |
---|---|---|---|
1 | 第i 个元素值 |
arr[i] |
*(arr+i) |
2 | 第i 个元素地址 |
&arr[i] |
arr+i |
- 二维数组指针用法
No. | 操作 | 下标 | 指针 |
---|---|---|---|
1 | 第i 行第j 列元素值 |
arr[i][j] |
*(*(arr+i)+j) |
2 | 第i 行第j 列元素地址 |
&arr[i][j] |
*(arr+i)+j |
在二维数组中
a[i]
就是一个一维数组。
- 问题
-
二维数组数组名是第一个元素的首地址吗?
-
试一下下面的代码
#include <stdio.h>
int main () {
int days[4][3]={31,28,31,30,31,30,31,31,30,31,30,31};
printf("days[0]\t\t = %p\n&days[0][0]\t = %p\n",days[0],&days[0][0]);
printf("days[1]\t\t = %p\n&days[1][0]\t = %p\n",days[1],&days[1][0]);
printf("days[2]\t\t = %p\n&days[2][0]\t = %p\n",days[2],&days[2][0]);
printf("days[3]\t\t = %p\n&days[3][0]\t = %p\n",days[3],&days[3][0]);
return 0;
}
二维数组中的一维元素是数组指针。
int days[4][3]={31,28,31,30,31,30,31,31,30,31,30,31};
int* p = days[0];
for(int i=0;i<3;++i){
printf("%d ",p[i]);
}
3. 一维数组多维使用方式
3.1 一维数组转二维数组
int n = 24;
int arr[n];
for(int i=0;i<n;++i){
arr[i] = i;
}
for(int i=0;i<n;++i){
printf("%d ",arr[i]);
}
printf("\n");
3.2 一维数组转二维数组
一维数组使用二维数组访问方式(二重循环),可看作盒子按照行列方式摆放。
元素下标 = 当前行序号*列元素个数 + 当前列序号
int n = 24;
int arr[n];
for(int i=0;i<n;++i){
arr[i] = i;
}
int rows = 4;
int cols = 6;
for(int i=0;i<rows;++i){
for(int j=0;j<cols;++j){
printf("%d ",arr[i*cols+j]);
}
printf("\n");
}
3.3 一维数组转三维数组
一维数组使用三维数组访问方式(三重循环),可看作盒子按照行列高方式摆放。
元素下标 = 当前面序号 * 面元素个数 + 当前行序号 * 列元素个数 + 当前列序号
int n = 24;
int arr[n];
for(int i=0;i<n;++i){
arr[i] = i;
}
int pages = 2;
int rows = 4;
int cols = 3;
for(i=0;i<pages;++i){
for(j=0;j<rows;++j){
for(k=0;k<cols;++k){
printf("%d ",arr[i*rows*cols+j*cols+k]);
}
printf("\n");
}
printf("\n");
}
4. 星期几的计算方式
基姆拉尔森计算公式
w=(d + 2*m + 3*(m+1)/5 + y + y/4 - y/100 + y/400) % 7
- 说明
- 公式中要把1月和2月分别当成上一年的13月和14月处理。
例如:2008年1月4日要换成 2007年13月4日带入公式。 - 公式对应的与蔡勒公式有点区别:
0
为星期1,……,6
为星期日
来源:CSDN
作者:Sunrise的博客
链接:https://blog.csdn.net/weixin_41969690/article/details/103733912