#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
等的操作数)。
还有比较指针的函数中的代码 - 您正在增加 p
和 a1
这使您访问超出数组的位置 - 这是未定义的行为(在您的情况下,未定义的行为结果是段错误)。您应该像这样更改这部分代码:-
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/