[英]What is the C-language statement for function returning a pointer to an array?
接受指向字符的指针作为参数并返回指向整数数组的指针的函数的C代码是什么?
我在这里很困惑。 我的回答如下:
int * q (char *) [ ]
我不确定我是否正确。 但是,如果答案不正确,那么正确答案是什么?更重要的是,答案是什么。 总的来说,我会喜欢任何通用的方法来学习解释此类问题并将其转换为C代码?
处理函数时,基本上需要将数组视为指针,因为很难(如果可能)在函数中传递或返回数组,并使sizeof
运算符之类的操作仍按预期运行。
就您的目的而言,尽管您无法以这种方式知道返回数组的长度,但int ** q (char *)
足够。
我想我知道您的困惑在哪里,并且我不确定是否已根据您选择的答案消除了困惑。 int **q (char *)
是一个返回指向int的指针的函数,如果这是您的需要,那很好,但是请理解,函数可以返回指向int的指针的唯一方法是if (1)将int数组的地址(指向数组的指针)作为参数传递给q
,或者(2),在q
中分配指针,并返回指向已分配指针的指针 。
您似乎想要(1),但已选择(2)的答案。 看一看cdecl.org(C声明工具) ,它总是可以帮助解密声明
帮助您解决问题的最佳方法可能是每个示例。 下面的实施例只是起着上的字符变量的ASCII值c
(ASCII '5'
由缺省-十进制53
)。 在第一种情况下,返回一个指向int的指针(它是指向包含零个或多个整数的内存块的指针)。 例如,这里分配了一块内存来容纳53
整数,这些整数填充了53-105
值:
#include <stdio.h>
#include <stdlib.h>
int *q (char *c)
{
int *a = calloc (*c, sizeof *a);
if (a)
for (int i = 0; i < (int)*c; i++)
a[i] = *c + i;
return a;
}
int main (int argc, char **argv) {
char c = argc > 1 ? *argv[1] : '5';
int *array = NULL;
if ((array = q (&c)))
for (int i = 0; i < (int)c; i++)
printf ("array[%3d] : %d\n", i, array[i]);
free (array); /* don't forget to free mem */
return 0;
}
现在,在第二种情况下,您将返回一个指针到整数的指针(指向内存块的指针,该内存块包含零个或多个指向int的指针 -依次可分别分配每个指针以容纳零个或多个整数)每)。 在这种情况下,将为每个单独的指针分配空间以容纳一个int
并分配与上述相同的值:
#include <stdio.h>
#include <stdlib.h>
int **q (char *c)
{
int **a = calloc (*c, sizeof *a); /* allocate *c pointers to int */
if (a) {
for (int i = 0; i < (int)*c; i++)
if ((a[i] = calloc (1, sizeof **a))) /* alloc 1 int per-pointer */
*(a[i]) = *c + i;
else {
fprintf (stderr, "error: memory exhausted.\n");
break;
}
}
return a;
}
int main (int argc, char **argv) {
char c = argc > 1 ? *argv[1] : '5';
int **array = NULL;
if ((array = q (&c)))
for (int i = 0; i < (int)c; i++) {
printf ("array[%3d] : %d\n", i, *(array[i]));
free (array[i]); /* free individually allocated blocks */
}
free (array); /* don't forget to free pointers */
return 0;
}
使用/输出示例
在每种情况下,如果没有参数传递给程序,则默认输出为:
$ ./bin/qfunction2
array[ 0] : 53
array[ 1] : 54
array[ 2] : 55
...
array[ 50] : 103
array[ 51] : 104
array[ 52] : 105
现在,您似乎很想知道您想要的是返回整数数组的指针,现在还不清楚这两种情况中的哪一种。 当我开始最后一个答案时,您不能返回一个数组 ,您只能返回一个指针 ,但是该指针可以指向一个可以容纳多个整数的内存块,或者可以指向一个包含多个指针的内存块可以依次分配每个值以容纳多个整数。
因此,歧义出现在“您是否要返回指向整数 数组或指针数组的位置 ?”中。 int *q (char *)
用于第一个, int **q (char*)
用于第二个。
现在,继续前进,您将意识到您没有提供一种方法来知道要返回多少个整数(或指针)。 (至少需要一个额外的参数或全局变量(已终止))。 那再留一天。 (这也是为什么这些示例使用ASCII值53
或第一个参数的第一个字符是任意字符的原因,它提供了一个固定值来知道已分配的内容)
我们很乐意提供进一步的帮助,但对于您要完成的工作,我需要澄清一下。
指向整数数组的指针如下所示:
int (*p)[];
在方括号内有一个尺寸是可选的。
因此,返回的函数如下所示:
int (*func(char *))[];
请注意,“指向数组的指针”与“指向数组的第一个元素的指针”不同。 有时人们说前者是指后者。 如果您实际上是指后者,那么您的功能可能会更简单:
int **func(char *);
第一种形式很少使用,因为除了将返回值衰减为int **
之外,您别无其他对返回值的处理。 如果函数总是要返回一个指向固定大小缓冲区的指针,则指定尺寸有时会很有用,但是在那种情况下,我建议使用typedef来提高可读性:
typedef int ARR_4_INT[4];
ARR_4_INT * func(char *);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.