如何将4x5矩阵中的行移动2个元素

时间:2012-11-28 00:45:40

标签: c arrays matrix

  

给定一个数组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;
}

有人可以帮忙吗?

2 个答案:

答案 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] = {...}; 个。 pint中的第一个,所以

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;
}