这是由于数组倾向于衰减为指针这一事实造成的。
int a[] = { 1, 2, 3 };
int* p = a; // valid: p is now the address of a[0]
a = p; // NOT valid.
printf("a = %p\n", a);
printf("p = %p\n", p); // prints same address as a
a
并将p
打印相同的值。
与其他人所说的相反,a
它不是指针,它可以简单地衰减为一个。http://c-faq.com/aryptr/aryptrequiv.html
在你的第一个function()
传递的是数组的第一个元素的地址,函数体取消引用它。事实上,编译器将函数原型视为:
void function(int* array /*you wrote int array[]*/){
array[0] = 4;
array[1] = 5;
array[2] = 6;
}
function(&array[0]);
这必须发生,因为您说“未知大小的数组”(int array [])。编译器无法保证推断出按值传递所需的堆栈数量,因此它会衰减为指针。
- - 编辑 - -
让我们结合您的示例并使用更独特的名称来使事情更清晰。
#include <stdio.h>
void func1(int dynArray[]) {
printf("func1: dynArray = %p, &dynArray[0] = %p, dynArray[0] = %d\n",
dynArray, &dynArray[0], dynArray[0]);
}
void func2(int* intPtr) {
printf("func2: intPtr = %p, &intPtr[0] = %p, intPtr[0] = %d\n",
intPtr, &intPtr[0], intPtr[0]);
}
void func3(int intVal) {
printf("func3: intVal = %d, &intValue = %p\n",
intVal, &intVal);
}
int main() {
int mainArray[3] = { 1, 2, 3 };
int mainInt = 10;
printf("mainArray = %p, &mainArray[0] = %p, mainArray[0] = %d\n",
mainArray, &mainArray, mainArray[0]);
func1(mainArray);
func2(mainArray);
printf("mainInt = %d, &mainInt = %p\n",
mainInt, &mainInt);
func3(mainInt);
return 0;
}
ideone 现场演示:http: //ideone.com/P8C1f4
mainArray = 0xbf806ad4, &mainArray[0] = 0xbf806ad4, mainArray[0] = 1
func1: dynArray = 0xbf806ad4, &dynArray[0] = 0xbf806ad4, dynArray[0] = 1
func2: intPtr = 0xbf806ad4, &intPtr[0] = 0xbf806ad4, intPtr[0] = 1
mainInt = 10, &mainInt = 0xbf806acc
func3: intVal = 10, &intValue = 0xbf806ad0
infunc1
和func2
"dynArray" 和 "intPtr" 是局部变量,但它们是指针变量,它们从 main 中接收 "mainArray" 的地址。
此行为特定于数组。如果您要将数组放入结构中,那么您将能够按值传递它。