一、字符指针变量
我们知道字符指针char*,一般形式:
int main()
{
char ch='a';
char*pc=&ch;
*pc='b';
return 0;
}
还有一种:
int main()
{
const char*pstr="hello world";
printf("%s\n",pstr);
return 0;
}
这里不是把hello world存放在字符指针中,而是把hello world的首地址存放在pstr中。
请看下面的代码:
#include<stdio.h>
int main()
{
char str1[]="hello world";
char str2[]="hello world";
const char*str3="hello world";
const char*str4="hello world";
if(str1==str2)
printf("str1 and str2 are same\n");
else
printf("str1 and str2 are not same\n");
if(str3==str4)
printf("str3 and str4 are same\n");
else
printf("str3 and str4 are not same\n");
return 0;
}
结果是:
这里的str3与str4指向的是同一个内容, 但都存放首元素的地址,指向同一个地方,而str1与str2分别开辟出不同的内存块。
二、数组指针
1、数组指针初始化
之前我们学了指针数组,指针数组是一种数组,数组存放的是指针。
所以数组指针是一种指针。
int*p1[10];
int (*p2)[10];
第一个是指针数组,第二个数组指针。
注意:[]的优先级高于*号,所以加上()保证p与*先结合。
那么如何初始化?
int main()
{
int a[10];
int (*pa)[10]=&a;
return 0;
}
int (*pa)[10]=&a;
| | |
| | |
| | pa指向数组的元素的个数
| pa是数组指针的变量名
pa指向的数组的元素的类型
2、二维数组传参的本质
在以前我们对二维数组传参,是这样写的:
void Func(int arr[3][4],int n)
{
;
}
二维数组其实可以看做每个元素是一维数组的数组,也就是二维数组每个元素是一维数组。那么二维数组的首元素是一维数组。根据数组指针,二维数组的首元素的类型就是int [4],其数组指针类型就是int(*p)[4]。意味着二维数组传参本质上是传递了地址,传递的是第一行一维数组的地址。那么上面可以改写成:
void Func(int (*p)[4],int n)
三、函数指针变量
什么是函数指针变量?
根据前面所学的字符指针,整型指针,数组指针。函数指针变量是来存放函数的地址。
int main()
{
test();
printf("%p\n",test);
printf("%p\n",&test);
return 0;
}
结果是一样的, 所以函数是有地址的,函数名就是函数的地址,当然也可以用&函数名的方式取出函数的地址。如果我们要存函数的地址就要创建函数指针变量,函数指针变量的写法与数组指针的形式类似。如下:
void test()
{
printf("hh");
}
void (*p1)()=test;
void (*p2)()=&test;
int Add(int x,int y)
{
return x+y;
}
int(*p3)(int,int)=Add;
int (*p4)(int x,int y)=&Add;//x与y可以省略
函数指针类型解析:
int (*p3) (int x,int y)
| | |
| | |
| | p3指向函数的参数类型与个数
| 函数指针变量
p3指向函数返回的类型
函数指针的使用:
#include<stdio.h>
int Add(int x,int y)
{
return x+y;
}
int main()
{
int(*p)(int,int)=Add;
printf("%d\n",(*p)(2,5));
printf("%d\n",p(5,5));
return 0;
}
四、typedef关键字
typedef是用来类型重命名的,使复杂的类型变得简单。
比如:
unsigned int写起来不方便,所以:
typedef unsigned int unit;
如果是指针类型:
typedef int* ptr_t;
typedef int(*parr_t)[5];//新的类型必须放在*右边
typedef int(*pfun_t)(int);
五、函数指针数组
我们已经学习了数组指针,那么把函数指针存放在数组中叫函数指针数组,那么函数指针数组怎么定义?
int (*pf[5])();
函数指针数组的应用------转移表
#include<stdio.h>
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a * b;
}
int div(int a, int b)
{
return a / b;
}
int main()
{
int x, y;
int input = 1;
int ret = 0;
do
{
printf("***** 1.add ******\n");
printf("***** 2.sub ******\n");
printf("***** 3.mul ******\n");
printf("***** 4.div ******\n");
printf("***** 0.exit ******\n");
scanf("%d",&input);
switch (input)
{
case 1:
printf("请输入操作数:");
scanf("%d %d", &x, &y);
ret = add(x, y);
printf("%d\n", ret);
break;
case 2:
printf("请输入操作数:");
scanf("%d %d", &x, &y);
ret = sub(x, y);
printf("%d\n", ret);
break;
case 3:
printf("请输入操作数:");
scanf("%d %d", &x, &y);
ret = mul(x, y);
printf("%d\n", ret);
break;
case 4:
printf("请输入操作数:");
scanf("%d %d", &x, &y);
ret = div(x, y);
printf("%d\n", ret);
break;
case 0:
printf("退出程序\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
这是用函数来写的,下面是用函数指针数组来写的。
#include<stdio.h>
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a * b;
}
int div(int a, int b)
{
return a / b;
}
int main()
{
int input = 1;
int x, y;
int(*p[5])(int, int) = { 0,add,sub,mul,div };
do
{
printf("***** 1.add ******\n");
printf("***** 2.sub ******\n");
printf("***** 3.mul ******\n");
printf("***** 4.div ******\n");
printf("***** 0.exit ******\n");
scanf("%d", &input);
if (input >= 1 && input <= 4)
{
printf("请输入操作数:");
scanf("%d %d", &x, &y);
printf("%d\n", (*p[input])(x, y));
}
else if (input == 0)
printf("退出程序\n");
else
printf("输入错误,请重新输入。\n");
} while (input);
return 0;
}
今天先到这,感谢大家观看!