C语言学习4-指针
程序员文章站
2024-01-03 11:11:52
...
C语言学习4
指针
int a =10;
int *p = &a; 一级指针
int **s = &p; 二级指针
int (*p)[10]; 指向数组的指针
int *(*s)[10]; 指针指向放指针的数组 这个数组有十个空间
int *p[10]; 开辟10个空间 每个空间放指针
例如:
int *br[10];
int *(*s)[10] = &br;
int ar[10];
int (*p)[10] = &ar;
例子:
int ar[5][2] = { 1,2,3,4,5,6,7,8,9,10 };
int(*p)[2] = &ar[1];
int *s = (int*)ar[1];
printf("%d %d/n", p[1][3], s[3]);
return 0;
解题思路:
所以:
p[1][3] 可以看做*(*(p+1)+3),
s[3] 看作*(p+3)
函数指针
int main()
{
int fun(int,int);
int(*pfun)(int,int);
return 0;
}
int(*p)(int, int);
这个语句就定义了一个指向函数的指针变量 p。首先它是一个指针变量,所以要有一个“*”,即(*p);
其次前面的 int 表示这个指针变量可以指向返回值类型为 int 型的函数;后面括号中的两个 int 表示这个指针变量可以指向有两个参数且都是 int 型的函数。所以合起来这个语句的意思就是:定义了一个指针变量 p,该指针变量可以指向返回值类型为 int 型,且有两个整型参数的函数。p 的类型为 int(*)(int,int)。
函数指针的定义方式为
函数返回值类型 (* 指针变量名) (函数参数列表);
“函数返回值类型”表示该指针变量可以指向具有什么返回值类型的函数;
“函数参数列表”表示该指针变量可以指向具有什么参数列表的函数。这个参数列表中只需要写函数的参数类型即可。
需要注意的是:
1.指向函数的指针变量没有 ++ 和 – 运算。
2.也不能*引用
如何用函数指针调用函数
int Func(int x); /*声明一个函数*/
int (*p) (int x); /*定义一个函数指针*/
p = Func; /*将Func函数的首地址赋给指针变量p*/
赋值时函数 Func 不带括号,也不带参数。由于函数名 Func 代表函数的首地址,因此经过赋值以后,指针变量 p 就指向函数 Func() 代码的首地址了。
下面来写一个程序,看了这个程序你们就明白函数指针怎么使用了:
# include <stdio.h>
int Max(int, int); //函数声明
int main(void)
{
int(*p)(int, int); //定义一个函数指针
int a, b, c;
p = Max; //把函数Max赋给指针变量p, 使p指向Max函数
printf("please enter a and b:");
scanf("%d%d", &a, &b);
c = (*p)(a, b); //通过函数指针调用Max函数
printf("a = %d\nb = %d\nmax = %d\n", a, b, c);
return 0;
}
int Max(int x, int y) //定义Max函数
{
int z;
if (x > y)
{
z = x;
}
else
{
z = y;
}
return z;
}
输出结果是:
please enter a and b:3 4
a = 3
b = 4
max = 4
PS:
int(*pfun[3])(int,int); 开辟三个空间,每个空间存储一个函数指针
int(*(*p)[3])(int,int); 指针指向了存放了函数指针的数组,这个数组大小为3