目录
1.指针变量做函数形参
2. 指针函数
3.函数指针
1.指针变量做函数形参
首先先了解如何定义一个一维数组指针
int arr[5] = {1, 2, 3, 4, 5};//定义一个一维数组 int *parr = arr;//指针指向数组的首地址
当我们调用这个函数的时候,在入参时第一个参数传递一个地址(数组名即数组的首地址),即可对数组操作
以下代码是用函数求一个数组的平均值
#include<stdio.h>
void ave_arr(int *p, int length);
int main()
{
int arr[5] = {1, 2, 3, 4, 5};
ave_arr(arr, 5);//数组名即首地址
return 0;
}
void ave_arr(int *p, int length)
{
float sum = 0;
for(int i = 0; i < length; i++)
{
sum += p[i];
}
printf("数组的平均数是:%f\n", sum / length);
}
数据类型 ? ? ? 函数名 ? ?二维数组指针 ? ?行数 ? ? ? ?列数 int? ? ? ? ? ? ? ? ?function? ??(int (*parr)[5],? ?int row,? ?int column)?
?注意:二维数组后面的[]里是列数,不能省略
以下代码是利用函数的数组指针,将二维数组赋值、输出、求平均值、求每行的总数、求每列的总数
#include<stdio.h>
void print_arr(int (*parr)[5], int row, int column);//输出函数
void scanf_arr(int (*parr)[5], int row, int column);//赋值函数
void ave_arr(int (*parr)[5], int row, int column);//求平均函数
void sum_row(int (*parr)[5], int row, int column);//每行总和函数
void sum_column(int (*parr)[5], int row, int column);//每列综合函数
int main()
{
int arr[3][5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
int (*parr)[5] = arr;
print_arr(parr, 3, 5);
// scanf_arr(parr, 3, 5);
// print_arr(parr, 3, 5);
// ave_arr(parr, 3, 5);
// sum_row(parr, 3, 5);
sum_column(parr, 3, 5);
return 0;
}
void print_arr(int (*parr)[5], int row, int column)
{
for(int i = 0; i < row; i++)
{
for(int j = 0; j < column; j++)
{
printf("%d\t", parr[i][j]);
}
printf("\n");
}
}
void scanf_arr(int (*parr)[5], int row, int column)
{
for(int i = 0; i < row; i++)
{
for(int j = 0; j < column; j++)
{
scanf("%d", &parr[i][j]);
}
}
}
void ave_arr(int (*parr)[5], int row, int column)
{
int sum = 0;
for(int i = 0; i < row; i++)
{
for(int j = 0; j < column; j++)
{
sum += parr[i][j];
}
}
printf("数组的平均值是:%d\n", sum / (row * column));
}
void sum_row(int (*parr)[5], int row, int column)
{
int sum = 0;
for(int i = 0; i < row; i++)
{
for(int j = 0; j < column; j++)
{
sum += parr[i][j];
}
printf("第%d行的总和为%d\n", i + 1, sum);
sum = 0;
}
}
void sum_column(int (*parr)[5], int row, int column)
{
int sum = 0;
for(int i = 0; i < column; i++)
{
for(int j = 0; j < row; j++)
{
sum += parr[j][i];
}
printf("第%d列的总和为%d\n", i + 1, sum);
sum = 0;
}
}
2. 指针函数
指针函数的本质是一个函数,只是他的返回值是一个指针
指针函数格式:
类型 ? ?*函数名 ? ?(形参列表) int ? ?*function() { ? ? ... ? ? return p;//p是一个指针 }
?局部变量的地址不能返回,可以设置一个全局变量来定义一个指针函数将它的地址返回
#include <stdio.h>
//1.局部变量的地址不能返回
//2.指针函数,他的返回值是指针型
char str[100] = "hello world";//全局变量
char *function();//指针函数的声明
int main()
{
char *p;
p =function();
printf("p=%s",p);
return 0;
}
char *function()
{
char str [100]="hello world";
return str;//局部变量的地址不能返回
}
3.函数指针
本质是一个指针,它指向一个函数
格式:
返回值类型 (*函数指针变量名)(形参列表)
注:函数的名字就是函数的首地址,即函数的入口地址,我们可以定义一个指针变量来存放函数的地址
以下代码是做加减乘除取余的函数,然后用函数指针去调用函数
#include<stdio.h>
int add(int a, int b);//加函数
int sub(int a, int b);//减函数
int div(int a, int b);//除函数
int mul(int a, int b);//乘函数
int remaind(int a, int b);//取余函数
int main()
{
int a = 10;
int b = 20;
int (*p)(int , int );//定义一个函数指针,声明可以省略函数列表里的形参名
p = div;//让函数指针指向除函数的首地址
printf("%d\n", p(a, b));//调用此函数
p = mul;
printf("%d\n", p(a, b));//...
p = sub;
printf("%d\n", p(a, b));//...
p = remaind;
printf("%d\n", p(a, b));//...
p = add;
printf("%d\n", p(a, b));//...
return 0;
}
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 remaind(int a, int b)
{
return a % b;
}
|