C语言中,为什么在方法参数中传递的数组参数,无法通过sizeof() 获取数组参数的长度,老是返回8。
在方法参数中传递的数组参数,它退化为指针,所以用sizeof() 获取的值,就是一个指针的大小,得到 8 说明是 64 位系统,4 是 32 位系统。
因为参数位置传递的是个指针,你获取的是指针的大小而不是数组的大小
除非是字符串,字符串以0结尾,可以用strlen来获取实际长度
如果是int数组,那么你需要额外的变量传递长度
用数组长度作为额外参数
#include <stdio.h>
void printArray(int arr[], int length) {
for (int i = 0; i < length; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int length = sizeof(arr) / sizeof(arr[0]);
printArray(arr, length);
return 0;
}
在数组的最后一个元素设置结束标记
#include <stdio.h>
void printArray(int arr[]) {
int i = 0;
while (arr[i] != -1) {
printf("%d ", arr[i]);
i++;
}
printf("\n");
}
int main() {
int arr[] = {1, 2, 3, 4, 5, -1};
printArray(arr);
return 0;
}
#include <stdio.h>
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
// float sc[5] = { 0.0f, 3.0f };
// 结构体数组业可以创建
总结:
1.数组是使用下标来访问的,下标是从0开始。
2.数组的大小可以通过计算得到。
问题解答:
在C语言中,当在方法参数中传递一个数组参数时,使用sizeof()获取数组长度时常会返回8,这是因为在函数中使用数组名作为参数时,实际上传递的是数组首元素的地址,而sizeof()操作符在这种情况下返回的是指针类型所占内存的大小。
因此,如果要获取数组的实际长度的话,可以使用另外一个参数来传递数组长度,在方法中进行计算即可。具体实现代码如下:
#include <stdio.h>
void insertSort(int arr[], int len) {
for (int i = 1; i < len; i++) {
int temp = arr[i];
int j = i;
while (j > 0 && temp < arr[j - 1]) {
arr[j] = arr[j - 1];
j--;
}
arr[j] = temp;
}
}
int main() {
int arr[] = {45, 32, 56, 71, 12};
int len = sizeof(arr) / sizeof(arr[0]);
printf("数组的长度:%d\n", len);
printf("\n排序前:\n");
for(int i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
insertSort(arr, len);
printf("\n\n经过直接插入排序后:\n");
for(int i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
return 0;
}
在这个示例代码中,我们首先定义了一个函数 insertSort,它接受两个参数,第一个是整型数组 arr,第二个是数组长度 len。在这个函数中,我们使用插入排序算法对整型数组进行排序。而在主函数中,我们定义了一个整型数组 arr,然后使用 sizeof(arr) / sizeof(arr[0]) 的方法计算出数组的长度 len,再将这个长度作为参数传递给 insertSort 函数。
输出结果如下:
数组的长度:5
排序前:
45 32 56 71 12
经过直接插入排序后:
12 32 45 56 71
注意,如果在函数中仍然需要获取数组的长度,可以在函数中定义一个局部变量来存储数组的长度,这样就避免了指针类型所占内存大小的问题。例如:
void insertSort(int arr[], int len) {
int arrLen = len; // 定义一个局部变量存储数组长度
// 此处省略其他代码
}
总之,为了避免使用 sizeof() 获取数组长度时出现问题,可以在方法调用时传递数组的长度作为参数。