所以我编写了一个将2D数组旋转90度的函数,我在IRC上被告知我不能通过引用传递2D数组(例如void test(char A [] [10]& ))并且我应该以通常的方式传递我的数组,但是当我这样做时,这个函数不会改变实际的数组。那么如何在函数中修改原始数组呢?
void one(char A[][10], int N)
{
char B [10][10];
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
B[j][N-i-1] = A[i][j];
A = B;
}
答案 0 :(得分:3)
A = B ;
不会将数组B的元素永久复制到A.永久更改为A
元素的分配无效。 A
在函数返回时保留原始值。您需要执行成员明智的副本,以永久性地将B
的元素复制到A
。
答案 1 :(得分:1)
当您传递一个数组(例如char A[][10]
)时,实际上是在向原始数组传递指针,因此执行A = B
会使A
指向B
并且不会更改原始数组。相反,您可以使用memcpy
等函数将B
的内容实际复制到A
:
memcpy(A, B, sizeof(B));
答案 2 :(得分:1)
阅读@FredOverflow建议链接:How do I use arrays in C++?。
要旋转90°时钟NxN阵列,您可以将任务分成两个较小的步骤:
void rot90cw(char A[][N]) {
// flip in up/down direction (swap rows)
for (int i = 0; i < N/2; i++)
std::swap_ranges(&A[i][0], &A[i][0] + N, &A[N-i-1][0]);
// transpose (swap top-right and bottom-left triangles)
for (int i = 0; i < N-1; i++)
for (int j = i+1; j < N; j++)
std::swap(A[i][j], A[j][i]);
}
我已使用swap()
和swap_ranges()
来执行操作。
// -*- coding: utf-8 -*-
#include <algorithm>
#include <iostream>
namespace {
const int N = 3;
// rotate 90° clock-wise
void rot90cw(char A[][N]) {
// ... defined above
}
void print(char a[][N]) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++)
std::cout << a[i][j];
std::cout << '\n';
}
std::cout << std::endl;
}
}
int main() {
char a[][N] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i' };
print(a);
rot90cw(a);
std::cout << "Rotated 90° clock-wise:" << std::endl; //note: utf-8
print(a);
}
abc
def
ghi
Rotated 90° clock-wise:
gda
heb
ifc
答案 3 :(得分:0)
数组在C ++中不像那样工作。当你在一个函数中传递一个数组时,你正在传递一个指向第一个元素的指针,所以你正在做的是创建一个本地定义的数组B
,然后设置传递给你的函数的指针指向B阵列的头部。分配给原始A
的内存在任何时候都不会发生变化。然后当函数返回时,函数的A
指针将被丢弃,原始的A
数组保持不变。如果要修改作为函数参数传递的数组,则必须直接修改元素。
答案 4 :(得分:0)
您尝试通过引用传递数组并更改该引用。这有效,但没有必要。
您可以逐个元素直接修改数组:
void one(char A[][10], int N)
{
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
{
char b = A[j][N-i-1];
A[j][N-i-1] = A[i][j];
A[i][j] = b;
}
}