IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【C语言】指针进阶第四站,数组/指针的传参问题 -> 正文阅读

[C++知识库]【C语言】指针进阶第四站,数组/指针的传参问题


朋友们,到站啦!

指针进阶第四站🚏,传参问题


0.引例

自定义函数里形参的类型,要和函数调用中传过去的实参类型相对应

在初阶C语言的学习里面,我们了解到传参分为传址传值两种类型

一起来复习一下吧👉【链接】

test函数里的是int类型,我们传过去的参数a也是int类型

void test(int n)
{}
int main()
{
    int a=1
    test(a);
    return 0;
}

好了,现在你已经知道了函数传参的基本概念了😁

那么就来分析一下数组传参、指针传参的代码吧!

1.一维数组传参

看看以下函数的代码示例

你觉得谁是正确的,谁是错误的呢?

include <stdio.h>
void test(int arr[])
{}
void test(int arr[10])
{}
void test(int *arr)
{}
void test2(int *arr[20])
{}
void test2(int **arr)
{}
int main()
{
	int arr[10] = {0};
	int *arr2[20] = {0};
	test(arr);
	test2(arr2);
    return 0;
}
  • NO.1 形参使用数组的形式来接收,正确

  • NO.2 同样是数组的形式,正确

    需要注意的是,数组传参并不会开辟一个新的数组

    所以函数[ ]里的数字是多少并不影响

  • NO.3 数组名是首元素的地址,用指针接收,正确

  • NO.4 arr2是一个指针数组,(int *arr[20])和原数组对应,正确

  • NO.5 数组名是首元素地址,arr2的首元素是一个int*类型

    可以用二级指针来接收,正确!

image-20220122215139642

2.二维数组传参

了解完一维数组了,那就来看看二维数组

以下的函数传参,哪些是对的,哪些是错的呢?

void test(int arr[3][5])//一一对应,正确!
{}
void test(int arr[][])//省略列,错误!
{}
void test(int arr[][5])//可以省略行,正确!
{}
void test(int *arr)//二维数组的首元素是第一行
{}//第一行是int(*)[5]类型,错误!
void test(int* arr[5])//指针数组,错误!
{}
void test(int (*arr)[5])//数组指针,正确!
{}
void test(int **arr)//arr不是一级指针的地址,错误!
{}

int main()
{
	int arr[3][5] = {0};
    test(arr);
    return 0;
}

根据二维数组传参的代码,复习以下知识点

  • 二维数组的首元素是第一行
  • 二维数组在定义的时候可以省略行,不能省略列

第一行的类型是int[5],应该放进数组指针里!


3.一级指针传参

#include <stdio.h>
void print(int *p, int sz)//用int*来接受
{
 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]);
 
 print(p, sz);//一级指针p,传给函数
 return 0;
}

4.二级指针传参

什么是二级指针?👉点我

以下是二级指针传参的基本形式

pp是int**类型,而&p是指针变量的地址,要用二级指针来接收

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

再来看如下代码

&ppparr这三个参数的类型都是二级指针

test函数里面要用char**来接收

void test(char** p)
{}

int main()
{
	char ch = 'w';
	char* p = &ch;
	char** pp = &p;
	char* arr[5];

	test(&p);
	test(pp);
	test(arr);
	
	return 0;
}

arr是指针数组的数组名,数组名是数组首元素的地址

数组的首元素是char*类型,所以要用二级指针来接收


5.如何判断参数类型

如果我们在写代码的时候,不缺定应该用什么类型来接收的时候

可以写一个测试代码,VS编译器会报错“类型不一致”

image-20220122220934363


结语

传参问题并不算非常难,但我们仍要熟练掌握

这样才能避免在写自定义函数的时候出现参数类型不同的bug!

站稳了,马上驶往下一站🚌:函数指针

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-24 10:38:58  更:2022-01-24 10:39:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:23:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码