java - 将数组传递给函数 Java v/s C

标签 java c arrays pass-by-reference

我是 Java 的新手,有一个话题让我大吃一惊。 将数组传递给 java 函数。 代码如下:

private void PassArray(){
String[] arrayw = new String[4]; //populate array
PrintA(arrayw);
}

private void PrintA(String[] a){
//do whatever with array here
}

他们说在 java 中数组是通过引用传递的。但它看起来与 C 中的“按值调用”非常相似:

#include <stdio.h>

/* function declaration */
double getAverage(int arr[], int size);

int main ()
{
/* an int array with 5 elements */
int balance[5] = {1000, 2, 3, 17, 50};
double avg;

/* pass pointer to the array as an argument */
avg = getAverage( balance, 5 ) ;

/* output the returned value */
printf( "Average value is: %f ", avg );

return 0;
}

double getAverage(int arr[], int size)
{
int    i;
double avg;
double sum;

for (i = 0; i < size; ++i)
{
sum += arr[i];
}

avg = sum / size;

return avg;
}

请解释它们在值、引用和内存分配方面的区别。 任何进一步的链接将不胜感激。

最佳答案

C 中的数组是“按引用传递”而不是“按值传递”。请看下面的程序:-

    void print_array (int array[], int len)
    {
        printf("Printing the array: ");
        int i;

        for (i = 0; i < len; ++i) {
            printf("%d ", array[i]);
        }

        printf("\n");
    }

    void populate_array (int array[], int len)
    {
        printf("Populating the array....\n ");
        int i;

        for (i = 0; i < len; ++i) {
            array[i] = i;
        }
    }


    int main() 
    {
        int array[5];
        memset(array, 0, sizeof(int) * 5);  

        print_array(array, 5);  
        populate_array(array, 5);
        print_array(array, 5);  

        return(0);
    }

    Output:-
    GAGUPTA2-M-40UT:Desktop gagupta2$ ./a.out 
    Printing the array: 0 0 0 0 0 
    Populating the array....
    Printing the array: 0 1 2 3 4 

所以一旦你将数组作为参数传递给函数,它就不再是C中的“按值传递”机制。而是“按引用传递”。因此,在调用 populate_array() 之前,数组的内容全为零,而在调用 populate_array() 之后,它们有一些值。

在 Java 中,您会观察到类似的情况。在下面放置类似的 Java 代码:-

    public class Test 
    {
        public static void print_array (String[] array)
        {
            System.out.println("Printing the array");

            for (int i = 0; i < array.length; ++i) {
                System.out.print(array[i] + " ");
            }

            System.out.println();
        }

        public static void populate_array (String[] array)
        {
            System.out.println("Populating the array");

            for (int i = 0; i < array.length; ++i) {
                array[i] = new String("init_array");    
            }
        }

        public static void main (String[] args) 
        {
            String[] array = new String[5];

            print_array(array);
            populate_array(array);
            print_array(array);
        }
    }

Output:-
GAGUPTA2-M-40UT:Desktop gagupta2$ java Test
Printing the array
null null null null null 
Populating the array
Printing the array

在 java 中,基本数据类型如 int、float、double、boolean 等总是按值传递,但当你传递非基本类型如数组、字符串和对象时,对象的地址将被传递。参见 Is Java "pass-by-reference" or "pass-by-value"?了解更多详情。

关于java - 将数组传递给函数 Java v/s C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30985971/

相关文章:

java - 按钮未显示在自定义 ListView 实现中

c 代码表现得很奇怪。当它即将完成并从主函数返回 0 时,它会给出段错误

c - C : read() returns > 0 bytes read, 中的套接字但缓冲区为零

c - 往返转换后指针的相等关系是否保证是可传递的?

java - 合并 pdf 并在 java 中使用 iText 添加书签

java - 原语和对象的不同可变参数优先级

arrays - 当新项目添加到原始数组时,如何更新作为 init 参数传递的数组

arrays - 如何在 C 编程中将 char 数组转换为 int 数组?

javascript - 更新状态时无法在现有状态转换期间更新?

java - Android - 在 ListView 中显示所有 SQLite 数据库条目