1. 重新认识数组
有关数组名的理解
一般来讲,数组名代表首元素地址,但是有下列两个情况除外
• sizeof(数组名),sizeof中单独放数组名,这里的数组名表示整个数组,计算的是整个数组的大小, 单位是字节
• &数组名,这里的数组名表示整个数组,取出的是整个数组的地址(整个数组的地址和数组首元素 的地址是有区别的)
因为数组名一般是首元素地址,而指针也是地址,所以可以得出结论数组名就是一个指针
2. 指针与数组的关系
因为指针等于数组名
所以可以这么认为
int arr[i];<==>*(arr+i)
3. 传值与传址
3.1 传值
int add(int m, int n)
{
return m + n;
}
int main()
{
int x = 0;
int y = 0;
scanf("%d %d", &x, &y);
int ret=add(x, y);
printf("%d", ret);
return 0;
}
3.2 传址
void Swap2(int* pa, int* pb)//使用指针变量作为形参接受a,b的地址
{
int z = 0;
z = *pa; //*pa,*pb都是一个数字罢了
*pa = *pb;
*pb = z;
}int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
printf("交换前:a=%d b=%d\n", a, b);
Swap2(&a, &b); //从这里开始传a和b的地址printf("交换后:a=%d b=%d\n", a, b);
return 0;
}
4. 一维数组传参的本质
结论:本质上数组传参本质上传递的是数组首元素的地址。
void test(int arr[])//1.参数写成数组形式,本质上还是指针
{
printf("%d\n", sizeof(arr));
}=====================================================================
void test(int* arr)//2.参数写成指针形式
{
printf("%d\n", sizeof(arr));
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
test(arr);
return 0;
}