猿问

在函数中查找数组长度

在函数中查找数组长度

在数组长度以下的程序中ar主要是正确的,但在temp它显示指向ar在我的电脑上是2(单位:sizeof(int)).

#include <stdio.h>void temp(int ar[]) // this could also be declared as `int *ar`{
    printf("%d\n", (int) sizeof(ar)/sizeof(int));}int main(void){
    int ar[]={1,2,3};
    printf("%d\n", (int) sizeof(ar)/sizeof(int));
    temp(ar);
    return 0;}

我想知道如何定义函数,以便在函数中正确读取数组的长度。


冉冉说
浏览 521回答 3
3回答

MMMHUHU

没有“内置”方式来确定函数中的长度。不管你怎么通过arr,&nbsp;sizeof(arr)将始终返回指针大小。因此,最好的方法是将元素数作为单独的参数传递。或者,您可以有一个特殊的值,例如0或-1表示结束(就像它是这样的)。\0在字符串中,它们只是char [])。但当然,“逻辑”数组的大小是sizeof(arr)/sizeof(int) - 1

临摹微笑

正如其他人所说,显而易见的解决方案是将数组的长度作为参数传递,还可以在数组的开头存储此值。#include&nbsp;<stdio.h>void&nbsp;temp(int&nbsp;*ar){ &nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;ar[-1]);}int&nbsp;main(void){ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;ar[]=&nbsp;{0,&nbsp;1,&nbsp;2,&nbsp;3}; &nbsp;&nbsp;&nbsp;&nbsp;ar[0]&nbsp;=&nbsp;sizeof(ar)&nbsp;/&nbsp;sizeof(ar[0])&nbsp;-&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;ar[0]); &nbsp;&nbsp;&nbsp;&nbsp;temp(ar&nbsp;+&nbsp;1); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}

茅侃侃

不要使用函数,请为此使用宏://Adapted&nbsp;from&nbsp;K&R,&nbsp;p.135&nbsp;of&nbsp;edition&nbsp;2.#define&nbsp;arrayLength(array)&nbsp;(sizeof((array))/sizeof((array)[0]))int&nbsp;main(void){ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;ar[]={1,2,3}; &nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;arrayLength(ar)); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}您仍然不能在像您这样的函数中使用此宏。temp因为其他人提到的原因,数组作为参数传递。如果您想传递一个数据类型,可以选择定义一个同时具有数组和容量的类型:typedef&nbsp;struct{ &nbsp;&nbsp;int&nbsp;*values; &nbsp;&nbsp;int&nbsp;capacity;}&nbsp;intArray;void&nbsp;temp(intArray&nbsp;array){ &nbsp;&nbsp;printf("%d\n",&nbsp;array.capacity);}int&nbsp;main(void){ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;ar[]=&nbsp;{1,&nbsp;2,&nbsp;3}; &nbsp;&nbsp;&nbsp;&nbsp;intArray&nbsp;arr; &nbsp;&nbsp;&nbsp;&nbsp;arr.values&nbsp;=&nbsp;ar; &nbsp;&nbsp;&nbsp;&nbsp;arr.capacity&nbsp;=&nbsp;arrayLength(ar); &nbsp;&nbsp;&nbsp;&nbsp;temp(arr); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}这需要更长的时间来设置,但是如果您发现自己将它传递给许多函数,则非常有用。
随时随地看视频慕课网APP
我要回答