定义 | 类型 | 占字节数 |
---|---|---|
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)
数组中对应元素的值 和 数组中对应元素地址的解引用
二者的值相同
对数组填充数据,填充随机数:
随机数的生成:
使用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的随机数
RandArr3函数: 对arr数组填充10个4-16的随机数
PrintArr函数: 打印出arr数组地址下的10个数值
在长度为n的arr数组找到所有a,并全部换成b:
(多种方法,不断优化)
#include <stdio.h>
#include <stdbool.h>
//找arr中有没有a,有返回1,没有返回0
bool FindArr(int* arr