前言:上篇文章我们讲了关于指针的有关知识,但那些知识还是不足以我们声称自己了解了指针,所以这次我们将继续深入学习。
这次的内容是主要是 数组和指针的 之间的连接。
目录
1.数组名的理解
数组名就是数组首元素的地址
这里的调试结果就印证了,数组名就是首元素的地址。
2.使用指针访问数组
我们一般访问数组的时候都是以 例: arr[i] 的形式来访问数组的元素
int arr[10] = { 0 };
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
但其实指针也可以用来访问数组,而指针可以访问数组的原因是在于数组在内存中连续存放的。
因此就有我们以下的代码
//使用指针访问数组
int arr[10] = { 0 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
printf("请输入数组十个元素");
for (i = 0; i < sz; i++)
{
scanf("%d ", arr+i);
//scanf("%d ", &arr[i]);
// 输入 数组形式 &arr[i] 指针形式 arr+i
}
for (i = 0; i < sz; i++)
{
printf("%d ", *(arr + i));
//printf("%d ", arr[i]);
// 输出 数组形式 arr[i] 指针形式 *(arr + i)
}
}
假设下面arr数组是int类型,那么每次加一 ,他就跳过4个字节,刚好每次可以访问下一个元素
3.一维数组传参的本质
数组传参的本质是 传入数组首元素的地址
void print(int arr[10])// 此处 int arr[10] 就等价于 int* arr
{
int sz = sizeof(arr) / sizeof(arr[0]);//按照设想此处应是10
printf("%d\n", sz);
int i = 0;
for (i = 0; i < sz; i++)
{
//printf("%d ", arr[i]);
}
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
print(arr);
}
此处形参 arr是指针变量,所以不可在函数中使用 sizeof(arr) / sizeof(arr[0]) 来求长度,因为虽然被传入的是数组的首元素地址,但接收的是指针变量。而指针变量的大小 是4/8个字节,因此我们无法得到想要的数组长度
//数组传参时,形参是可以写成数组的形式,也可以写成指针的形式
//
//数组传参的本质是 传入的数组首元素的地址
//所以形参和实参访问的是同一个数组
//
//形参的数组并不会 再单独创建一个空间,因此数组的大小可以忽略
// 所以形参中的 int arr[10] 可以写成 int arr[]
//
//ps: 地址传递的有一个问题就是
// 如果形参修改了被传入地址的内容 那么 实参中也会被改变,因为他们共享一个地址
void print(int arr[10], int sz)// 这里的 int arr[10] 实际上就等同于 int* arr
{
int i = 0;
for(i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
print(arr, sz);
}
4.二级指针
在之前的文章我们知道了,一级指针就是存放(被指定的)变量的地址。那我们是不是可以类别来考虑二级指针的作用。
二级指针是存放一级指针的地址
那么解引用pp的话 *pp 就是 p的地址 , **pp 就是 a的值。
5.指针数组
指针数组,指针数组,那它到底是指针还是数组呢?
我们还是可以举个"栗子",来理解。
整形数组 是数组 元素类型是int
字符数组 是数组 元素类型是char
那么指针数组 是数组 元素类型是指针
指针数组模拟二维数组
#include <stdio.h>
int main()
{
//模拟二维数组
int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 2,3,4,5,6 };
int arr3[] = { 3,4,5,6,7 };
int* arr[] = { arr1,arr2,arr3 };
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
printf("%d ", arr[i][j]);
//arr[i][j] 等价于 *(*(arr+i)+j)
}
printf("\n");
}
}
到此我们的第二篇关于指针的文章就到此结束了。
我是阿泽,也是小罗,更是大家的朋友。如果大家喜欢我的文章,并能帮助大家的话,我会非常开心 。
作者水平有限,所以有不足和需要改进的地方,希望大家可以多多建议。