求数组的长度——函数调用咋不行哈【我太菜了描述不好<相信你们应该能理解】

C语言 码拜 10年前 (2015-05-11) 1081次浏览 0个评论
#include<stdio.h>

	int L(int *t);

int main(void)
{

	int l,len;
	int a[]={1,2,3,4,5,9};

	len=sizeof(a);//sizeof(a[0]);

	l=L(a);

	printf("%d\n%d\n",l,len);

	return 0;
}

int L(int *t)
{

	return sizeof(*t);//sizeof(t[0]));

}
数组名a在不同的场合中表示的意义不同,比较普遍的是表示数组首元素的指针,即a表示&a[0]; 另外很固定的场合是&a 和sizeof(a),a表示整个数组。

因此,代码第七行len得到了整个数组的字节数。
而下一行向L函数传递的是首元素的指针&a[0], 函数实参t指向了首元素a[0],函数中sizeof(*t)得到是首元素a[0]的字节数。

关于数组名的语义不同是C语言的难点,【C与指针】讲解的很好

你讲的 我能理解
但我想知道能否通过函数调用也可以去实现求数组的长度————能不能
谢谢啦
40分
引用 2 楼 u013966434 的回复:

你讲的 我能理解
但我想知道能否通过函数调用也可以去实现求数组的长度————能不能
谢谢啦

把数组地址传给函数在函数里面是无法计算出数组大小的,因为函数的形参不管定义成数组或者指针,其本质都是指针,所以在函数里面用sizeof计算出来的是指针的大小,而不是数组的大小。

引用 2 楼 u013966434 的回复:

你讲的 我能理解
但我想知道能否通过函数调用也可以去实现求数组的长度————能不能
谢谢啦

一般这样,void fun(int *arr, int n);     //n是数组的大小

当然可以的啊。。
len = sizeof(a) / sizeof(&a[0])
数组作为参数传递给函数退化为指针,所以无法用函数来求数组的长度。
引用 6 楼 mingliang37 的回复:

数组作为参数传递给函数退化为指针,所以无法用函数来求数组的长度。

终于有人懂我的意思了————————-你能确定不行

正规的C语言 对于int L(int *t)是绝对不可能获得t数组的长度的。

在C实现中,只能用替代办法。

C++中的数组不记录数组长度的,通常想把一个数组传入函数,还需要传入这个数组的长度

除非你自己写一个类来管理,类似标准模板库中的string类管理char数组

# include <stdio.h>

int n;

void f (int a [n]);

int main (void)
{
    int a [n = 3];
    a [0] = 1;
    a [1] = 3;
    a [2] = 5;
    f (a);
}

void f (int a [n])
{
    /*
    **在这里,a依然被转换为指针,但传递进来的n可以使用。
    **数组的大小在它在存续期间不会改变,即使改变了n的值。
    */
    while (n --)
        printf ("%d\n", a [n]);
}
纠正一下措辞,不是传进来的喔。
只能传数组地址,函数是求不出来长度的。
引用 10 楼 sholber 的回复:
# include <stdio.h>

int n;

void f (int a [n]);

int main (void)
{
    int a [n = 3];
    a [0] = 1;
    a [1] = 3;
    a [2] = 5;
    f (a);
}

void f (int a [n])
{
    /*
    **在这里,a依然被转换为指针,但传递进来的n可以使用。
    **数组的大小在它在存续期间不会改变,即使改变了n的值。
    */
    while (n --)
        printf ("%d\n", a [n]);
}

是C10的新特性?C89和C99里没有吧?

引用 13 楼 cao_julians 的回复:
Quote: 引用 10 楼 sholber 的回复:
# include <stdio.h>

int n;

void f (int a [n]);

int main (void)
{
    int a [n = 3];
    a [0] = 1;
    a [1] = 3;
    a [2] = 5;
    f (a);
}

void f (int a [n])
{
    /*
    **在这里,a依然被转换为指针,但传递进来的n可以使用。
    **数组的大小在它在存续期间不会改变,即使改变了n的值。
    */
    while (n --)
        printf ("%d\n", a [n]);
}

是C10的新特性?C89和C99里没有吧?

C99的,不过跟你的问题关系不大,我写着玩的。

引用 7 楼 u013966434 的回复:
Quote: 引用 6 楼 mingliang37 的回复:

数组作为参数传递给函数退化为指针,所以无法用函数来求数组的长度。

终于有人懂我的意思了————————-你能确定不行

C里面真不行

# include <stdio.h>

void f (int a [])
{
    printf ("%d\n", * a);
    printf ("%d\n", a [1]);
}

int main (void)
{
    /* 俺决定用数组第一个元素来存放数组大小,嘎嘎!*/
    int a [3] = {sizeof a,};
    f (a);
}

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明求数组的长度——函数调用咋不行哈【我太菜了描述不好<相信你们应该能理解】
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!