Arrays 为什么程序显示通过';参数1的警告;通函WAP';从不带强制转换的整数生成指针?

Arrays 为什么程序显示通过';参数1的警告;通函WAP';从不带强制转换的整数生成指针?,arrays,c,function,pointers,Arrays,C,Function,Pointers,我正在研究这个问题: Given an array p[5], write a function to shift it circularly left by two positions. Thus, if p[0] = 15, p[1]= 30, p[2] = 28, p[3]= 19 and p[4] = 61 then after the shift p[0] = 28, p[1] = 19, p[2] = 61, p[3] = 15 and p[4] = 30. Call this fu

我正在研究这个问题:

Given an array p[5], write a function to shift it circularly left by two positions. Thus, if p[0] = 15, p[1]= 30, p[2] = 28, p[3]= 19 and p[4] = 61 then after the shift p[0] = 28, p[1] = 19, p[2] = 61, p[3] = 15 and p[4] = 30. Call this function for a (4 x 5 ) matrix and get its rows left shifted.
以下是我尝试的代码:

    #include <stdio.h>
    
#include <stdio.h>
void circularswap(int arr[][5],int n,int m){ int arr1[n][m],i,j;
    for (i=0;i<n;i++){
        for (j=0;j<m;j++){
            arr1[i][j]=*(*(arr+i)+j);
        }
    }
    for (i=0;i<m;i++){
        *(*(arr+i)+0)=arr1[i][2];
        *(*(arr+i)+1)=arr1[i][3];
        *(*(arr+i)+2)=arr1[i][4];
        *(*(arr+i)+3)=arr1[i][0];
        *(*(arr+i)+4)=arr1[i][1];
    }
        for (i=0;i<4;i++){
        for (j=0;j<5;j++){
            printf ("%d",arr[i][j]);
        }
        printf ("\n");
    }
}
int main(){ int i,j;
    int arr[4][5]={(15,30,28,19,61),(15,30,28,19,61),(15,30,28,19,61),(15,30,28,19,61)};
    circularswap((arr,4,5));
    return 0;
}
#包括
#包括
无效循环wap(int arr[][5],int n,int m){int arr1[n][m],i,j;

对于(i=0;i,调用函数时必须使用许多括号

表达式
(arr,4,5)
正在使用,将计算列表中的所有子表达式,但只返回
5

也就是说,您的呼叫与circularswap(5)
完全相同,这在许多方面都是不正确的

要解决您的问题,请删除内括号:

circularswap(arr,4,5);

初始化数组时也会遇到类似的问题:使用括号
()
而不是大括号
{}

因此,数组定义实际上等于:

int arr[4][5]={ { 61 }, { 61 }, { 61 }, { 61 } };
[注意在上面的示例中我是如何使用大括号的]


另一方面,对于任何指针
p
和索引
i
,表达式
*(p+i)
完全等于
p[i]
。后者更易于阅读和理解,也更易于编写


特别是在像您这样使用数组数组时,例如
*(*(arr+i)+0)
可以替换为
arr[i][0]

您声明了一个二维数组

 int arr[4][5]
因此,数组的元素依次是一维数组。如果数组元素类型为char,则可以通过初始值设定项列表或字符串文本初始化一维数组

但是,您正在使用标量类型的表达式和逗号运算符,如

(15,30,28,19,61)
表达式的值是最后一个操作数的值,即
61

int arr[4][5]=
{
    [0] = 61,
    [1] = 61,
    [2] = 61,
    [3] = 61
};
比如,引擎盖下面的那个

a[0] = 61;
也就是说,您正试图将值61分配给类型为
int[5]
的数组

您需要将列表用大括号括起来,如

int arr[4][5] =
{
    { 15, 30, 28, 19, 61 },
    { 15, 30, 28, 19, 61 },
    { 15, 30, 28, 19, 61 },
    { 15, 30, 28, 19, 61 }
};
在赋值中还写到,您需要编写一个函数,将一维数组的元素向左移动。但在您的程序中没有这样的函数

此外,您的函数
circularswap
有bug。例如,在这个循环中

for (i=0;i<m;i++){
    *(*(arr+i)+0)=arr1[i][2];
    *(*(arr+i)+1)=arr1[i][3];
    *(*(arr+i)+2)=arr1[i][4];
    *(*(arr+i)+3)=arr1[i][0];
    *(*(arr+i)+4)=arr1[i][1];
}
程序输出为

15 30 28 19 61 
15 30 28 19 61 
15 30 28 19 61 
15 30 28 19 61 

28 19 61 15 30 
28 19 61 15 30 
28 19 61 15 30 
28 19 61 15 30 

“不幸的是,这显示了警告”-你认为这些警告是什么意思?这段代码应该发出比你提到的警告多得多的警告。请查看编辑后的代码everyoneMy aplogies@WhozCraig,你能不能更正代码,因为我是编程新手?
*(*(arr+I)+j)
请忘记这一点。只需始终编写
arr[i] [j]
,谢谢!我现在使用了这段代码:这段代码现在提供了任何其他需要的更改?您能告诉我为什么我的循环没有意义吗?这是我正在谈论的代码,而不是原始版本中发布的代码question@GirGr首先,行数由变量n指定,而不是由变量m指定使用幻数4,而不是使用带有变量m的循环。
15 30 28 19 61 
15 30 28 19 61 
15 30 28 19 61 
15 30 28 19 61 

28 19 61 15 30 
28 19 61 15 30 
28 19 61 15 30 
28 19 61 15 30