1.数组名的理解
数组名代表首元素的地址
注:
sizeof(数组名)
,此处的数组名代表整个数组。计算的是整个数组的大小,单位是字节
&数组名
,取出的是整个数组的地址,此处的数组名表示整个数组
int main()
{
int arr[] = { 1,2,4,6,78,3.48 };
printf("%p\n", arr);
printf("%p\n", &arr[0]);
return 0;
}
int main()
{
int arr[] = { 1,32,3,4,5,6,7,8,9,10 };
printf("&arr[0] =%p\n", &arr[0]);
printf("&arr[0]+1=%p\n", &arr[0]+1);
printf("arr =%p\n", arr );
printf("arr + 1 =%p\n", arr + 1);
printf("&arr =%p\n", &arr);
printf("&arr + 1 =%p\n", &arr + 1);
return 0;
}
不使用指针访问数组:
int main()
{
int arr[10] = { 0 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
scanf("%d", &arr[i]);
}
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
使用指针访问数组:
int main()
{
int arr[10] = { 0 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
int* p = &arr[0];
for (i = 0; i < sz; i++)
{
scanf("%d", p+i);
}
for (i = 0; i < sz; i++)
{
printf("%d ", *(p + i));
}
return 0;
}
int main()
{
int arr[10] = { 0 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
int* p = arr;
for (i = 0; i < sz; i++)
{
scanf("%d", p++);
}
p = arr;//因为上面那个循环中 p++是自增 p指针的位置已经指向数组结尾了 而下面的循环中又要用到p指针 所以需要把p指针重新指向数组头部
for (i = 0; i < sz; i++)
{
printf("%d", *(p+i));
}
return 0;
}
本质上p[i]
是等价于 *(p+i)
,同理arr[i]
应该等价于 *(arr+i)
2. 一维数组传参
数组传参本质上传递的是数组⾸元素的地址,⼀维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式
void print1(int arr[])//也可以写成int* arr[]
{
printf("%d\n", sizeof(arr));
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
print1(arr);
return 0;
}