一.数组指针
1.数组指针概念
指针可以存放某一元素的地址, 数组指针,指的是数组名的指针,即数组首元素地址的指针。即是指向数组的指针。
那么,当一个数组里面包含多个元素时,多个元素的地址该如何存放,下面引入数组指针的概念 数组指针,理解为放数组地址的指针,
int *p=&a; p是变量名,*p表示指针,剩下的int是指向的元素类型;
int(*p)[10]=&arr;p是变量名,*p表示指针,剩下的int[10]是指向十个int类型元素的地址;
举例利用指针打印数组
#include <stdio.h>
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int (*p)[10]=&arr;
for(int i=0;i<10;i++)
{
printf("%p\n",p);
}
}
2.对于二维数组,指针该如何书写? 前面讲述一维数组指针,
int(*p)[10]=&arr//&+数组名表示一维数组指针指向首元素地址 对于二维数组
int arr[2][3]={1,2,3,4,5,6}; //此时我们设想:&+数组名表示第一行元素地址
#include<stdio.h>
int main()
{
int arr[2][3]={1,2,3,4,5,6};
int(*p)[3]=arr;
printf("%d",(*p)[0]);
printf("%d",(*p)[1]);
printf("%d",(*p)[2]);
return 0;
}
二.二维数组的传参打印
从运行结果看出 对于二维数组:&+数组名表示第一行元素地址,使用数组指针接收 下面讨论利用指针实现一维数组,二维数组的传参打印
1.一维数组
#include<stdio.h>
void print(int*p,int x)
{
for(int i=0;i<x;i++)
{
printf("%d",*p+i);
}
}
#include<stdio.h>
int main()
{
int arr[3]={1,2,3};
print(arr,3);
}
*p表示解引用数组首元素,*p+i表示解引用数组第i个元素
2.二维数组 我们打算创建一个打印函数print2实现对二维数组打印
考虑函数参数有接收二维数组的地址(使用数组指针接收),行和列
#include<stdio.h>
void print(int(*p)[3],int x,int y)
{
for(int i=0;i<x;i++)
{
for(int j=0;j<y;j++)
{
printf("%d",p[i][j]);
}
}
}
#include<stdio.h>
int main()
{
int arr[2][3]={1,2,3,4,5,6};
print(arr,2,3);
return 0;
}
解析: 1.借助两个for循环和数组指针实现对二维数组的打印。
2.二维数组arr[2][3]传参,传过去的是带一行元素的地址,使用一维数组int(*p)[3]指针接收(也可使用二维数组接收后面会出专门文章)
三.函数指针
函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。 有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。 函数指针有两个用途:调用函数和做函数的参数。
#include<stdio.h>
int Add(int x,int y)
{
return x+y;
}
int main()
{
int a=1;
int b=2;
int (*pa)(int ,int)=Add;//函数指针
//*pa是函数名,去掉函数名后是函数参数类型,表是返回类型为int,参数类型为2个int的函数指针
int c=(*pa)(a,b);
printf("%d",c);
}