当前位置: 首页 > news >正文

【C语言】数组参数和指针参数详解

在写代码的时候难免要把【数组】或者【指针】传给函数,那函数的参数该如何设计呢?

1 一维数组传参

#include <stdio.h>
void test(int arr[])//ok?
{}
void test(int arr[10])//ok?
{}
void test(int* arr)//ok?
{}
void test2(int* arr[20])//ok?
{}
void test2(int** arr)//ok?
{}
int main()
{int arr[10] = { 0 };int* arr2[20] = { 0 };test(arr);test2(arr2);return 0;
}

 答案:都是ok的。

arr[10]:因为传递的是数组的首元素地址,首元素是int类型,所以接收它的地址是一个 int* 类型,也可以用数组int arr[ ]来接收。

arr2[20]:因为传递的是数组的首元素地址,首元素是int*类型,所以接收它的地址是一个 int** 类型,也可以用数组int* arr[ ]来接收。

2 二维数组传参

void test(int arr[3][5])//ok?
{}
void test(int arr[][])//ok?
{}
void test(int arr[][5])//ok?
{}void test(int* arr)//ok?
{}
void test(int* arr[5])//ok?
{}
void test(int(*arr)[5])//ok?
{}
void test(int** arr)//ok?
{}
int main()
{int arr[3][5] = { 0 };test(arr);
}

答案:

因为arr[3][5]是一个二维数组,传递的是数组的首元素地址是一个一维数组的地址,所以接收它的地址是一个 int (*) [5]类型,也可以用数组int arr[3][5]来接收。

总结:二维数组传参,函数形参的设计只能省略第一个[ ]的数字。
因为对一个二维数组,可以不知道有多少行,但是必须知道一行多少元素。
这样才方便运算。

3 一级指针传参

#include <stdio.h>void print(int *p, int sz){int i = 0;for(i=0; i<sz; i++){printf("%d\n", *(p+i));}}int main(){int arr[10] = {1,2,3,4,5,6,7,8,9};int *p = arr;int sz = sizeof(arr)/sizeof(arr[0]);//一级指针p,传给函数
print(p, sz);return 0;}

思考:

当一个函数的参数部分为一级指针的时候,函数能接收什么参数?

答案:

 4 二级指针传参

#include <stdio.h>void test(int** ptr){printf("num = %d\n", **ptr);    
}int main(){int n = 10;int*p = &n;int **pp = &p;test(pp);test(&p);return 0;}

思考: 

当函数的参数为二级指针的时候,可以接收什么参数?

 

相关文章:

  • MOS参数详解
  • nginx ws长连接配置
  • web端即时通信技术
  • Python for循环中的引用传递和值传递
  • Redis 面试热点(二)
  • 每日一练:攻防世界:Ditf
  • Golang并发控制的三种方案
  • 一文理清GO语言日志库实现开发项目中的日志功能(rotatelogs/zap分析)
  • 基于多头注意力机制卷积神经网络结合双向门控单元CNN-BIGRU-Mutilhead-Attention实现柴油机故障诊断附matlab代码
  • MongoDB~高可用集群介绍:复制集群(副本集)、分片集群
  • SQL MAX() 函数深入解析
  • PyQt5设计登录跳转界面
  • 使用net.sf.mpxj读取project的.mpp文件
  • 文件操作(2)(C语言版)
  • Tuple 元组
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • Brief introduction of how to 'Call, Apply and Bind'
  • const let
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • java概述
  • MySQL主从复制读写分离及奇怪的问题
  • php中curl和soap方式请求服务超时问题
  • 记录:CentOS7.2配置LNMP环境记录
  • 力扣(LeetCode)22
  • 前端存储 - localStorage
  • 前嗅ForeSpider采集配置界面介绍
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 入门到放弃node系列之Hello Word篇
  •  一套莫尔斯电报听写、翻译系统
  • 用mpvue开发微信小程序
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • #define 用法
  • #pragma once与条件编译
  • #QT项目实战(天气预报)
  • #window11设置系统变量#
  • ()、[]、{}、(())、[[]]命令替换
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (7)svelte 教程: Props(属性)
  • (rabbitmq的高级特性)消息可靠性
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (搬运以学习)flask 上下文的实现
  • (二十三)Flask之高频面试点
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (转)编辑寄语:因为爱心,所以美丽
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .net core控制台应用程序初识