C 使用指针记录和打印数组
我对编码还不熟悉,开始学习指针,我被一个问题困住了 如何获取数组输入并使用指针打印相同的数组 如果您能指导我如何将变量从函数传递到main(),那也太好了。 谢谢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
#包括
#包括
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
只打印数组,不返回任何内容(它不应该返回任何内容),因此它应该是typevoid
,例如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;