目录
在我们学习下面的内容前,我们要先了解 * [ ] ( ) 都可以用作运算符,从而组成了指针,数组,函数。其中( ) [ ]优先级高于* .
指针数组
形式:*str[4]
含义:str是一个指针数组,包含4个元素,每个元素都是一个指针。
初始化形式:
char *str[3] = {"hello", "world", "!"};
int a=2,b=3,c=4,d=5;
int *str[4]={&a,&b,&c,&d}
上述两种形式都是可以的。其中第一种形式要注意的是检测到字符串中的 "" 标志为,自动将字符串首地址赋给指针,进行存储。而第二种形式是直接往4个数组种放地址进行初始化
#include<stdio.h>
int main()
{
int a=10;
int b=20;
int c=30;
int d=40;
int *str[4]={&a,&b,&c,&d};
for(int i=0;i<4;i++)
{
printf("%d ",*str[i]);
}
}
运行结果:
数组指针
形式(*str)[4]
含义:str是一个数组指针,指针变量str地址下有4个元素,地址要变化一个单位,相当与变化4个元素。可以等价与二维数组。
#include<stdio.h>
int getthedata(int (*p)[4],int hang,int lie)
{
int data;
data=*(*(p+hang)+lie);
return data;
}
void tipinputhanglie(int *pm,int *pn)
{
printf("请输入你要寻找的数的行和列\n");
scanf("%d%d",pm,pn);
printf("done\n");
}
int main()
{
int arr[3][4]={{11,22,33,44},{55,66,77,88},{65,45,76,87}};
int ihang,ilie;
int data;
tipinputhanglie(&ihang,&ilie);
data=getthedata(arr,ihang,ilie);
printf("%d",data);
return 0;
}
运行结果:
指针函数
形式:int *a(int x,int y)
含义:指针函数是指返回值为指针类型的函数。在函数的返回类型前面加上指针符号 *,就表示该函数返回一个指针。
//使用指针含数求出某个学生成绩
#include<stdio.h>
int *getstudent(int (*str)[4],int ihang)
{
int *p;
p=*(str+ihang-1);
return p;
}
void getinputdata(int *pm)
{
printf("请输入你需要获得第几个学生");
scanf("%d",pm);
}
int main()
{
int str[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int ihang,a=1;
int *p=&a;
getinputdata(&ihang);
p=getstudent(str,ihang);
for(int i=0;i<4;i++)
{
printf("%d ",*(p+i));
}
}
函数指针
形式:函数指针的声明方式与普通指针相同,但需要指定函数的参数类型和返回类型。
int (*funcPtr)(int a, int b);
含义:函数指针是指向函数的指针变量。它存储着函数的地址,可以让程序在运行时调用该函数。函数指针通常用于回调函数、动态链接库等高级编程技术中。
#include<stdio.h>
#include <stdlib.h>
int getmax(int a,int b)
{
return a>b ?a : b;
}
int getmin(int a,int b)
{
return a>b?b:a;
}
int getsum(int a,int b)
{
return a+b;
}
int main()
{
int a=20;
int b=30;
int cmd;
int (*p)(int ,int ); //注意p指向的函数要与他类型定义相同
printf("请输入你想要完成的功能,1为求最大值,2为求最小值,3为求和");
scanf("%d",&cmd);
switch(cmd)
{
case 1:
p=getmax;
break;
case 2:
p=getmin;
break;
case 3:
p=getsum;
break;
default:
printf("没有这个功能!");
exit(-1);
}
printf("1为求最大值,2为求最小值,3为求和,运算结果是%d",(*p)(a,b));
}