Hỏi về con trỏ với hàm đổi giá trị 2 biến truyền vào

Chào mọi người, em là newbie :))
Hôm nay, trong lúc ngồi cào phím thì em có viết một cái hàm : void exch(void*, void*) để đổi giá trị cho 2 biến truyền vào. Dưới đây là chương trình em đã viết riêng ra để test cho dễ theo dõi.

#include<stdlib.h>
#include<stdio.h>

void exch(void *i, void *j, size_t size)
	{
		void *k;
		k = *(void**)i;
		*(void**)i = *(void**)j;
		*(void**)j = k;
	}

int main()
{
  int *i, *j;
  i = (int*)calloc(6, sizeof(int));
  *i = 1;
  *(i+1) = 2;
  *(i+2) = 3;
  *(i+3) = 100;
  *(i+4) = 200;
  *(i+5) = 300;
  exch(i, i+3, sizeof(int));
  printf("a : %d-%d-%d, b : %d-%d-%d\n", *i, *(i+1), *(i+2), *(i+3), *(i+4), *(i+5));
  return 0;
} 

Kết quả in ra : a : 100 200 3, b : 1, 2, 300
Mục đích của hàm em viết là để đổi giá trị của i và i+3 thôi. Nhưng em không hiểu tại sao hàm luôn hoán đổi thêm một giá trị đằng sau, tức là đổi luôn i+1 với i+4 . Em chạy chương trình bằng gcc trên Ubuntu ạ.
Mong các bác giải thích giúp em.

Kiểm tra void là bao nhiêu byte.
Tôi đang nghi void là 8 byte (đang compile cho x64) trong khi int là 4 byte.

4 Likes

Generic swap thì dùng memcpy thôi :slight_smile: dùng stack space nếu size nhỏ.

Thực ra nhiều khi bạn chỉ cần swap con trỏ của hai vùng nhớ: vd khi tính
A_{i,j} = f_{j=1..n}(A_{i-1,j}) như trong QHĐ.

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?