鱼C论坛

 找回密码
 立即注册
查看: 12834|回复: 12

传递给函数的数组,想用sizeof()得到数组长度怎么办?

 关闭 [复制链接]
发表于 2011-6-16 19:25:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#include <stdlib.h>


void func(int a[]);

void main()
{
int a[10] , i;

printf("输入数组元素:\n");
for(i = 0 ; i < 10 ; i++)
scanf("%d" , &a[i]);

printf("main()函数中:");
for(i = 0 ; i < 10 ; i++)
printf("%4d" , a[i]);
printf("\n");

printf("main()中数组的长度为: %6d\n" , sizeof(a));

func(a);

system("pause");
}

/***********************************************************************************
通过下面来那个不同功能的函数你会发现:
1.函数能输出传递来的数组中的每一个函数;让你认为的确是传递来了整个数组;
2.当使用sizeof(a);本想得到整个数组的长度时,你却发现结果为4;这不是指针的长度吗?
***********************************************************************************/
void func(int a[])
{
int i;
printf("func()函数中数组(传递而来)为: \n");
for(i = 0 ; i < 10 ; i++)
printf("%4d" , a[i]);

printf("\n\n%d\n\n" , sizeof(a));
}
/*
void func(int a[])
{
printf("func()中数组的长度: %6d\n" , sizeof(a));
}*/
既然可以输出传递的整个数组,为什么想要得到数组长度却不行了呢??
希望给大家帮帮!!  先谢过!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-16 22:15:01 | 显示全部楼层
数组可以看成为在内存中的一段连续数据,a是这段数据的首地址,你也可以把a看成为一个指针
可能这句有点抽象,你多想想,就会明白的,指针p=a时,这个数组是可以用指针p来表示的
实际上,传参时,也确实是把它当成一个指针来传递的,传递的就是一个首地址,所以你用sizeof求的值,就是指针长度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-16 22:41:13 | 显示全部楼层

谢谢回复,那么是不是通过函数传递的数组,没法通过sizeof求长度呢?
有没有其他方法,求出其长度。
谢谢!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-16 22:54:10 | 显示全部楼层
求长度,呃,实际上用不着求长度啊
你写函数的时候,自己带着长度就行了呗
比如void func(int *a,int b);
调用时直接func(a,10);
如果调用的地方多程序需要修改长度,直接在开关宏定义一下
#define len 10
func(a,len);调用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-17 08:23:44 | 显示全部楼层
winddyj 发表于 2011-6-16 22:54
求长度,呃,实际上用不着求长度啊
你写函数的时候,自己带着长度就行了呗
比如void func(int *a,int b);

恩好的  谢谢回复~~祝开心快乐~!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-17 09:32:10 | 显示全部楼层
1.数组并不等于指针,2楼说得并不正确。(不过数组名常常会转化为指针)
2.函数参数里的数组名会退化为指针,所以一般要向函数传一个数组的时候需要传递一个数组名(其实会被转化为指针),再传一个int表示数组的长度。
3.非常规做法也可以传递一个指向整个数组的指针,程序如下:
#include<stdio.h>
void fun( int (*p)[5] );
int main(){
        int a[5]={1,2,3,4,5};
        fun(&a);
}

void fun( int (*p)[5] ){
        int i;
        for(i=0;i<sizeof(*p)/sizeof(int);++i)
                printf("%d\n",(*p)[i]);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-17 13:05:50 | 显示全部楼层
仰望天上的光 发表于 2011-6-17 09:32
1.数组并不等于指针,2楼说得并不正确。(不过数组名常常会转化为指针)
2.函数参数里的数组名会退化为指针 ...
void fun( int (*p)[5] ){
int i;
for(i=0;i<sizeof(*p)/sizeof(int);++i)
printf("%d\n",(*p)[i]);
}
谢谢你的回答,还是有一点想问问。
这条语句: void fun(int (*p)[5])
这里已经给出了数组的长度,【5】。
在数组长度修改的情况修下,不就不适用了吗?  怎么解决呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-20 00:29:50 | 显示全部楼层
小飞侠 发表于 2011-6-17 13:05
谢谢你的回答,还是有一点想问问。
这条语句: void fun(int (*p)[5])
这里已经给出了数组的长度,【5】 ...

用字符处理函数 strlen() 吧

#include <stdio.h>
#include <windows.h>
int main()
{
    int i;
    char test[]="lovmengx";
    i=strlen(test);
    printf("test字符串元素数【%d】不包含【/0】\n\n",i);
    system("pause");
    return 0;
}

程序输出:
test字符串元素数【8】不包含【/0】
请按任意键继续. . .
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-20 00:30:50 | 显示全部楼层
用字符处理函数 strlen() 吧
#include <stdio.h>
#include <windows.h>
int main()
{
    int i;
    char test[]="lovmengx";
    i=strlen(test);
    printf("test字符串元素数【%d】不包含【/0】\n\n",i);
    system("pause");
    return 0;
}


程序输出:
test字符串元素数【8】不包含【/0】
请按任意键继续. . .
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-20 11:44:56 | 显示全部楼层
谢谢你的回答,还是有一点想问问。
这条语句: void fun(int (*p)[5])
这里已经给出了数组的长度,【5】。
在数组长度修改的情况修下,不就不适用了吗?  怎么解决呢?

解决办法就是不用数组,而用指针。C语言中使用数组在编译前必须知道数组的长度。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-20 11:58:17 | 显示全部楼层
Love 梦想 发表于 2011-6-20 00:29
用字符处理函数 strlen() 吧

#include

恩 谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-20 11:59:23 | 显示全部楼层
仰望天上的光 发表于 2011-6-20 11:44
解决办法就是不用数组,而用指针。C语言中使用数组在编译前必须知道数组的长度。

好的 谢谢回答 !我好好研究下!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-10 14:16:58 | 显示全部楼层
这个不知道是什么无奈啊!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-2-7 10:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表