醍醐灌顶!终于弄懂了函数的值传参与地址传参

一、变量与指针
什么是变量?所谓变量,不要浅显的认为会变得量就是变量。套用我们院长的问话:“教室变不变?”变,因为每天有不同的人在里面上课,但又不变,因为教室始终在那,没有变大或变小。这就是变量:有一个不变的地址和一块可变的存储内容。正常情况下,我们只看到变量这个房间里面的东西,也就是其内容,但不会关注变量的地址,但是C语言的指针,就是这个房间的地址。

	我们声明变量就相当于盖了间房子存放东西,我们可以直接观看房子里的东西(直接访问)。
	当然,也可以通过访问这个房间的地址再取值(间接访问)而声明指针,就是存放该变量的地址。
	总的来说:
	指针的作用就是:给出一个指针,取出该指针指向地址处的值。

指针类型定义:当一个地址作为一个变量存在时,它就被叫做指针,该变量的类型,自然就是指针类型。

二、函数的值传参与地址传参

值传参(单向的值传递)

1):普通常量、变量作为函数参数
2):数组元素作为函数参数
数组元素就是下标变量与普通变量并无区别,在发生函数调用时,把作为实参的数组元素的值传递给形参,实现单向的值传递
例如:判断一个整数数组中各个元素的值,大于0输出该值,小于0赋值为0。
在这里插入图片描述
在这里插入图片描述
地址传参:()
1)数组名作为函数参数
注意:用数组名作为函数参数时,形参与实参数组类型不一致会发生错误。

在用数组名作为函数参数时,不是进行值的传递,而是首地址的传送形参数组取得该首地址后与实参数组存储空间相同
在这里插入图片描述
在这里插入图片描述
2)指针作为函数参数

1.1、值会改变
变量的内容固定,只改变指针的指向
在这里插入图片描述
1.2、值不会改变(实参与形参都是指针变量)

备注:(即使函数是地址传递,形参指针指向的变化不会影响到实参指针的指向)

因为实参指针与形参指针分别代表不同的指针,这里是只是将实参指针指向的地址传递给形参指针,使实参指针与形参指针指向同一个地址,故形参指针指向的变化不会影响到实参指针。

在这里插入图片描述

注意:调用指针变量,实参传递给形参的是变量的地址,虽然他们是不同的指针(即形参指针指向改变无法影响实参指针指向),但他们指向同一个存储单元如果形参指针改变变量地址里的值,实参指针指向的值也就变了
(例如:我所在班级为1班,小王和老赵是1班的实习数学老师和数学老师。那么老赵是实参指针,小王是形参指针,1班就是共同的地址。有一天,小王去2班教课了,小王的地址变了,可影响不到老赵教的1班,即形参指针指向改变无法影响实参指针指向。但是,要是小王在1班实习时骗走了2个学生,那么老赵和小王所指的共同地址内容就变了。)
在这里插入图片描述

在这里插入图片描述

三、指针与数组

#include<stdio.h>
int main(void)
{
int a[2][3] = { {1,2,3},{4,5,6} };
int *p=a;
}

无法从“int [2][3]”转换为“int *”

a在这里代表的是二维数组的行首地址, 单纯的*p是一个只能指向一维数组的指针

二维数组定义:数组的数组
float rain[2][3]; 内含2个数组元素的数组,每个数组元素内含3个float类型的元素。
此时可以想象出一个2*3的矩阵,这个二维数组由两个一维数组组成,每个一维数组内含3个float类型的元素.
-——>:rain代表二维数组的行首地址;rain[0]与rain[1]是内含3个float值的一维数组,即rain[0]为一维数组的首地址,那么rain[0][0]是一个float类型的值。

由此可以知道:
int main(void)
{
int a[2][3] = { {1,2,3},{4,5,6} };
int *p=a[0]; // 二维数组中第一行的一维数组的首地址
//int *p=&a[0][0];
}

此外还可以定义一个数组指针; (数组指针是指向数组地址的指针,其本质为指针)

int *p[3] =a;

详见:菜鸟易懂的(变量与指针、数组、函数)

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值