gpt4 book ai didi

c - 应为 ‘int *’,但参数的类型为 ‘int (*)[(long unsigned int)(n)]’

转载 作者:行者123 更新时间:2023-11-30 18:47:25 26 4
gpt4 key购买 nike

#include<stdio.h>

void convert(int *a1, int n, int *a2);

int main()
{

int n;

printf("Enter the length of the array: ");
scanf("%d", &n);

int a1[n];
int a2[n];
int i;

printf("Enter the elements of the array: ");
for(i=0; i<n; i++);
{
scanf("%d", (a1+i));
}

convert(&a1, n, &a2);

printf("Output: ");

for(i=0; i<n; i++);
printf("%d ",*(a2+i));

printf("\n");

return 0;

}

void convert(int *a1, int n, int *a2)
{
int *p;
p = a1;
while(p < a1+n)
{
*a2=(*a1+6)%10;
a1++;
a2++;
p++;
}
}

我不断收到错误消息预期为“int asterix”,但 &a1 和 &a2 的参数类型均为“int (asterix)[(long unsigned int)(n)]”。不知道为什么要这样做。该程序应该获取数组中输入的数字,然后将该数字加上 6 mod 10,然后取出转换后的数字。

最佳答案

是的,这是很常见的事情 - 如果您在数组上应用运算符的地址,将为您提供指向该数组的指针。

& 当应用于数组时,它不会转换为指向它的第一个元素的指针。那么我们得到了什么?

int a[10];&a 将具有 int(*)[10] 类型,这意味着它是一个指向包含 10 个元素的 int 数组的指针。

如果您打算在将数组传递给其他函数时更改数组,则只需传递数组本身即可。它将被转换为指向它包含的第一个元素的指针。通过访问指针,您可以对其进行更改。所以它达到了目的。

在您的情况下,调用将是

 convert(a1, n, a2);

这里数组将被转换为指针,其类型为int*.,与int (*)[]不同。编译器发现不匹配并发出提示。

<小时/>

在大多数情况下,数组会衰减为指向第一个元素的指针。 (异常(exception)情况是将其用作 &sizeof 等的操作数)。

<小时/>

还有比较指针的函数中的代码 - 您正在增加 pa1 这使您访问超出数组的位置 - 这是未定义的行为(在您的情况下,未定义的行为结果是段错误)。您应该像这样更改这部分代码:-

while(p < a1+n)
{
*a2=(*p+6)%10;
a2++;
p++;
}

但更好的是,您可以这样做来复制整个内容

memcpy(a2,a1,n*sizeof(*a1));

或者简单地

for(int i = 0; i < n; i++)
a2[i]=a1[i];

关于c - 应为 ‘int *’,但参数的类型为 ‘int (*)[(long unsigned int)(n)]’,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48844210/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com