• C

# swap rows in a two dimensional array

Hi,

Can you tell me how to swap rows in a two dimensional array something like:
int *b;
int a[3][3]={0,0,0,1,1,1,2,2,2};
b = a[2];
a[2] = a[0];
a[0] = b;

###### Who is Participating?

Commented:
Hi,

Easier way is to use structures.

struct RowStruct {
int cols[3];
};

struct RowStruct row[3];

struct RowStruct temp;

then to swap rows use this..

temp = row[0];
row[0] = row[2];
row[2] = temp;

this will swap the first and the last rows.

Structures allow us to copy complex data structures with ease, since it does member by member copy.

Regards,
Siddhesh
0

Commented:
Do this

int b[3];
int a[3][3]={0,0,0,1,1,1,2,2,2};

memcpy(b, a[2], sizeof(int)*3);
memcpy(a[2], a[0], sizeof(int)*3);
memcpy(a[0], b, sizeof(int)*3);
0

Commented:
>> int *b;
>> int a[3][3]={0,0,0,1,1,1,2,2,2};
You cannot use a pointer to swap the rows. Since two-dimensional array is allocated consecutively.
You need to explicitly swap the data in it.
0

Author Commented:
Thank you.
However, do you think there is a pointer to a row in the two dimensional array?
int *b;
int a[3][3]={0,0,0,1,1,1,2,2,2};
b = a[2];    Is a[2] a pointer to the last row of a[][]?
0

Data Warehouse Architect / DBACommented:

>Is a[2] a pointer to the last row of a[][]?

Kind of.  a[][] is an array of integers, not pointers.

a[2] is the first element of the last row.

Kent
0

Author Commented:
Thanks a lot.

I can do
int *b;
int a[3][3]={0,0,0,1,1,1,2,2,2};
b = a[2];
without any error meanning a[2] is a pointer to the last row? If it is, why we cannot use it to point something else: a[2] = b or a[2] = a[1]?
0

Commented:
Hi learn,

int *b;
int a[3][3]={0,0,0,1,1,1,2,2,2};
int *row[3] = {&a[0][0],&a[1][0],&a[2][0]};
b = row[0]; row[0] = row[1]; row[1]=b;

It doesnt actually swap the data, it just moves the goalposts. :-)

Paul
0

Author Commented:
OK......at least we swap the rows by pointer in C++ using "new", can we do the similar job using mallocate?
0

Commented:
Kdo's method will work nicely with malloc.

Paul
0

Author Commented:
Paul,

How Kdo's method will work with malloc?
0

Commented:
if you just want to swap the row then rajeev_devin's method will do.

for the question of using pointers to swap the row, then theres a catch,
if you dynamically allocated the array like this

int* arr[3];

for(int i=0; i < 3; i++)
arr[i]=new int[3];

//then you can swap row like this
int *temp;

temp=arr[1];
arr[1]=arr[2];
arr[2]=temp;

but if declared like this

int arr[3][3];

you cant swap the rows using pointers. cause the compiler actually stores the elements in a one dimentional form.
so when you just want to access a value at position a[i][j], the compiler calculates the position using this

arr[(i*3)+j]

a generalized formula would be a[(i*columnSize)+j]

but if you want to access it in that way in your code, the compiler will throw a subscript error, but you can try this in the following way

int *a=(int*)arr;
i=0,j=2;
printf("%d", a[(i*3)+j]);

so if you try to just swap the pointers it wont actually change the rows.
hope you understand this, you can ask more if you want.

Nafis
0

Commented:
Hi learn,

>>How Kdo's method will work with malloc?

typedef struct Row
{
int cell[3];
} Row;

typedef Row [3] Matrix;

Matrix m = (Matrix*)malloc(sizeof(Matrix));

// Swap row 0 and 1.
Row temp = m[1];
m[1] = m[0];
m[0] = temp;

I havent tested this. You may have to tinker with it but you get the idea.

Paul
0

Commented:
Paul,

the structs method is not Kent's method, its mine, the author is interested in Kent's method.

Regards,
Siddhesh
0

Commented:
Siddesh,

You are correct. Using structs was your way. My apologies. I think asker meant your method as Kent posted about another side of the question, my previous post was misleading. :-(

Paul
0

Author Commented:
nafis_devlpr,

Are you talking "new" in C++?
0

Commented:
>>Are you talking "new" in C++?

I don't understand that.
0

Author Commented:
nafis_devlpr,

for(int i=0; i < 3; i++)
arr[i]=new int[3];

I think we cannot use "new" in C:
0

Commented:
you can replace

arr[i] = new int[3];

with

arr[i] = (int ) malloc(sizeof(int)*3));

0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.