Day17 指针变量做函数形参 指针函数 函数指针
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 指针变量做函数形参 指针函数 函数指针相关推荐
- 对C语言 结构指针变量做函数的参数 结构作为函数的参数
一.结构指针变量做函数的参数 /* 用指针变量作函数参数进行传送,这时由实参传向形参的只是地址,从而减少了时间和空间的开销. */ /* 计算一组学生的平均成绩和不及格的人数,用结构指针变量作函数参数 ...
- 【C 语言】字符串模型 ( 字符串翻转模型 | 抽象成业务函数 | 形参返回值 | 函数返回值 | 函数形参处理 | 形参指针判空 )
文章目录 一.字符串翻转模型 业务函数 二.完整代码示例 一.字符串翻转模型 业务函数 将上一篇博客 [C 语言]字符串模型 ( 字符串翻转模型 ) 的代码 , 主要业务逻辑 , 抽象成函数 ; 字符 ...
- C语言学习之通过指针变量调用它所指向的函数
通过指针变量调用它所指向的函数 int main(){int max(int,int);//函数声明int (*p)(int,int);//定义指向函数的指针变量pint a,b,c;p=max;// ...
- 智能指针变量做函数参数的一个值得注意的地方
作者:朱金灿 来源:http://blog.csdn.net/clever101 先考考大家,下面一段程序,会有什么问题: #include <iostream> #include < ...
- c语言用指针变量输入数组的长度,C语言之数组的基础练习题(指针变量做函数参数)...
1.交换两个变量的值: #include void swap(int *a,int *b) { int tmp; tmp=*a; *a=*b; *b=tmp; } void main() { int ...
- 【C 语言】字符串模型 ( 两头堵模型 | 将 两头堵模型 抽象成业务模块函数 | 形参返回值 | 函数返回值 | 形参指针判空 | 形参返回值操作 )
文章目录 一.将 两头堵模型 抽象成业务模块函数 二.完整代码示例 一.将 两头堵模型 抽象成业务模块函数 将 两头堵模型 抽象成业务模块函数 相关要点 : 形参返回值 : 函数的返回值 , 一般使用 ...
- Android JNI编程(三)——C语言指针的初步认识、指针变量、互换两个数、函数返回多个值...
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一.什么是指针? 简单来说: 指针就是内存地址 内存地址就是指针. ...
- 函数形参传递概念及问题分析
普通函数参数 下面程序试图改变main函数中a和b的值 #include<stdio.h> void fun(int x,int y) { int c; c=a; a=b; b=c; } ...
- c语言中函数形参值改变了,相应的实参值是否改变,C语言中,如何利用函数和指针变量通过形参变量的值改变实参变量的值...
必备知识:c语言中的函数调用和指针变量的相关知识 众所周知,函数是C语言中一个十分重要的模块,因为函数的存在,使得C语言的可读性.可维护性.可移植性大大提高.因此,想要学好C语言,必须要学好函数.函数 ...
最新文章
- 王者传奇服务器维护一般多长时间,9377王者传奇合理分配刷图时间其实很重要...
- 图像处理——傅里叶变换
- 知识点:Mysql 数据库索引优化实战(4)
- Android 用MediaCodec ,MediaExtractor解码播放MP4文件
- 【转】Java 杂谈(三)
- LINUX获得线程号、设置线程名
- ansys 命令流基础—— 点线面体基本操作
- 使用Jade和Grunt加快HTML的产生
- 使用js计算字符串的长度
- 【Python_NLP】gensim与DTM
- Nginx: 104: Connection reset by peer 错误
- 网页打开慢升级服务器宽带,网速快打开网页慢怎么办_网络测速很快但是上网很慢如何解决-win7之家...
- error CS0227: Unsafe code may only appear if compiling
- Unity游戏安卓和苹果游戏中植入广告增加收入
- 树莓派空气质量检测仪-攀藤G5003ST的连接与使用
- obs 推流编码在哪设置_浮动课堂 | 讲讲OBS直播软件的简单设置
- 服务器r720按f几重装系统,联想拯救者r720按哪个键进入bios设置
- VS中开发Qt程序,控制台不弹出
- json后台的一些处理方式
- sql注入基础原理(SQL injection)
热门文章
- /storage/emulated/0/Download/copy_download.db (Permission denied)错误的处理方法
- windows 7使用anaconda安装适用于python 3.6的TensorFlow
- 【原理+源码详细解读】从Transformer到ViT
- Efficient Contrast Enhancement Using AdaptiveGamma Correction With Weighting Distribution
- linux中的link
- win10 完全卸载 小黑笔记本
- EO-88遥测信号接收教程
- noiLinux中编程工具的使用
- 基于python中cv2库的图像分割
- 使用R进行倾向得分匹配(PSM)