C 使用指针记录和打印数组

C 使用指针记录和打印数组,c,pointers,C,Pointers,我对编码还不熟悉,开始学习指针,我被一个问题困住了 如何获取数组输入并使用指针打印相同的数组 如果您能指导我如何将变量从函数传递到main(),那也太好了。 谢谢 #包括 #包括 int*记录_数组(int*大小_ptr); int*打印数组(int*数组ptr[],int*大小ptr); int*记录\u数组(int*大小\u ptr) { int*array_ptr=(int*)malloc(*size_ptr*sizeof(int)); 对于(int index=0;index

我对编码还不熟悉,开始学习指针,我被一个问题困住了

如何获取数组输入并使用指针打印相同的数组

如果您能指导我如何将变量从函数传递到main(),那也太好了。 谢谢

#包括
#包括
int*记录_数组(int*大小_ptr);
int*打印数组(int*数组ptr[],int*大小ptr);
int*记录\u数组(int*大小\u ptr)
{
int*array_ptr=(int*)malloc(*size_ptr*sizeof(int));
对于(int index=0;index<*size\u ptr;++index)
{
printf(“在索引%d处输入元素”,索引);
scanf(“%d”、&array_ptr[index]);
}
返回数组\u ptr;
}
int*打印数组(int*数组ptr[],int*大小ptr)
{
对于(int index=0;index<*size\u ptr;++index)
{
printf(“%d”,数组_ptr[index]);
}
int*pass=array_ptr;
回程通行证;
}
int main()
{
int size=0;
printf(“您需要多少元素?”);
scanf(“%d”,大小(&S);
记录\u数组(&大小);
打印阵列(&array\U ptr,&size);
免费(通行证);
返回0;
}

您很接近,但您在
int*print\u array(int*array\u ptr[],int*size\u ptr)中使用了
int*array\u ptr[]
不正确。您在
main()
中没有指针来保存
int*record\u array(int*size\u ptr)
返回的地址,以便在
main()
free
中不再需要时使用
print\u array
只打印数组,不返回任何内容(它不应该返回任何内容),因此它应该是type
void
,例如
void print\u array(int*array\u ptr,int*size\u ptr)

在访问时(根据此处不相关的4个异常),数组被转换为指向第一个元素的指针。如果要传递数组,只需将数组作为参数传递,它就会自动转换为指针

另外注意,整个代码中没有数组。声明一个指针,然后分配一块内存来保存整数值,并将该块的起始地址分配给指针。(例如,指针将分配块的起始地址作为其值,它“指向”该内存块)

首先,在
main()
中,您需要一个指针来保存
record\u array
返回的地址,例如

    int size = 0;
    int *array = NULL;  /* you need a pointer to hold the address of your array */
    if ((array = record_array (&size))) {   /* validate record_array succeeds */
        print_array (array, &size);         /* print array */
        free (array);                       /* free array */
    }
record\u array
(以及对于每个分配),您必须检查
malloc()
的返回以验证它是否成功,例如

int *record_array (int *size_ptr)
{
    int *array_ptr = malloc (*size_ptr * sizeof *array_ptr);

    if (!array_ptr) {   /* validate EVERY allocation */
        perror ("malloc-array_ptr");
        return NULL;
    }
    ...        
注意:使用取消引用的指针来设置分配的类型大小。使用取消引用指针——您永远不会出错。在C中,不需要强制转换malloc的返回,这是不必要的。请参阅:)

对于输入,您必须验证每个输入,例如在
record\u array()
中:

    for (int index = 0; index < *size_ptr; index++)
    {
        printf ("Enter element at index %d: ", index);
        if (scanf ("%d", &array_ptr[index]) != 1) {
            fputs ("error: invalid integer input.\n", stderr);
            return NULL;
        }

    }
(这只是说如果从
scanf()
返回的不是
1
——处理错误——在这种情况下返回失败(或
NULL

最后,在
main()

    int size = 0;
    int *array = NULL;  /* you need a pointer to hold the address of your array */
    if ((array = record_array (&size))) {   /* validate record_array succeeds */
        print_array (array, &size);         /* print array */
        free (array);                       /* free array */
    }
(这个比较是:
if((array=record\u array(&size))!=NULL){…
。您可以单独完成分配,例如
array=record\u array(&size);
然后
if(array!=NULL){…
只要您验证返回值
:)

进行这些更正(并在提示中提供一个空格以分隔提示和输入),您将:

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

int *record_array (int *size_ptr);
void print_array (int *array_ptr, int *size_ptr);


int *record_array (int *size_ptr)
{
    int *array_ptr = malloc (*size_ptr * sizeof *array_ptr);

    if (!array_ptr) {   /* validate EVERY allocation */
        perror ("malloc-array_ptr");
        return NULL;
    }

    for (int index = 0; index < *size_ptr; index++)
    {
        printf ("Enter element at index %d: ", index);
        if (scanf ("%d", &array_ptr[index]) != 1) {
            fputs ("error: invalid integer input.\n", stderr);
            return NULL;
        }

    }
    return array_ptr;
}

void print_array (int *array_ptr, int *size_ptr)
{
    for (int index = 0; index < *size_ptr; index++)
        printf ("%d ",array_ptr[index]);

    putchar ('\n');     /* tidy up with newline */
}

int main()
{
    int size = 0;
    int *array = NULL;  /* you need a pointer to hold the address of your array */

    printf("How many elements do you want? ");
    if (scanf("%d", &size) != 1) {          /* validate EVERY input */
        fputs ("error: invalid integer input.\n", stderr);
        return 1;
    }

    if ((array = record_array (&size))) {   /* validate record_array succeeds */
        print_array (array, &size);         /* print array */
        free (array);                       /* free array */
    }
}
请注意,
“*”
与声明一起使用的是变量,而不是类型。为什么?可读性。请参见:

int* a, b, c;
它当然不会声明指向
int
的三个指针,而是声明指向
int
的一个指针和两个整数:

int *a, b, c;
这点很清楚


请仔细查看,如果您还有其他问题,请告诉我。

首先,请了解在访问时(根据此处不相关的4个例外情况),数组将转换为指向第一个元素的指针,在您的情况下,参数
int*array\u ptr[]
请求一个指向
int
的指针数组,你只需要
int*array\u ptr
…在C语言中,没有必要抛出
malloc
的返回值,这是不必要的。请参阅:当然,你坚持什么观点,我很乐意进一步解释。还有一些提供指针基本讨论的链接可能会有所帮助。我是stuck在这部分`如果(scanf(“%d”,&size)!=1){/*验证每个输入*/fputs(“错误:无效的整数输入。\n”,stderr);返回1;}`当然,我会编辑并扩展答案,但验证的基本思想是(1)做一些可能失败的事情(2)检查它是否工作或(3)处理错误。这就是每次验证中发生的情况。@Kakshipth-查看添加是否有帮助。如果没有,请告诉我您仍在哪个点上不清楚,我将重试。另外请注意
main()
中使用
return 1;
相当于使用
exit(exit\u失败)
在C中,有两个退出代码定义用于返回shell,
exit_SUCCESS
0
exit_FAILURE
1
。这就是
1
scanf()事件中从
main()
返回的原因< RaveDunSnH13没有专家,但我开始在C/C++中编码,在80中(当C++没有比C的超级集合多)和Fortran代码——在使用软盘和穿孔卡片阅读器都已经消失之后,我们都记得8。“Floppie是对的?所以虽然我不是专家,但我通常知道应该看标准的哪一部分来找到答案(一两个
:)
int *a, b, c;