Solved

# swap rows in a two dimensional array

Posted on 2006-07-14
Medium Priority
3,584 Views
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;

Thanks a lot in advance.
0
Question by:learn
[X]
###### Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points
• Learn & ask questions
• 6
• 4
• 3
• +3

LVL 12

Expert Comment

ID: 17109359
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

LVL 12

Expert Comment

ID: 17109373
>> 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 Comment

ID: 17109710
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

LVL 46

Expert Comment

ID: 17111053

>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

LVL 5

Accepted Solution

cryptosid earned 360 total points
ID: 17111996
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

Author Comment

ID: 17112170
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

LVL 16

Expert Comment

ID: 17112238
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 Comment

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

LVL 16

Expert Comment

ID: 17112753
Kdo's method will work nicely with malloc.

Paul
0

Author Comment

ID: 17112841
Paul,

How Kdo's method will work with malloc?
0

LVL 7

Expert Comment

ID: 17113879
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

LVL 16

Expert Comment

ID: 17115609
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

LVL 5

Expert Comment

ID: 17115721
Paul,

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

Regards,
Siddhesh
0

LVL 16

Expert Comment

ID: 17115732
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 Comment

ID: 17207761
nafis_devlpr,

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

LVL 7

Expert Comment

ID: 17210189
>>Are you talking "new" in C++?

I don't understand that.
0

Author Comment

ID: 17297441
nafis_devlpr,

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

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

LVL 5

Expert Comment

ID: 17305037
you can replace

arr[i] = new int[3];

with

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

0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Preface I don't like visual development tools that are supposed to write a program for me. Even if it is Xcode and I can use Interface Builder. Yes, it is a perfect tool and has helped me a lot, mainly, in the beginning, when my programs were smallâ€¦
This is a short and sweet, but (hopefully) to the point article. There seems to be some fundamental misunderstanding about the function prototype for the "main" function in C and C++, more specifically what type this function should return. I see soâ€¦
The goal of this video is to provide viewers with basic examples to understand and use while-loops in the C programming language.
The goal of this video is to provide viewers with basic examples to understand and use conditional statements in the C programming language.
###### Suggested Courses
Course of the Month15 days, 2 hours left to enroll

#### 649 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.