C语言指针梳理
1.指针的几种形式说明
指针是包含另一变量的地址的变量。
(1)int *p:p是一个指针,指向一个整型数。
(2)int *p():p是一个函数,该函数返回一个指向整数的指针。
(3)int (*p)():p是一个指针,该指针指向一个函数,这个函数返回一个整数。
(4)int *p[]:p是一个数组,该数组的每一个元素是指向整数的指针。
(5)int (*p)[]:p是一个指针,该指针指向一个数组,这个数组的每一个元素是一个整数。
(6)int *(*p)():p是一个指针,该指针指向一个函数,这个函数返回一个指向整数的指针。
2.指针与数组、函数的关系
(1)对于一维数组 int a[i] 或指针 int *a
a+i 指向 a[i]
(2)对于字符串 char s[i] 或指针 char *s
s+i 指向第 i个字符 s[i]
(3)对于二维数组int a[i][j]
*a+j 指向 a[0][j]
*(a+i) 指向 a[i][0]
*(a+i)+j 指向 a[i][j]
例:对于 a[2][3]={1,2,3,4,5,6,}; 有 ((a+1)+2)=6;
(4)对于字符串数组char p[i][j] 或字符型指针数组char *p[i]
*p+j 指向第 0个字符串的第 j个字符
*(p+i) 指向第 i个字符串的第 0个字符
*(p+i)+j 指向第 i个字符串的第 j个字符
例:对于 *p[]={“ABC”,“DEF”}; 有 ((p+1)+1)=‘E’;
例:对于 char p[][3]={“ABC”,“DEF”}; 有 ((p+1)+1)=‘E’;
(5)对于指针数组int *a[i]
a[i] 指向 变量i
即 *a[i]=变量i 或 a[i]=&变量i
3.用函数指针调用函数举例
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(){
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;
}
)
运行结果