1

我有这个作业问题:

A部分

编写一个 C 程序,测试以下数据类型是通过引用还是按值传递,并将发现的内容打印到终端:

  • 整数
  • 整数数组

假设,如果你的程序发现一个 int 是按值传递的,而一个 int 数组是按值传递的,那么它应该产生如下输出: int: pass-by-value array of ints: pass-by-value

我理解的 int ,但我没有得到的是:

  1. 我认为传递数组的唯一方法是传递数组中第一个值的地址
  2. 这算作按值传递还是按引用传递?(按值将数组传递给函数让我很困惑)
  3. 关于我如何做到这一点的提示?我假设像将引用传递给另一个函数,操纵它,看看它是否改变了,但我不确定......

编辑:如果有人用一个具体的例子向我解释这一点可能会有所帮助,例如:假设我有一个长度为 10 个整数的数组存储在内存位置 0 (是的,我知道,这不是现实生活,而是为了示例。 ..)。如果该数组通过引用传递会是什么样子?如果按值传递会是什么样子?

4

2 回答 2

5

这算作按值传递还是按引用传递?

当您说“将数组传递给函数”时,实际上将指向第一个元素的指针传递给函数。这允许被调用的函数修改数组的内容。由于没有创建数组的副本,因此可以说数组是通过引用传递的。

关于我如何做到这一点的提示?

测试应该是:

  1. 在 中创建一个本地数组main()
  2. 用已知模式填充它
  3. 打印数组的内容
  4. 将数组传递给函数
  5. 在函数体内部修改数组的内容
  6. 打印函数内部的数组
  7. 再次main()打印本地数组的内容
  8. 如果输出67匹配。你有证据。

如何按值传递数组?

按值传递数组的唯一可能方法是将其包装在结构中。
在线样品

#include <iostream>

struct myArrayWrapper 
{
    int m_array[5];
};

void doSomething(myArrayWrapper a) 
{
    int* A = a.m_array;

    //Display array contents
    std::cout<<"\nIn Function Before Modification\n";
    for (size_t j = 0; j < 5; ++j)
       std::cout << ' ' << A[j];
    std::cout << std::endl;

     //Modify the array
     for (size_t j = 0; j < 5; ++j)
       A[j] = 100;

    std::cout<<"\nIn Function After Modification\n";
    //Display array contents
    for (size_t j = 0; j < 5; ++j)
       std::cout << ' ' << A[j];
    std::cout << std::endl;

}

int main()
{
    myArrayWrapper obj;
    obj.m_array[0] = 0;
    obj.m_array[1] = 1;
    obj.m_array[2] = 2;
    obj.m_array[3] = 3;
    obj.m_array[4] = 4;
    doSomething(obj);

    //Display array contents
    std::cout<<"\nIn Main\n";
    for (size_t j = 0; j < 5; ++j)
       std::cout << ' ' << obj.m_array[j];
    std::cout << std::endl;

    return 0; 
}

输出:

In Function Before Modification
 0 1 2 3 4

In Function After Modification
 100 100 100 100 100

In Main
 0 1 2 3 4
于 2012-06-22T15:05:30.197 回答
2

C 仅按值将参数传递给函数。

来自强大的 Kernighan & Ritchie,第 2 版:

(1.8,按值调用)“在C中所有函数参数都是按“值”传递的

于 2012-06-22T15:06:18.687 回答