2012-11-28 68 views
-1

给定一个数组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个元素左移的4x5矩阵中的行

以下是我迄今为止的代码,但它不起作用。用的是问题是,由于辅助功能需要一个参数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

它有什么问题?编译错误?阵列中有什么?定义问题。 –

+0

你有一个功能来移动/旋转一行。循环遍历各行并自行移动。 –

+0

问题在于,由于辅助函数接受了一个参数int *,所以它不会在主函数中使用该数组,因此它没有正确执行。它虽然编译好。 – user1850397

回答

1
void moveLeft2(int p[5]) 

该声明实际上是一个谎言。它的意思是

void moveLeft2(int *p) 

即传递给moveLeft2应是指向int的说法。该实现假定指针指向的内存块足够大以容纳五个int,这不是由该类型强制实施的,因此不安全,但重要的一点是函数参数必须具有类型int*

如果你有

int row[5] = {1,2,3,4,5}; 
moveLeft2(row); 

编译器不会发出警告,即使是在最高警戒线。这是因为当数组传递给函数时(以及在大多数其他上下文中;数组被而不是转换为指向它们的第一个元素的指针作为参数sizeof,_Alignof& [地址]运营商)。所以传递的参数具有所需的类型。

声明

int p[4][5] = {...}; 

声明p为4个阵列的5 int s各自的阵列。 p[0]是第一这些int[5],所以

moveLeft2(p[0]); 

是类型正确的函数调用(在阵列p[0]被转换为一个指向它的第一个元素,这是&p[0][0])。数组p[0]是一个由5个int组成的数组,因此moveLeft2的实现中的假设得到满足,并且该调用不仅是类型正确的,而且在语义上也是正确的。

这同样适用于所述阵列(阵列)p的其它行,因此

for(i = 0; i < 4; ++i) { 
    moveLeft2(p[i]); 
} 

移位所有四行,一前一后。

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