文章目录
1. 数组的高级定义
数组的赋值和初始化
- 数组未初始化,数组里面的值随机
- 数组初始化为 {0} ,数组里面的所有值都为 0
- 数组初始化为 {3} ,数组里面除第第一位为 3 其他都是 0
数组的大小 sizeof
定义 | 类型 | 占字节数 |
---|---|---|
char | 字符型 | 1个字节 |
int | 整型 | 4个字节 |
double | 双浮点型 | 8个字节 |
sizeof(arr)/sizeof(arr[0])
通过这种方法可以知道数组有多少个元素
感受不同数据类型所占字节大小:
#include <stdio.h>
int main(){
int arr[21] = {
3,4};
for(int i=0;i<sizeof(arr)/sizeof(arr[0]);++i){
printf("%d ",arr[i]);
}
printf("\n");
char carr[12];
int iarr[12];
double farr[12];
printf("carr = %d\n",sizeof(carr));
printf("iarr = %d\n",sizeof(iarr));
printf("farr = %d\n",sizeof(farr));
}
结果为:
3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
carr = 12
iarr = 48
farr = 96
数组的地址(重要)
数组中每个元素的首地址 %p
数组的地址就是数组第一个元素的首地址
&days[i] ====> days+i 数组名+下标 = 当前元素的地址
days[i] ====> *(days+i) 解引用(数组名+下标) = 当前元素的值
#include <stdio.h>
int main(){
int days[]={
31,28,31,30,31,30,31,31,30,31,30,31};
printf("&days=%p\n",&days);
printf("days=%p\n",days);
for(int i=0;i<12;++i){
printf("%p %p\n",&days[i],days+i);
}
for(int i=0;i<12;++i){
printf("%d %d\n",days[i],*(days+i));
}
}
结果为:
&days=0x7fff9d36c550
days=0x7fff9d36c550
0x7fff9d36c550 0x7fff9d36c550
0x7fff9d36c554 0x7fff9d36c554
0x7fff9d36c558 0x7fff9d36c558
0x7fff9d36c55c 0x7fff9d36c55c
0x7fff9d36c560 0x7fff9d36c560
0x7fff9d36c564 0x7fff9d36c564
0x7fff9d36c568 0x7fff9d36c568
0x7fff9d36c56c 0x7fff9d36c56c
0x7fff9d36c570 0x7fff9d36c570
0x7fff9d36c574 0x7fff9d36c574
0x7fff9d36c578 0x7fff9d36c578
0x7fff9d36c57c 0x7fff9d36c57c
31 31
28 28
31 31
30 30
31 31
30 30
31 31
31 31
30 30
31 31
30 30
31 31
结论:
-
&days、days、&days[0]、days+0
数组地址、数组地址、数组首地址、数组首地址
四者的地址相同 -
days[i] 和 *(days+i)
数组中对应元素的值 和 数组中对应元素地址的解引用
二者的值相同
2. 数组与函数、数组与指针
案例1:填充数据
对数组填充数据,填充随机数:
随机数的生成:
使用rand()函数产生C语言的随机数,需要加入stdlib.h和time.h在表头,用到rand(),需要给srand()函数提供一个参数
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int* FillArr(int* arr,int n){
for(int i=0;i<n;++i){
arr[i]=i;
}
return arr;
}
int* RandArr(int* arr,int n){
srand(time(NULL));
for(int i=0;i<n;++i){
arr[i]=rand();
}
return arr;
}
int* RandArr2(int* arr,int n){
srand(time(NULL));
for(int i=0;i<n;++i){
arr[i]=rand()%n;
}
return arr;
}
int* RandArr3(int* arr,int n,int a,int b){
srand(time(NULL));
for(int i=0;i<n;++i){
arr[i]=rand()%(b-a)+a;
}
return arr;
}
void PrintArr(int* arr,int n){
for(int i=0;i<n;++i){
printf("%d ",arr[i]);
}
printf("\n");
}
int main(){
int arr[10];
RandArr3(arr,10,4,17);
PrintArr(arr,10);
}
结果为:
0 1 2 3 4 5 6 7 8 9
769988010 634447882 634677093 170170961 1636749465 2009219543 2050419750 245631768 163043489 1877877574
0 2 3 1 5 3 0 8 9 4
16 7 15 16 4 10 6 9 15 5
其中:
FillArr函数: 对arr数组填充数组的元素位置
RandArr函数: 对arr数组填充10个随机数
RandArr2函数: 对arr数组填充10个0-9的随机数
R