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

标签 c pointers

#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/

相关文章:

c - 如何将未知类型的指针传递给函数?

c - 遍历c中的字符串数组

c - 指向指针的指针在树复制算法中不起作用

c++ - 这是内存泄漏吗?

c - Swift调用C API时如何处理指针

c - Atmel C 引脚操作宏

c - 关于strcpy溢出的问题

python - 如何将双指针 c 类型转换为 numpy 数组?

c - 函数指针变量

c - 从函数返回指针(变量在函数中声明)