文章目录
- Intro & Summary
- Code & Output
- 运行截图
- Code
- 关于数组长度在被调函数中的计算错误
- 运行截图 & 警告信息
- Code
- 数组变量是一类特殊的、指向自己的指针变量
Intro & Summary
我在 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语言中数组变量(名)的本质其实是一个指针变量。
数组变量是一类特殊的、指向自己的指针变量
。
Code & Output
运行截图
Code
//
// main.c
// 09-数组
//
// Created by wuyujin1997 on 2023/1/28.
//
#include <stdio.h>
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)
才出现了这句警告。
Code
//
// main.c
// 09-数组
//
// Created by wuyujin1997 on 2023/1/28.
//
#include <stdio.h>
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?