鱼C论坛

 找回密码
 立即注册
查看: 1903|回复: 5

数组作为函数参数为什么是值传递

[复制链接]
发表于 2020-1-18 11:41:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
数组传递是双向的,值传递是单向的,那么为什么数组传递是值传递的一种。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-18 13:06:05 | 显示全部楼层
应为你传递的根本就是个指针,你对数组的所有操作都是对这个指针指向的对象的操作,
对于指针本身仍然是值传递

这段代码也许能帮助你理解
  1. #include <stdio.h>
  2. int a[4] = { 1,2,3,4 };
  3. int b[4] = { 5,6,7,8 };


  4. int func(int f[]) {
  5.         printf("调用func前f的值:");
  6.         for (int i = 0; i < 4; ++i) {
  7.                 printf("%d ", f[i]);
  8.         }
  9.         printf("\n");

  10.         f = b;   //这才是对指针本身的操作

  11.         printf("调用func后f的值:");
  12.         for (int i = 0; i < 4; ++i) {
  13.                 printf("%d ", f[i]);
  14.         }
  15.         printf("\n");
  16. }

  17. int main()
  18. {
  19.         int a[4] = { 1,2,3,4 };
  20.         printf("调用func前a的值:");
  21.         for (int i = 0; i < 4; ++i) {
  22.                 printf("%d ", a[i]);
  23.         }
  24.         printf("\n");

  25.         func(a);

  26.         printf("调用func后a的值:");
  27.         for (int i = 0; i < 4; ++i) {
  28.                 printf("%d ", a[i]);   //可以看到,a并没有发生改变
  29. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-19 12:01:37 | 显示全部楼层
Croper 发表于 2020-1-18 13:06
应为你传递的根本就是个指针,你对数组的所有操作都是对这个指针指向的对象的操作,
对于指针本身仍然是值 ...

谢谢,再麻烦问一下:如果在被调函数中对形参数组元素值进行改变,主调函数中实参数组的相应元素值也会改变,这是值得特别注意的一点。这句话咋理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-19 14:39:18 | 显示全部楼层
松鼠呀 发表于 2020-1-19 12:01
谢谢,再麻烦问一下:如果在被调函数中对形参数组元素值进行改变,主调函数中实参数组的相应元素值也会改 ...


就是你对被调函数里边的数组形参进行操作,因为数组名实际是个指针,所以主调函数中的数组值也会改变。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-1-19 21:07:21 | 显示全部楼层
那叫址传递
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-1-19 21:43:27 | 显示全部楼层
松鼠呀 发表于 2020-1-19 12:01
谢谢,再麻烦问一下:如果在被调函数中对形参数组元素值进行改变,主调函数中实参数组的相应元素值也会改 ...


不要空理解,上代码
  1. int func(int f[]) {
  2.         printf("调用func前f的值:");
  3.         for (int i = 0; i < 4; ++i) {
  4.                 printf("%d ", f[i]);
  5.         }
  6.         printf("\n");

  7.         f[2] = 5;
  8.         f[3] = 6;

  9.         printf("调用func后f的值:");
  10.         for (int i = 0; i < 4; ++i) {
  11.                 printf("%d ", f[i]);
  12.         }
  13.         printf("\n");
  14. }

  15. int main()
  16. {
  17.         int a[4] = { 1,2,3,4 };
  18.         printf("调用func前a的值:");
  19.         for (int i = 0; i < 4; ++i) {
  20.                 printf("%d ", a[i]);
  21.         }
  22.         printf("\n");

  23.         func(a);

  24.         printf("调用func后a的值:");
  25.         for (int i = 0; i < 4; ++i) {
  26.                 printf("%d ", a[i]);   //可以看到,a的值发生了改变
  27.         }
  28. }
复制代码

你可以对比以下两段代码的不同
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 01:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表