1. 指针变量做函数形参

1.1指针变量做一维数组形参

首先先了解如何定义一个一维数组指针

int arr[5] = {1, 2, 3, 4, 5};//定义一个一维数组
int *parr = arr;//指针指向数组的首地址

方式是在定义函数的时候,入参定义一个指针和数组长度

int function(int *p, int length);

当我们调用这个函数的时候,在入参时第一个参数传递一个地址(数组名即数组的首地址),即可对数组操作

现在可以用函数求一个数组的平均值

#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);
}

函数调用的时候将数组首地址传到函数,用地址对数组进行想要的求和操作,最后输出平均值

1.2 指针变量做二维数组的形参

首先先了解指针指向二维数组的定义:

int arr[3][5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};//定义一个二维数组
int (*parr)[5];//定义一个二维数组指针
parr = arr;//将二维数组指针指向二维数组的首地址

定义函数时,也可以用二维数组指针定义形参

数据类型       函数名    二维数组指针    行数        列数
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 = function();//指针函数的调用,用一个指针来接返回值printf("%s", p);return 0;
}char *function()
{
//  char str[100] = "hello world";//局部变量的地址不能返回,如果在这里定义的变量,是没有返回值的return str;//返回一个指针
}

3. 函数指针

本质是一个指针,它指向一个函数

注:函数的名字就是函数的首地址,即函数的入口地址,我们可以定义一个指针变量来存放函数的地址

定义:

int max(int a, int b)
{return a > b ? a : b;
}int min(int a, int b)
{return a < b ? a : b;
}int main()
{int a = 10;int b = 20;int (*p)(int, int)//定义一个函数指针,后面两个参数必须和调用函数严格匹配p = max;//  p指向max函数p(a, b);    //调用max函数p = min;//  p指向min函数p(a, b);//    调用min函数}

现在可以做加减乘除取余的函数,然后用函数指针去调用函数

#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;
}

Day17 指针变量做函数形参 指针函数 函数指针相关推荐

  1. 对C语言 结构指针变量做函数的参数 结构作为函数的参数

    一.结构指针变量做函数的参数 /* 用指针变量作函数参数进行传送,这时由实参传向形参的只是地址,从而减少了时间和空间的开销. */ /* 计算一组学生的平均成绩和不及格的人数,用结构指针变量作函数参数 ...

  2. 【C 语言】字符串模型 ( 字符串翻转模型 | 抽象成业务函数 | 形参返回值 | 函数返回值 | 函数形参处理 | 形参指针判空 )

    文章目录 一.字符串翻转模型 业务函数 二.完整代码示例 一.字符串翻转模型 业务函数 将上一篇博客 [C 语言]字符串模型 ( 字符串翻转模型 ) 的代码 , 主要业务逻辑 , 抽象成函数 ; 字符 ...

  3. C语言学习之通过指针变量调用它所指向的函数

    通过指针变量调用它所指向的函数 int main(){int max(int,int);//函数声明int (*p)(int,int);//定义指向函数的指针变量pint a,b,c;p=max;// ...

  4. 智能指针变量做函数参数的一个值得注意的地方

    作者:朱金灿 来源:http://blog.csdn.net/clever101 先考考大家,下面一段程序,会有什么问题: #include <iostream> #include < ...

  5. c语言用指针变量输入数组的长度,C语言之数组的基础练习题(指针变量做函数参数)...

    1.交换两个变量的值: #include void swap(int *a,int *b) { int tmp; tmp=*a; *a=*b; *b=tmp; } void main() { int ...

  6. 【C 语言】字符串模型 ( 两头堵模型 | 将 两头堵模型 抽象成业务模块函数 | 形参返回值 | 函数返回值 | 形参指针判空 | 形参返回值操作 )

    文章目录 一.将 两头堵模型 抽象成业务模块函数 二.完整代码示例 一.将 两头堵模型 抽象成业务模块函数 将 两头堵模型 抽象成业务模块函数 相关要点 : 形参返回值 : 函数的返回值 , 一般使用 ...

  7. Android JNI编程(三)——C语言指针的初步认识、指针变量、互换两个数、函数返回多个值...

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一.什么是指针? 简单来说: 指针就是内存地址      内存地址就是指针. ...

  8. 函数形参传递概念及问题分析

    普通函数参数 下面程序试图改变main函数中a和b的值 #include<stdio.h> void fun(int x,int y) { int c; c=a; a=b; b=c; } ...

  9. c语言中函数形参值改变了,相应的实参值是否改变,C语言中,如何利用函数和指针变量通过形参变量的值改变实参变量的值...

    必备知识:c语言中的函数调用和指针变量的相关知识 众所周知,函数是C语言中一个十分重要的模块,因为函数的存在,使得C语言的可读性.可维护性.可移植性大大提高.因此,想要学好C语言,必须要学好函数.函数 ...

最新文章

  1. 王者传奇服务器维护一般多长时间,9377王者传奇合理分配刷图时间其实很重要...
  2. 图像处理——傅里叶变换
  3. 知识点:Mysql 数据库索引优化实战(4)
  4. Android 用MediaCodec ,MediaExtractor解码播放MP4文件
  5. 【转】Java 杂谈(三)
  6. LINUX获得线程号、设置线程名
  7. ansys 命令流基础—— 点线面体基本操作
  8. 使用Jade和Grunt加快HTML的产生
  9. 使用js计算字符串的长度
  10. 【Python_NLP】gensim与DTM
  11. Nginx: 104: Connection reset by peer 错误
  12. 网页打开慢升级服务器宽带,网速快打开网页慢怎么办_网络测速很快但是上网很慢如何解决-win7之家...
  13. error CS0227: Unsafe code may only appear if compiling
  14. Unity游戏安卓和苹果游戏中植入广告增加收入
  15. 树莓派空气质量检测仪-攀藤G5003ST的连接与使用
  16. obs 推流编码在哪设置_浮动课堂 | 讲讲OBS直播软件的简单设置
  17. 服务器r720按f几重装系统,联想拯救者r720按哪个键进入bios设置
  18. VS中开发Qt程序,控制台不弹出
  19. json后台的一些处理方式
  20. sql注入基础原理(SQL injection)

热门文章

  1. /storage/emulated/0/Download/copy_download.db (Permission denied)错误的处理方法
  2. windows 7使用anaconda安装适用于python 3.6的TensorFlow
  3. 【原理+源码详细解读】从Transformer到ViT
  4. Efficient Contrast Enhancement Using AdaptiveGamma Correction With Weighting Distribution
  5. linux中的link
  6. win10 完全卸载 小黑笔记本
  7. EO-88遥测信号接收教程
  8. noiLinux中编程工具的使用
  9. 基于python中cv2库的图像分割
  10. 使用R进行倾向得分匹配(PSM)