C语言进阶:指针的进阶(3)

 更新时间:2021年09月02日 14:42:16   作者:AKA你的闺蜜  
这篇文章主要介绍了C语言指针详解及用法示例,介绍了其相关概念,然后分享了几种用法,具有一定参考价值。需要的朋友可以了解下

数组传参和指针传参

实践之中不免会碰到数组和指针作函数参数而如何设计形参的问题。

一维数组传参

一维数组传参,下列接收方式是否可行呢?

//1.
void test(int arr[]) 
{}
//2.
void test(int arr[10]) 
{}
//3.
void test(int* arr) 
{}
int main()
{	
	int arr[10] = { 0 };
	test(arr);
	return 0;
}

1.数组传参数组接收,可行但其实都会降级优化成指针,编译器不会真正创建一个数组。

2.由于形参数组形同虚设,所以数组大小无意义,任意大小或无。(有歧义)

3.数组传参本质就是首元素地址,首元素类型为int,所以指针的类型为int*。

所以可以看出[]和*()是等价的。我愿称之为*和[]的爱恨情仇!(‐^▽^‐)

//1.
void test2(int* arr[2])
{}
//2.
void test2(int** arr) 
{}
int main()
{	
	int* arr2[10] = { 0 };
	test2(arr2);
	return 0;
}

指针数组,每个元素类型为int*,故用二级指针接收数组名。

一维数组传参,数组和指针接收。

二维数组传参

//1.
void test(int arr[3][5]) 
{}
//2.
void test(int arr[][])
{}
//3.
void test(int arr[][5])
{}
int main() {
	int arr[3][5] = { 0 };
	test(arr);
}
  • 二维数组传参用二维数组接收,行可省略,但列不可以
//4.
void test(int* arr)
{}
//5.
void test(int* arr[5])
{}
//6.
void test(int(*arr)[5])
{}
//7.
void test(int** arr)
{}
int main() {
	int arr[3][5] = { 0 };
	test(arr);
}

4.整型指针接收的应该是整型变量的地址,而二维数组数组名为首行的数组地址。

5.指针数组和二维数组无关。

6.二维数组传参用首行数组大小的数组指针接收。

7.二级指针和二维数组无关。

  • 二维数组数组名arr为首行“一维数组”的地址,数组的地址用数组指针接收。

int(*)[5]型数组指针指向元素个数为5的一维数组。指针+1访问到下一行,每次跳一行。再解一层引用访问一行里每个元素。

一级指针传参

反向思考,若函数形参为指针,传参时实参可以如何设计呢?

void test(int* ptr, int sz)
{}
void test(int arr[],int sz)
{}
int main()
{
    //1.
    int a = 10;
    test(&a);
    //2.
	int arr[10] = { 0 };
	test(arr);
	return 0;
}
  • 一级指针传参,形参用指针和数组都行,但不提倡用一维数组。
  • 若形参为指针,实参也可以是指针(地址),也可以是数组。

二级指针传参

当二级指针作参数时,形参如何设计呢?

void test(int** pp) {
	printf("%d\n", **pp);
}
void test(int* arr[]) {//用法不好
	printf("%d\n", *arr[0]);
}
int main() {
	int a = 10;
	int* p = &a;
	int** pp = &p;
	test(pp);
	return 0;
}
  • 当二级指针作函数参数时,形参可以是二级指针和指针数组。

当形参为二级指针,实参可以传什么呢?

void test(int** pp) {
	printf("%d\n", **pp);
}
int main() {
	int a = 10;
	int* p = &a;
	int** pp = &p;
	int* arr[10] = { &a };
    //1.
	test(&p);
    //2.
	test(pp);
    //3.
	test(arr);
	return 0;	
}
  • 当形参为二级指针时,实参可以是:二级指针(一级指针地址),指针数组首元素的地址。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • 带你从编码角度分析C++重载原理

    带你从编码角度分析C++重载原理

    这篇文章主要为大家介绍了从编码角度分析C++重载原理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • C语言报错:Buffer Overflow的原因和解决办法

    C语言报错:Buffer Overflow的原因和解决办法

    Buffer Overflow是C语言中常见且危险的内存错误之一,它通常在程序试图向缓冲区(如数组或内存块)写入超过其容量的数据时发生,本文将详细介绍Buffer Overflow的产生原因,提供多种解决方案,需要的朋友可以参考下
    2024-07-07
  • 使用C语言实现珠玑妙算Mastermind小游戏

    使用C语言实现珠玑妙算Mastermind小游戏

    这篇文章主要介绍了使用C语言实现珠玑妙算Mastermind小游戏,这是一款益智类多人游戏游戏,非常有趣,需要的朋友可以参考下
    2023-03-03
  • Win10+VS2017新CUDA项目配置教程

    Win10+VS2017新CUDA项目配置教程

    这篇文章主要为大家详细介绍了Win10+VS2017新CUDA项目配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • 一道面试题教你轻松玩转C++指针

    一道面试题教你轻松玩转C++指针

    下面小编就为大家带来一篇深入理解c++指针的指针和指针的引用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考,一起跟随小编过来看看吧
    2021-09-09
  • Qt4和Qt5的信号和槽的使用区别

    Qt4和Qt5的信号和槽的使用区别

    本文主要介绍了Qt4 和 Qt5 的信号和槽的连接 connect 与断开 disconnect 区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • C语言数据结构之模式匹配字符串定位问题

    C语言数据结构之模式匹配字符串定位问题

    这篇文章主要介绍了C语言数据结构之模式匹配字符串定位问题的相关资料,希望通过本文能帮助到大家,让大家理解这部分内容,需要的朋友可以参考下
    2017-10-10
  • C程序函数调用&系统调用

    C程序函数调用&系统调用

    这篇文章主要介绍了C程序函数调用&系统调用,需要的朋友可以参考下
    2016-09-09
  • Matlab实现数据的动态显示方法

    Matlab实现数据的动态显示方法

    这篇文章主要为大家详细介绍了Matlab使用Plot函数实现数据动态显示方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • C++中replace()函数使用方法汇总

    C++中replace()函数使用方法汇总

    这篇文章主要介绍了C++中replace()函数使用方法汇总,在这篇文章中为大家详细介绍C++ replace()函数的各种应用方式,希望朋友们可以从这里介绍的内容充分掌握这一应用技巧
    2015-11-11

最新评论