给定一个数组p [5],写一个函数将它向左移动两个位置。因此,如果p [0] = 15,p [1] = 30,p [2] = 28,p [3] = 19且p [4] = 61,则在移位p [0] = 28之后,p [ 1] = 19,p [2] = 61,p [3] = 15且p [4] = 30.将此函数调用为(4 x 5)矩阵并使其行向左移位2。
以下是我到目前为止所拥有的代码,但它无效。问题在于,由于辅助函数采用参数int *
,因此它不会在主函数中使用数组,因此它不能正确执行。虽然编译得很好。
#include<stdio.h>
void moveLeft2(int p[5])
{
int temp1 = p[0];
int temp2 = p[1];
for(int i = 0; i < 5 - 2; i++)
{
p[i] = p[i + 2];
}
p[3] = temp1;
p[4] = temp2;
}
int main()
{
int p[4][5] = {
{15,30,28,19,61},
{1,2,3,4,5},
{6,7,8,9,20},
{11,12,13,14,15}};
int i;
moveLeft2(p);
return 0;
}
有人可以帮忙吗?
答案 0 :(得分:1)
void moveLeft2(int p[5])
该声明实际上是一个谎言。这意味着什么
void moveLeft2(int *p)
即。传递给moveLeft2
的参数应该是指向int
的指针。该实现假定指针指向一个足够大的内存块,以容纳五个int
s,这不是由类型强制执行,因此不安全,但重要的一点是函数参数必须具有类型{{ 1}}。
如果你有
int*
即使在最高警告级别,编译器也不会发出警告。这是因为当数组传递给函数时,数组被转换为指向第一个元素的指针(在大多数其他上下文中;数组不转换为指向第一个元素的指针作为{{1的参数}},int row[5] = {1,2,3,4,5};
moveLeft2(row);
和sizeof
[地址]运算符)。因此传递的参数具有所需的类型。
声明
_Alignof
将&
声明为4个数组的数组,每个数组包含5个int p[4][5] = {...};
个。 p
是int
中的第一个,所以
p[0]
是一个类型正确的函数调用(数组int[5]
被转换为指向其第一个元素的指针,即moveLeft2(p[0]);
)。数组p[0]
是一个包含五个&p[0][0]
的数组,因此满足p[0]
实现中的假设,并且调用不仅类型正确,而且语义正确。 / p>
对于数组(数组)int
的其他行也是如此,因此
moveLeft2
一个接一个地移动所有四行。
答案 1 :(得分:0)
<强>替换:强>
void moveLeft2(int p[5])
与void moveLeft2(int *p)
moveLeft2(p);
与moveLeft2(p[i]);
for (i = 0; i < 4; i ++)
moveLeft2(p[i]);
<强>代码:强>
#include<stdio.h>
void moveLeft2(int *p)
{
int temp1 = p[0];
int temp2 = p[1];
int i;
for(i = 0; i < 5 - 2; i++)
{
p[i] = p[i + 2];
}
p[3] = temp1;
p[4] = temp2;
}
int main()
{
int p[4][5] = {
{15,30,28,19,61},
{1,2,3,4,5},
{6,7,8,9,20},
{11,12,13,14,15}};
int i;
for (i = 0; i < 4; i ++)
moveLeft2(p[i]);
return 0;
}