我在 main 函数中定义了一个数组,要将该数组作为参数传递给其他方法。那么被调用的方法如何声明?
两种:
void printArray1(int pArr[], int length); // 数组变量的方式
void printArray2(int* pArr, int length); // 指针变量的方式【推荐】int main() {int array[] = {11, 22, 33, 44, 55};int length = sizeof(array) / sizeof(array[0]);printArray1(array, length);printArray2(array, length);return 0;
}
注意,C语言中数组作为函数参数时,数组长度无法在被调用函数中计算,所以必须在该函数的参数列表中同时传入数组的长度。
另,记一句结论:C语言中数组变量(名)的本质其实是一个指针变量。
数组变量是一类特殊的、指向自己的指针变量
。
//
// main.c
// 09-数组
//
// Created by wuyujin1997 on 2023/1/28.
//#include
void printArray1(int pArr[], int length);
void printArray2(int* pArr, int length);int main() {int array[] = {11, 22, 33, 44, 55};printf("==> main start\n");printf("sizeof(pArr) = %lu\n", sizeof(array));printf("sizeof(pArr[0]) = %lu\n", sizeof(array[0]));int length = sizeof(array) / sizeof(array[0]);printf("length = %d\n", length);for (int i = 0; i < length; i++) {printf("array[%d] = %d\t", i, array[i]);}printf("\n==> main end\n");printArray1(array, length);printArray2(array, length);return 0;
}void printArray1(int pArr[], int length) {printf("\n==> printArray1(int pArr[], int specificLength) start\n");for (int i = 0; i < length; i++) {printf("array[%d] = %d\t", i, pArr[i]);}printf("\n==> printArray1(int pArr[], int specificLength) end\n");
}void printArray2(int* pArr, int length) {printf("\n==> printArray2(int* pArr, int specificLength) start\n");for (int i = 0; i < length; i++) {printf("array[%d] = %d\t", i, pArr[i]);}printf("\n==> printArray2(int* pArr, int specificLength) end\n");
}
==> main start
sizeof(pArr) = 20
sizeof(pArr[0]) = 4
length = 5
array[0] = 11 array[1] = 22 array[2] = 33 array[3] = 44 array[4] = 55
==> main end==> printArray1(int pArr[], int specificLength) start
array[0] = 11 array[1] = 22 array[2] = 33 array[3] = 44 array[4] = 55
==> printArray1(int pArr[], int specificLength) end==> printArray2(int* pArr, int specificLength) start
array[0] = 11 array[1] = 22 array[2] = 33 array[3] = 44 array[4] = 55
==> printArray2(int* pArr, int specificLength) end
Program ended with exit code: 0
Sizeof on array function parameter will return size of 'int *' instead of 'int[]'
'sizeof (pArr)' will return the size of the pointer, not the array itself
我们可以用 sizeof(数组名)
、sizeof(数组第一个元素)
两值相除得到数组的长度。
可以当把这个数组作为参数传到另一个方法的时候,在另一个方法中无法用同样的方法计算得出数组长度。
所以,必须在该函数的参数列表中同时传入数组的长度。
下图中:在main方法中声明了数组,可以通过sizeof计算出数组长度:20字节。
可是当使用了两种方法传递数组到另一个被调函数之后,在被调函数内部可以发现sizeof拿不到数组的长度,而是单个指针变量的size。
Xcode的提示也很明确:'sizeof (pArr)' will return the size of the pointer, not the array itself
,即sizeof(数组名)
在此处返回的是指针变量的size,而非数组本身的size。
另外注意一下 Sizeof on array function parameter will return size of 'int *' instead of 'int[]'
会在什么时候出现:
方法参数中数组传递方式是int pArr[]
而非int* pArr
的时候,我们使用sizeof(pArr)
才出现了这句警告。
//
// main.c
// 09-数组
//
// Created by wuyujin1997 on 2023/1/28.
//#include
void printArray1(int pArr[], int length);
void printArray2(int* pArr, int length);int main() {int array[] = {11, 22, 33, 44, 55};printf("==> main start\n");printf("sizeof(pArr) = %lu\n", sizeof(array));printf("sizeof(pArr[0]) = %lu\n", sizeof(array[0]));int length = sizeof(array) / sizeof(array[0]);printf("length = %d\n", length);for (int i = 0; i < length; i++) {printf("array[%d] = %d\t", i, array[i]);}printf("\n==> main end\n");printArray1(array, length);printArray2(array, length);return 0;
}void printArray1(int pArr[], int specificLength) {printf("\n==> printArray1(int pArr[], int specificLength) start\n");printf("sizeof(pArr) = %lu\n", sizeof(pArr));printf("sizeof(pArr[0]) = %lu\n", sizeof(pArr[0]));int length = sizeof(pArr) / sizeof(pArr[0]);printf("length = %d\n", length);for (int i = 0; i < length; i++) {printf("array[%d] = %d\t", i, pArr[i]);}printf("\n==> printArray1(int pArr[], int specificLength) end\n");
}void printArray2(int* pArr, int specificLength) {printf("\n==> printArray2(int* pArr, int specificLength) start\n");printf("sizeof(pArr) = %lu\n", sizeof(pArr));printf("sizeof(pArr[0]) = %lu\n", sizeof(pArr[0]));int length = sizeof(pArr) / sizeof(pArr[0]);printf("length = %d\n", length);for (int i = 0; i < length; i++) {printf("array[%d] = %d\t", i, pArr[i]);}printf("\n==> printArray2(int* pArr, int specificLength) end\n");
}
Output:
==> main start
sizeof(pArr) = 20
sizeof(pArr[0]) = 4
length = 5
array[0] = 11 array[1] = 22 array[2] = 33 array[3] = 44 array[4] = 55
==> main end==> printArray1(int pArr[], int specificLength) start
sizeof(pArr) = 8
sizeof(pArr[0]) = 4
length = 2
array[0] = 11 array[1] = 22
==> printArray1(int pArr[], int specificLength) end==> printArray2(int* pArr, int specificLength) start
sizeof(pArr) = 8
sizeof(pArr[0]) = 4
length = 2
array[0] = 11 array[1] = 22
==> printArray2(int* pArr, int specificLength) end
Program ended with exit code: 0
证明过程见 https://blog.csdn.net/wuyujin1997/article/details/128783233?