黑马程序员技术交流社区
标题:
关于输出数组的问题
[打印本页]
作者:
千年的泪
时间:
2014-5-26 11:09
标题:
关于输出数组的问题
本帖最后由 千年的泪 于 2014-5-26 12:25 编辑
问题:我想输出数组array中的所有元素,但是为什么输出到2就不再输出了?
输出结果: 1 2
#include <stdio.h>
int printArray(int arr[])
{
int i;
for (i = 0; i < sizeof(arr) / sizeof(int); i++)
{
printf(" %d ", arr[i]);
}
printf("\n");
return 0;
}
int main(void)
{
int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
printArray(array);
return 0;
}
复制代码
作者:
李稳
时间:
2014-5-26 11:28
不知道楼主着两行打印的是什么?
printf("sizeof(arr)=%d",sizeof(arr));
printf("sizeof(int)=%d",sizeof(int));
首先,sizeof(arr)是取的指针的字节数,我的编译器得到的sizeof(arr)等于4,sizeof(int)等于1
作者:
★Joean_Zhou
时间:
2014-5-26 11:51
#include <stdio.h>
int printArray(int arr[])
{
int i;
int d = sizeof(arr) ; /*因为你主函数的数组传递到这个子函数后相当于传递的是指针,也就是地址,所以无论你的数组多长,32位编译系统就是
四个字节,你是64位的所以占8个字节,所以sizeof(arr) / sizeof(int)=8/4=2,所以你只能输出两位 */
printf("%d\n",d);
for (i = 0; i <sizeof(arr) / sizeof(int) ; i++) //你的这条指令相当于for(i =0;i<2;i++)
{
printf(" %d ", arr[i]);
}
printf("\n");
return 0;
}
int main(void)
{
int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
printArray(array);
return 0;
}
//解决方法:你可以在主函数内把数组的字节算出来再传到子函数,数组与数组相当于传的指针(地址)
作者:
XCodeRush
时间:
2014-5-26 12:12
回答:
printArray函数中的arr并不等同于main函数中的array,array是数组而arr是指针;
不管arr怎样写(int * arr或者int arr[]),arr都是个指针,arr负责接收array数组首元素的地址;
当用sizeof(arr)计算arr所占字节数的时候,sizeof计算的不是arr指向的数组所占的字节数,而是计算arr指针自身所占字节数;
在64位环境下,指针占8个字节,int占4个字节,所以sizeof(arr) / sizeof(int) = 8 / 4 = 2;
说道这里就不难看出,程序的输出结果一定只是数组array前两个元素的值。
解决办法就是在调用函数printArray时,直接把在main函数中计算出的数组长度传递进去。
#include <stdio.h>
void printArray(int arr[], int len) // arr接收array数组首元素的地址,len接收array数组的长度
{
// 在printArray函数中arr是指针,指针占8个字节
printf("在printArray函数中指针arr所占字节数(sizeof(arr)) = %lu\n", sizeof(arr));
printf("错误的计算结果:sizeof(arr) / sizeof(int) = %lu / %lu = %lu\n", sizeof(arr), sizeof(int), sizeof(arr) / sizeof(int));
for (int i = 0; i < len; i++) {
printf(" %d ", arr[i]);
}
printf("\n");
}
int main(void)
{
int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// 在main函数中,数组array所占的字节数为40
printf("在main函数中数组array所占字节数(sizeof(array)) = %lu\n", sizeof(array));
printf("sizeof(array) / sizeof(int) = %lu / %lu = %lu\n", sizeof(array), sizeof(int), sizeof(array) / sizeof(int));
printArray(array, sizeof(array) / sizeof(int)); // 将array数组的地址以及长度都传递给printArray函数
return 0;
}
复制代码
作者:
千年的泪
时间:
2014-5-26 12:23
论坛的力量不可小视啊!这么快!!!{:3_46:}
作者:
千年的泪
时间:
2014-5-26 12:24
XCodeRush 发表于 2014-5-26 12:12
回答:
printArray函数中的arr并不等同于main函数中的array,array是数组而arr是指针;
:handshake
作者:
从┧靇┟开始
时间:
2014-5-26 12:38
楼主 加油 !
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2