C语言,指针修饰数组,函数
1. 指针修饰数组
1. 指针数组
- 语法: 数据类型 *数组名[个数];
int *p1[3];//指针数组,是数组,运算符“[]”的优先级要高于“*”。如p1[3]={0x00, 0x01,0x02};
-
结论:
指针数组是一个数组,每个数组元素存放一个指针变量。 -
例子1:
//指针数组案例1
#include <stdio.h>
int main(void)
{
int a = 1, b = 2, c = 3;
int *p1[3] = {&a, &b, &c};
int len = sizeof(p1) / sizeof(p1[1]);
for (i = 0; i < len; ++i)
{
printf("%d\n", *p1[i]);
}
system("pause");
return 0;
}
结果:
- 例子2:
对字符串数组更有用
#include <stdio.h>
int main(void)
{
char *p1[3] = {"you","love","me"};
int i;
int len = sizeof(p1) / sizeof(p1[1]);
for (i = 0; i < len; ++i)
{
printf("%s\n", p1[i]);
}
system("pause");
return 0;
}
结果:
2. 数组指针
- 语法:
数据类型 (*数组名)[个数];
int (*p2)[5];//数组指针,指向数组的指针,是一个数组类型(数据类型)的指针。
-
结论:
数组指针是一个指针,它指向的是一个数组 -
例1:
普通指针
数组temp可以表示数组名,数组地址,数组第一个元素的地址。
//数组指针案例1
#include <stdio.h>
int main(void)
{
int temp[3] = {1, 2, 3};
int *p1 = temp;//int类型,指向变量的指针,指向数组第一个元素的首地址(int *p1 = &temp[1];)
int i;
int len = sizeof(temp) / sizeof(temp[1]);
for (i = 0; i < len; ++i)
{
printf("%d\n",*(p1 + i));
}
system("pause");
return 0;
}
结果:
- 例2:
数组指针
//指针数组案例2
#include <stdio.h>
int main(void)
{
int temp[3] = {1, 2, 3};
int (*p2)[3] = &temp;//数组指针,将整个数组看成一个整体,取它的地址:&temp
int i;
int len = sizeof(temp) / sizeof(temp[1]);
for (i = 0; i < len; ++i)
{
printf("%d\n",*(*p2 + i));//先解引用得到数组第一个元素的地址(*p2),然后移动指针(*p2 + i),最后解引用得到数组的值。
}
system("pause");
return 0;
}
结果:
原理图:
2. 指针修饰函数
1. 指针函数
- 定义:
使用指针变量作为函数的返回值,就是指针函数。 - 语法:
int *p();
//指针函数案例
#include <stdio.h>
//字符型指针函数
char *getWord(char c)
{
switch(c)
{
case 'A': return "Apple";
case 'B': return "banana";
default: return "none";
}
}
int main(void)
{
char input;
scanf_s("%c",&input, 2);
printf("%s\n", getWord(input));
system("pause");
return 0;
}
结果:
- 注意:
注意不要返回局部变量的指针。
2. 函数指针
- 语法:
int (*p)();
用于调用函数。
例1:
//函数指针案例
#include <stdio.h>
int square(int num) {
return num * num;
}
int main(void)
{
int num;
scanf_s("%d", &num, 1);
int (*fp)(int);
fp = □//指向函数
printf("%d * %d = %d\n", num, num, (*fp)(num));
system("pause");
return 0;
}
结果:
- 函数指针作为参数
//函数指针作为参数案例
#include <stdio.h>
int add(int, int);//加法
int sub(int, int);//减法
int calc(int (*fp)(int, int), int, int);//函数指针做参数
int add(int num1, int num2)
{
return num1 + num2;
}
int sub(int num1, int num2)
{
return num1 - num2;
}
int calc(int (*fp)(int, int), int num1, int num2)
{
return (*fp)(num1, num2);
}
int main()
{
int num1, num2;
scanf_s("%d%d",&num1, &num2, 2);
printf("%d + %d = %d\n", num1, num2, calc(&add, num1, num2));//注意传入函数的地址,函数名add也可表示函数地址:calc(add,num1, num2)
printf("%d - %d = %d\n", num1, num2, calc(&sub, num1, num2));//注意传入函数的地址
system("pause");
return 0;
}
结果:
- 函数指针作为返回值
//函数指针作为参数案例
#include <stdio.h>
int add(int, int);//加法
int sub(int, int);//减法
int calc(int (*fp)(int, int), int, int);//函数指针做参数
int (*select(char))(int, int);//相当于(*)(int, int), select返回int类型并带有两个参数的指针
int add(int num1, int num2)
{
return num1 + num2;
}
int sub(int num1, int num2)
{
return num1 - num2;
}
//函数指针做形参
int calc(int (*fp)(int, int), int num1, int num2)
{
return (*fp)(num1, num2);
}
//函数指针做返回参数——选择运算符
int (*select(char op))(int, int)
{
switch(op)
{
case '+': return add;
case '-': return sub;
}
}
int main()
{
int num1, num2;
char op;
int (*fp)(int, int);
printf("请输入一个式子(如1+3)");
scanf_s("%d", &num1, 1);
scanf_s("%c", &op, 1);
scanf_s("%d", &num2, 1);
fp = select(op);
printf("%d %c %d = %d\n", num1, op, num2, calc(fp, num1, num2));//
system("pause");
return 0;
}
结果: