我想知道是否有任何真正的区别;我编写了代码,因为它感觉它是通过副本而不是引用传递但它作为参考。
以下是代码:
#include <stdio.h>
#include <conio.h>
using namespace std;
int pause = 0;
void display(int b[5], int size){
for (int i = 0; i < size; i++){
printf("\n%d",b[i]," at:");
printf(" %d", &b[i]);
}
}
void main(){
int num[] = { 2, 4, 6, 8, 10 };
printf("\nIn main function.");
for (int i = 0; i < 5; i++){
printf("\n%d", num[i], " at:");
printf(" %d", &num[i]);
}
display(num,5);
scanf("%d", pause);
}
答案 0 :(得分:0)
您无法将数组本身传递给所有的函数,也无法返回一个。特别是,尽管声明的出现,您的函数display()
不会将数组作为参数接收。它的声明与此相当于100%:
void display(int *b, int size);
和这一个:
void display(int b[], int size);
数组类型的表达式几乎可以在它们出现的每个上下文中自动转换为指针,因此这个函数调用:
display(num,5);
相当于
display(&num[0],5);
尽管如此,在这个领域可能会有一个潜在的差异:表达式&num
不等同于&num[0]
。它们引用相同的地址,但这两个表达式有不同的类型。传递前者类似于通过引用传递数组,但该表达式对于display()
函数的第一个参数没有正确的类型。想要接收&amp; num的函数需要以不同的方式声明:
void display2(int (*b)[5]);
或
void display3(int n, int (*b)[n]);
后者需要C99,或C2011支持VLA(在C99中是必需的,但在C2011中是可选的)。