Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: hàm swap - toán tử địa chỉ và toán tử truy xuất hoạt động thế nào?

  1. #1
    Ngày gia nhập
    07 2011
    Bài viết
    8

    Mặc định hàm swap - toán tử địa chỉ và toán tử truy xuất hoạt động thế nào?

    Mình không hiểu rõ lắm về hàm swap. Mong các bạn giúp mình hiểu rõ ràng vấn đề.
    Code:
    #include <stdio.h>
    void swap(int *m,int *n)
    {
    	int t=*m;
    	*m=*n;
    	*n=t;
    }
    int main(int argc, char *argv[])
    {
    	int a=10,b=11;
    	int *m=&a;
    	int *n=&b;
    	swap(m,n);
    	printf("%d\n",a);
    	printf("%d\n",b);
    	return 0;
    }

  2. #2
    Ngày gia nhập
    01 2011
    Bài viết
    116

    hàm này chỉ để đổi giá trị m và n cho nhau.
    Trong hàm main thay vì phải khai báo thêm *m, *n, bạn có thể gọi swap bằng cách swap(&a,&b);
    C++ Code:
    1. while ( you_live) {
    2. if (you_failed) try_again();
    3. else if ( you_won) find_new_challenge();
    4. }
    5. system("DEATH");
    6. return HELL;

  3. #3
    Ngày gia nhập
    07 2011
    Bài viết
    8

    Mình cũng biết là hàm này dùng để đổi chỗ a và b. Nhưng càng ngồi nghiền ngẫm thì thấy lấn cấn chỗ pointer. Bạn giải thích giúp mình được không?

  4. #4
    Ngày gia nhập
    01 2011
    Bài viết
    116

    Bạn cần nói rõ chưa hiểu chỗ nào chứ (comment code), hoặc search trên diễn đàn, có rất nhiều topic nói về con trỏ mà
    C++ Code:
    1. while ( you_live) {
    2. if (you_failed) try_again();
    3. else if ( you_won) find_new_challenge();
    4. }
    5. system("DEATH");
    6. return HELL;

  5. #5
    Ngày gia nhập
    07 2011
    Bài viết
    8

    Tại sao phải đổi chỗ địa chỉ vùng nhớ của hai biến a và b? Mình cũng đang cố gắng tìm hiểu để xem tại sao mình không hiểu.

  6. #6
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Mặc định hàm swap - toán tử địa chỉ và toán tử truy xuất hoạt động thế nào?

    Không phải đổi chỗ địa chỉ vùng nhớ đâu bạn. Mục tiêu của hàm là đổi chỗ giá trị của 2 biến a và b! Nhưng với C thì để 1 hàm thay đổi được giá trị của 1 tham số, cần phải truyền con trỏ tới nó.

  7. #7
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    void swap(int *m,int *n)
    {
    int t=*m;
    *m=*n;
    *n=t;
    }

    tương đương:

    void swap(int *m,int *n)
    {
    int a = *m;
    int b = *n;

    *m= b;
    *n= a;
    }

  8. #8
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Trích dẫn Nguyên bản được gửi bởi Trace Xem bài viết
    Tại sao phải đổi chỗ địa chỉ vùng nhớ của hai biến a và b? Mình cũng đang cố gắng tìm hiểu để xem tại sao mình không hiểu.
    Địa chỉ vùng nhớ của hai biến không hề bị đổi chỗ. Chỉ có dữ liệu chứa trong hai vùng nhớ trên bị đổi chỗ thôi.

    Bạn không hiểu rõ về cách sử dụng ký hiệu *

    Ký hiệu * có nghĩa khác nhau tùy theo ngữ cảnh.

    Chỉ riêng trong ngữ cảnh con trỏ, * mang hai ý nghĩa

    Nếu nằm trong ngữ cảnh định nghĩa/định dạng dữ liệu, * là con trỏ loại dữ liệu.

    Nếu nằm trong ngữ cảnh truy xuất giá trị, * là dữ liệu ở địa chỉ mà con trỏ đang trỏ tới

    Trích dẫn Nguyên bản được gửi bởi Trace Xem bài viết
    Code:
    #include <stdio.h>
    void swap(int *m,int *n) // định dạng dữ liệu ==> m và n là con trỏ cho dạng dữ liệu int
    {
    	int t=*m; // đối với t là định dạng dữ liệu t, nhưng đối với m là truy xuất giá trị
                      // tức là lấy giá trị ở địa chỉ mà m đang trỏ vào ==> truy xuất
    	*m=*n; cả n,m đều truy xuất ==> lấy giá trị ở đị chỉ n, chép vào ô nhớ ở địa chỉ m
    	*n=t; n dùng truy xuất ==> chép giá trị t vào ô nhớ ở địa chỉ n
    }
    int main(int argc, char *argv[])
    {
    	int a=10,b=11;
    	int *m=&a; // định dạng m là con trỏ loại dữ liệu int
                         // &a = địa chỉ của a ==> chép địa chỉ của a vào m
    	int *n=&b; // định dạng n là con trỏ loại dữ liệu int
                         // &b = địa chỉ của b ==> chép địa chỉ của b vào n
    	swap(m,n); // gọi hàm swap, nhập hai tham số là hai con trỏ m, n
                        // tức là địa chỉ của a và b
                        // bên trong hàm, dữ liệu chứa trong hai địa chỉ này sẽ được swapped cho nhau
              trên thực tế ba dòng:
              int *m=&a; 
              int *n=&b; 
              swap(m,n); 
              có thể thay thế bằng: 
              swap(&a, &b); 
              cũng có nghĩa là gọi hàm swap, nhập hai tham số là hai con trỏ địa chỉ a và b 
    	printf("%d\n",a);
    	printf("%d\n",b);
    	return 0;
    }

  9. #9
    Ngày gia nhập
    07 2011
    Bài viết
    8

    Nói nôm na thế này có được không nhỉ:
    Mình xem địa chỉ vùng nhớ của 2 biến đó là 2 cái khay, mỗi khay chứa một biến. Khi muốn hoán vị 2 biến đó, ta chỉ cần đến 2 cái khay và đổi chỗ 2 biến đó cho nhau.
    Thanks các bạn đã nhiệt tình giúp đỡ. Sao mình không thấy nút thanks đâu cả? Mình mới tham gia vào diễn đàn, mong các bạn chỉ giáo.

Các đề tài tương tự

  1. Cách tiếp cận cũng như làm thế nào để tìm ra được công thức truy hồi trong Quy Hoạch động?
    Gửi bởi fithou91192 trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 2
    Bài viết cuối: 11-09-2013, 10:44 PM
  2. [Hỏi] Cách truy xuất dữ liệu xml nhiều thẻ cha.
    Gửi bởi cuibap_sp trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 2
    Bài viết cuối: 04-10-2012, 10:58 PM
  3. Lập trình C++ Truy xuất dữ liệu từ file txt như thế nào?
    Gửi bởi kumamuka trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 0
    Bài viết cuối: 24-07-2011, 12:58 PM
  4. MS SQL với C# Xử lý dữ liệu khi có quá nhiều truy xuất hoặc insert dữ liệu vào db cùng một lúc
    Gửi bởi namtran1988 trong diễn đàn Thắc mắc Microsoft SQL Server & Microsoft Access
    Trả lời: 1
    Bài viết cuối: 11-03-2011, 12:08 PM
  5. code phần swap sao không swap đc. Xem giùm mình vậy
    Gửi bởi lastvampire trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 7
    Bài viết cuối: 28-11-2010, 07:37 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn