使用指针访问数组
- 数组名
数组名是数组首元素的地址,但要注意两点:
1.sizeof(数组名):这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节.
2.&数组名:这里的数组名也表示整个数组,取出的是整个数组的地址.
- 指针访问数组
在访问数组时,首先要拿到数组数组首元素的地址存到指针变量中,然后再通过指针的±来对下一个元素进行访问(注:因为数组在内存中是连续存放的,所以对指针加减一个整数即可访问下一个元素)
代码如下:
#include <stdio.h>
int main()
{
//通过指针打印一维数组
int arr[] = {1,2,3,4,5};
int *p = arr;//也可写成&arr[0]
size_t sz = sizeof(arr) / sizeof(arr[0]);
for(int i = 0,i < sz;i++)
{
printf("%d ",*(p + i));
}
return 0;
}
上面是通过指针来访问数组,我们再用下标来访问数组:
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5};
size_t sz = sizeof(arr) / sizeof(arr[0]);
for(int i = 0;i < sz;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
两个代码进行对比,我们就可以看出一维数组的本质,用下标进行对数组的访问,其实就是对指针的加减。把arr赋值给了指针变量p,再结合上述的代码,我们就可以得到一些结论:
*(p + i) == *(arr + i)== arr[i] == *(i + arr)== i[arr]
指针数组
指针数组就是用来存放指针的数组,如:
- 整型指针数组----存放整型指针的数组----int *arr[ ]
- 字符指针数组----存放字符指针的数组----char *arr[ ]
- 函数指针数组----存放函数指针的数组----函数的返回类型+(*arr[ ])+ (参数列表)
整型指针数组的运用如下:
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
int c = 30;
int *arr[3] = {&a,&b,&c};
//通过遍历数组来对abc进行访问
for(int i = 0;i < 3;i++)
{
printf("%d ",*arr[i]);
}
return 0;
}
数组指针
指向数组的指针,数组指针变量中存放的是整个数组的地址.
类型是:数组的类型+ (*)+ [数组元素的个数]
示例如下:
int arr[5] = {1,2,3,4,5};
int (*p)[5] = &arr //上面有提到(&数组名)代表整个数组的地址
char *str[3];
char*(*pf)[3] = &str;
函数指针
指向函数的指针,函数指针变量中存放的是函数的地址.
类型是:函数的返回类型 + (*)+(参数列表)
示例代码如下:
#include <stdio.h>
int Add(int a,int b)
{
return a + b;
}
int main()
{
int (*p)(int ,int) = Add//也可写成&Adda
int ret = (*p)(4,5);
//Add赋值给了指针变量p,也就相当于int ret = Add(4,5)
printf("%d\n",ret);
return 0;
}
指针的基本内容就大致梳理完了,希望大家看了我这上下篇的指针讲解能有所收获,一起来学习吧!!