在写代码的时候,我们经常用到数组,那么有没有想过数组名是什么呢?当我们需要写一个函数需要调用数组的时候又该如何传参呢?先看一段代码:
#include<stdio.h>
void ARR(int arr[])//int 传参
{
printf("%d\n", arr[0]);//打印数组下标为‘0’的数,即第一个数
}
int main()
{
int arr[5] = { 1,2,3,4,5 };
ARR(arr);//调用函数
return 0;
}
#include<stdio.h>
void ARR(int* arr[])//int* 传参
{
printf("%d\n", arr[0]);
}
int main()
{
int arr[5] = { 1,2,3,4,5 };
ARR(arr);
return 0;
}
可见:无论是用整形传参还是用指针传参都是可以的;
为什么呢?
实际上数组名就是一个地址,那为什么int传参也可以呢,编译器这样设计是考虑到对初学者来说更容易理解;
既然数组名就是地址,那么这个地址又是谁的呢?
我们不妨试一下:
#include<stdio.h>
int main()
{
int arr[5] = { 1,2,3,4,5 };
printf("%p\n", &arr);
printf("%p\n", &arr[0]);
return 0;
}
哦?数组名原来表示的是第一个元素的地址吗
那么答案就揭晓了(真的吗?)
不妨再看看下面这段代码:
#include<stdio.h>
int main()
{
int arr[5] = { 1,2,3,4,5 };
printf("%d\n", sizeof(arr));
return 0;
}
不对啊,如果数组名是第一个元素的地址的话,那它的大小不应该是4个字节吗,这里怎么是20呢
这里的20其实是全部字符的大小
这种情况下arr就表示了数组里的每一个元素;
还有一种情况就是取地址&arr的时候,这里取的是一整个数组
因此:arr+1代表向后偏移一个元素的大小,&arr+1代表向后偏移一个数组的大小。
综上所述:
一般情况下,数组名就是第一个元素的地址,除了:
1.当用sizeof(数组名)计算数组大小计算的是全部元素
2.&arr取的也是一整个数组