将数组传递给函数javav/scc
我对Java非常陌生,有一个话题让我大吃一惊。 将数组传递给java函数。 代码如下:将数组传递给函数javav/scc,java,c,arrays,pass-by-reference,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中的“按值调用”: #包括
private void PassArray(){
String[] arrayw = new String[4]; //populate array
PrintA(arrayw);
}
private void PrintA(String[] a){
//do whatever with array here
}
他们说java中的数组是通过引用传递的。但它看起来非常类似于C中的“按值调用”:
#包括
/*函数声明*/
双getAverage(int arr[],int size);
int main()
{
/*包含5个元素的整数数组*/
整数余额[5]={1000,2,3,17,50};
双平均值;
/*将指向数组的指针作为参数传递*/
平均值=平均值(余额,5);
/*输出返回的值*/
printf(“平均值为:%f”,平均值);
返回0;
}
double getAverage(整数arr[],整数大小)
{
int i;
双平均值;
双和;
对于(i=0;i
请解释它们在值、引用和内存分配方面的差异。
任何进一步的链接都将不胜感激。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
void打印数组(int数组[],int len)
{
printf(“打印数组:”);
int i;
对于(i=0;i
因此,一旦将数组作为参数传递给函数,它就不再是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
公共类测试
{
公共静态无效打印数组(字符串[]数组)
{
System.out.println(“打印数组”);
对于(int i=0;i
在java中,int、float、double、boolean等基本数据类型总是按值传递,但当传递数组、字符串和对象等非基本类型时,对象的地址就会传递。有关更多详细信息,请参阅。数组是在堆上分配的,它们将通过引用传递。与C相比,它们看起来像自动变量,处理也像C中自动变量的处理。只需尝试更改方法(函数)中的数组,看看发生了什么。另一方面,整数在堆栈上分配,并按值传递。下面是一些典型的操作,将数组作为参数传递给函数并从函数返回
public static void main(String[] args) {
int[] arr = {0, 0, 0, 0};
print(arr);
load(arr);
print(arr);
print(generate(5));
long s = 0;
System.out.println("long is " + s);
}
void willItChange(long param){
param = 3;
}
static int[] generate(int size){
int[] arr = new int[size];
for(int i = 0; i<size; i++)
arr[i] = i + 1;
return arr;
}
static void load(int[] arr){
for(int i = 0; i<arr.length; i++)
arr[i] = i + 1;
}
static void print(int[] arr){
for(int i = 0; i<arr.length; i++)
System.out.print(arr[i] + " ");
System.out.println();
}
数组通过引用传递,long通过值传递。在C:
在某种意义上,您不能在C中“传递数组”,因为函数不可能具有数组类型的参数。该标准规定,包含声明为“T数组”类型的参数的函数声明将被“调整”为“指向T的指针”类型的参数。在上面的示例中,参数arr
的类型为int*
(指针指向int
)
那么调用表达式getAverage(balance,5)
中的balance
是一个数组(int[5]
)会发生什么呢?编译器发现函数需要该参数使用指针类型(int*
),然后在传递该指针(指向需要指针的参数)之前,应用从数组值到指针rvalue(指向数组第一个元素的指针)的隐式转换。正如您所看到的,没有传递“数组”
而且,C中的所有内容都是按值传递的。C中没有pass by引用。您正在传递的指向-int
的指针是按值传递的,即它的值(它指向的内容)被复制到函数中的本地副本中
public static void main(String[] args) {
int[] arr = {0, 0, 0, 0};
print(arr);
load(arr);
print(arr);
print(generate(5));
long s = 0;
System.out.println("long is " + s);
}
void willItChange(long param){
param = 3;
}
static int[] generate(int size){
int[] arr = new int[size];
for(int i = 0; i<size; i++)
arr[i] = i + 1;
return arr;
}
static void load(int[] arr){
for(int i = 0; i<arr.length; i++)
arr[i] = i + 1;
}
static void print(int[] arr){
for(int i = 0; i<arr.length; i++)
System.out.print(arr[i] + " ");
System.out.println();
}
在Java中:
在Java中,数组是对象,Java中的对象不是值,不能“传递”(Java中没有“对象类型”,只有基元类型和引用类型)。与所有对象一样,数组只能通过“引用”(指向对象的指针)进行操作
Java中的一切都是按值传递的。Java中没有传递引用。在您的示例中,有一个类型为
String[]
的参数a
,它是一种引用类型,可以保存指向-String
对象数组的指针。传递的数组指针是按值传递的,即它的值(它指向的)被复制到函数中的本地副本。“他们在java数组中按引用传递”=它们是错误的。考虑并尝试“代码> Prtua< /Co> >实际上修改数组。因为它们是错误的-在Java中没有通过引用传递。@assylas通常这只是一个simplifi
public static void main(String[] args) {
int[] arr = {0, 0, 0, 0};
print(arr);
load(arr);
print(arr);
print(generate(5));
long s = 0;
System.out.println("long is " + s);
}
void willItChange(long param){
param = 3;
}
static int[] generate(int size){
int[] arr = new int[size];
for(int i = 0; i<size; i++)
arr[i] = i + 1;
return arr;
}
static void load(int[] arr){
for(int i = 0; i<arr.length; i++)
arr[i] = i + 1;
}
static void print(int[] arr){
for(int i = 0; i<arr.length; i++)
System.out.print(arr[i] + " ");
System.out.println();
}