使用C返回数组

使用C返回数组

我对C比较陌生,我需要一些处理数组的方法的帮助。来自Java编程,我习惯于说int [] method()以返回数组。但是,我发现在使用C时,在返回数组时必须使用指针。作为一个新的程序员,我真的一点也不明白这一点,即使我已经浏览了许多论坛。

基本上,我试图编写一个在C中返回char数组的方法。我将为该方法提供一个数组(让我们将其称为返回数组)。它将从前一个数组创建一个新数组,并返回指向该数组的指针。我只需要一些帮助,如何开始这一点,以及如何读取指针,一旦它被发送出数组。任何解释这一点的帮助都是非常感谢的。

阵列返回函数的编码格式

char *returnArray(char array []){
 char returned [10];
 //methods to pull values from array, interpret them, and then create new array
 return &(returned[0]); //is this correct?}

函数调用方

int main(){
 int i=0;
 char array []={1,0,0,0,0,1,1};
 char arrayCount=0;
 char* returnedArray = returnArray(&arrayCount); ///is this correct?
 for (i=0; i<10;i++)
  printf(%d, ",", returnedArray[i]);  //is this correctly formatted?}

我还没有测试这一点,因为我的C编译器目前还没有工作,但是我想弄清楚这一点。


呼如林
浏览 659回答 3
3回答

九州编程

C对数组的处理是非常与Java不同,您将不得不相应地调整您的思维。C中的数组不是一流的对象(也就是说,数组表达式在大多数上下文中不保留它的“数组性”)。在C中,“N元素数组”类型的表达式T将隐式转换(“衰变”)为“类型”的表达式。T“,除非数组表达式是sizeof或一元&运算符,或者如果数组表达式是字符串文本,则用于初始化声明中的另一个数组。除其他外,这意味着不能将数组表达式传递给函数并使其收到。作为数组类型;该函数实际上接收指针类型:void&nbsp;foo(char&nbsp;*a,&nbsp;size_t&nbsp;asize){ &nbsp;&nbsp;//&nbsp;do&nbsp;something&nbsp;with&nbsp;a}int&nbsp;bar(void){ &nbsp;&nbsp;char&nbsp;str[6]&nbsp;=&nbsp;"Hello"; &nbsp;&nbsp;foo(str,&nbsp;sizeof&nbsp;str);}在呼唤foo,表达str从类型转换为char [6]到char *的第一个参数foo宣告char *a而不是char a[6]..在……里面sizeof str,因为数组表达式是sizeof运算符,它没有转换为指针类型,因此您可以获得数组(6)中的字节数。如果你真的有兴趣,你可以读丹尼斯·里奇的C语言的发展来了解这种治疗的来源。结果是函数不能返回数组类型,这很好,因为数组表达式也不能作为分配的目标。最安全的方法是调用方定义数组,并将其地址和大小传递给应该写入的函数:void&nbsp;returnArray(const&nbsp;char&nbsp;*srcArray,&nbsp;size_t&nbsp;srcSize,&nbsp;char&nbsp;*dstArray,&nbsp;char&nbsp;dstSize){ &nbsp;&nbsp;... &nbsp;&nbsp;dstArray[i]&nbsp;=&nbsp;some_value_derived_from(srcArray[i]); &nbsp;&nbsp;...}int&nbsp;main(void){ &nbsp;&nbsp;char&nbsp;src[]&nbsp;=&nbsp;"This&nbsp;is&nbsp;a&nbsp;test"; &nbsp;&nbsp;char&nbsp;dst[sizeof&nbsp;src]; &nbsp;&nbsp;... &nbsp;&nbsp;returnArray(src,&nbsp;sizeof&nbsp;src,&nbsp;dst,&nbsp;sizeof&nbsp;dst); &nbsp;&nbsp;...}另一种方法是函数动态分配数组并返回指针和大小:char&nbsp;*returnArray(const&nbsp;char&nbsp;*srcArray,&nbsp;size_t&nbsp;srcSize,&nbsp;size_t&nbsp;*dstSize){ &nbsp;&nbsp;char&nbsp;*dstArray&nbsp;=&nbsp;malloc(srcSize); &nbsp;&nbsp;if&nbsp;(dstArray) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;*dstSize&nbsp;=&nbsp;srcSize; &nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;&nbsp;} &nbsp;&nbsp;return&nbsp;dstArray;}int&nbsp;main(void){ &nbsp;&nbsp;char&nbsp;src[]&nbsp;=&nbsp;"This&nbsp;is&nbsp;a&nbsp;test"; &nbsp;&nbsp;char&nbsp;*dst; &nbsp;&nbsp;size_t&nbsp;dstSize; &nbsp;&nbsp;dst&nbsp;=&nbsp;returnArray(src,&nbsp;sizeof&nbsp;src,&nbsp;&dstSize); &nbsp;&nbsp;... &nbsp;&nbsp;free(dst); &nbsp;&nbsp;...}在这种情况下,调用方负责使用free图书馆功能。请注意dst在上面的代码中,有一个简单的指针指向char,而不是指向char..C的指针和数组语义使您可以应用下标运算符[]数组类型的表达式。或指针类型src[i]和dst[i]将访问i数组的第四个元素(即使只有src有数组类型)。你,你们能,会,可以声明指向N元素数组的指针。T做一些类似的事情:char&nbsp;(*returnArray(const&nbsp;char&nbsp;*srcArr,&nbsp;size_t&nbsp;srcSize))[SOME_SIZE]{ &nbsp;&nbsp;char&nbsp;(*dstArr)[SOME_SIZE]&nbsp;=&nbsp;malloc(sizeof&nbsp;*dstArr); &nbsp;&nbsp;if&nbsp;(dstArr) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;&nbsp;&nbsp;&nbsp;(*dstArr)[i]&nbsp;=&nbsp;...; &nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;&nbsp;} &nbsp;&nbsp;return&nbsp;dstArr;}int&nbsp;main(void){ &nbsp;&nbsp;char&nbsp;src[]&nbsp;=&nbsp;"This&nbsp;is&nbsp;a&nbsp;test"; &nbsp;&nbsp;char&nbsp;(*dst)[SOME_SIZE]; &nbsp;&nbsp;... &nbsp;&nbsp;dst&nbsp;=&nbsp;returnArray(src,&nbsp;sizeof&nbsp;src); &nbsp;&nbsp;... &nbsp;&nbsp;printf("%c",&nbsp;(*dst)[j]); &nbsp;&nbsp;...}以上几个缺点。首先,C的旧版本期望SOME_SIZE要成为编译时常量,意味着该函数只能使用一个数组大小。其次,在应用下标之前,必须取消指针的引用,这会使代码混乱。当您处理多维数组时,指向数组的指针工作得更好。

鸿蒙传说

这个美妙的邪恶实现如何?数组h#define&nbsp;IMPORT_ARRAY(TYPE)&nbsp;&nbsp;&nbsp;&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;\struct&nbsp;TYPE##Array&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;TYPE*&nbsp;contents;&nbsp;&nbsp;&nbsp;&nbsp;\&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;size;&nbsp;&nbsp;&nbsp;&nbsp;\};&nbsp;&nbsp;&nbsp;&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;\struct&nbsp;TYPE##Array&nbsp;new_##TYPE##Array()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;TYPE##Array&nbsp;a;&nbsp;&nbsp;&nbsp;&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;a.contents&nbsp;=&nbsp;NULL;&nbsp;&nbsp;&nbsp;&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;a.size&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;\&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;a;&nbsp;&nbsp;&nbsp;&nbsp;\}&nbsp;&nbsp;&nbsp;&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;\void&nbsp;array_add(struct&nbsp;TYPE##Array*&nbsp;o,&nbsp;TYPE&nbsp;value)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;TYPE*&nbsp;a&nbsp;=&nbsp;malloc((o->size&nbsp;+&nbsp;1)&nbsp;*&nbsp;sizeof(TYPE));&nbsp;&nbsp;&nbsp;&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;TYPE&nbsp;i;&nbsp;&nbsp;&nbsp;&nbsp;\&nbsp;&nbsp;&nbsp;&nbsp;for(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;o->size;&nbsp;++i)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[i]&nbsp;=&nbsp;o->contents[i];&nbsp;&nbsp;&nbsp;&nbsp;\&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;\&nbsp;&nbsp;&nbsp;&nbsp;++(o->size);&nbsp;&nbsp;&nbsp;&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;a[o->size&nbsp;-&nbsp;1]&nbsp;=&nbsp;value;&nbsp;&nbsp;&nbsp;&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;free(o->contents);&nbsp;&nbsp;&nbsp;&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;o->contents&nbsp;=&nbsp;a;&nbsp;&nbsp;&nbsp;&nbsp;\}&nbsp;&nbsp;&nbsp;&nbsp;\void&nbsp;array_destroy(struct&nbsp;TYPE##Array*&nbsp;o)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;free(o->contents);&nbsp;&nbsp;&nbsp;&nbsp;\}&nbsp;&nbsp;&nbsp;&nbsp;\ TYPE*&nbsp;array_begin(struct&nbsp;TYPE##Array*&nbsp;o)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;o->contents;&nbsp;&nbsp;&nbsp;&nbsp;\}&nbsp;&nbsp;&nbsp;&nbsp;\ TYPE*&nbsp;array_end(struct&nbsp;TYPE##Array*&nbsp;o)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;o->contents&nbsp;+&nbsp;o->size;&nbsp;&nbsp;&nbsp;&nbsp;\}主.c#include&nbsp;<stdlib.h>#include&nbsp;"array.h"IMPORT_ARRAY(int);struct&nbsp;intArray&nbsp;return_an_array()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;intArray&nbsp;a; &nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;new_intArray(); &nbsp;&nbsp;&nbsp;&nbsp;array_add(&a,&nbsp;1); &nbsp;&nbsp;&nbsp;&nbsp;array_add(&a,&nbsp;2); &nbsp;&nbsp;&nbsp;&nbsp;array_add(&a,&nbsp;3); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;a;}int&nbsp;main()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;intArray&nbsp;a; &nbsp;&nbsp;&nbsp;&nbsp;int*&nbsp;it; &nbsp;&nbsp;&nbsp;&nbsp;int*&nbsp;begin; &nbsp;&nbsp;&nbsp;&nbsp;int*&nbsp;end; &nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;return_an_array(); &nbsp;&nbsp;&nbsp;&nbsp;begin&nbsp;=&nbsp;array_begin(&a); &nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;=&nbsp;array_end(&a); &nbsp;&nbsp;&nbsp;&nbsp;for(it&nbsp;=&nbsp;begin;&nbsp;it&nbsp;!=&nbsp;end;&nbsp;++it)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d&nbsp;",&nbsp;*it); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;array_destroy(&a); &nbsp;&nbsp;&nbsp;&nbsp;getchar(); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}
打开App,查看更多内容
随时随地看视频慕课网APP