Trang 1 / 3 123 LastLast
Hiển thị kết quả từ 1 đến 10 / 29

Chủ đề: Về con trỏ C

  1. #1
    Tham gia
    26-01-2008
    Bài viết
    36
    Like
    0
    Thanked 2 Times in 2 Posts

    Buồn quá đi ! Về con trỏ C

    mình có bài về cộng hoặc nhân 2 ma trận, dùng con trỏ để làm mà mình vẫn chưa bít nhiều bạn nào có thể gợi ý cho minh được không? về mảng thì dễ nhưng con trỏ mắc wa...Chỉ giúp mình nha!!!
    Quote Quote

  2. #2
    Tham gia
    26-01-2008
    Bài viết
    359
    Like
    0
    Thanked 3 Times in 3 Posts
    Vấn đề sử dụng con trỏ thế nào là một vấn đề tương đối khó.
    Mình code qua bài trên của bạn, bạn xem qua để tham khảo nhé, có chỗ nào không hiểu bạn cứ hỏi :
    Code:
    #include <stdio.h>
    #include <conio.h>
    #include <malloc.h>
    
    const int M = 2;
    const int N = 3;
    
    typedef int MYTYPE;
    typedef MYTYPE MYARR[N];
    
    void inputMatrix(MYARR *a, char ch)
    {
    	int i,j;
    	for(i = 0; i < N;i++)
    	{
    		for(j = 0; j < M; j++) 
    		{
    			printf("%c[%d][%d] = ",ch,i,j);
    			scanf("%d",&a[i][j]);
    		}
    	}
    }
    
    void printOutMatrix(MYARR *a)
    {
    	int i,j;
    	for(i = 0;i < N; i++)
    	{
    		for(j = 0; j < M;j++) printf("%5d",a[i][j]);
    		printf("\n");
    	}
    }
    
    void addTowMatrix(MYARR *a, MYARR *b, MYARR *c)
    {
    	int i,j;
    	for(i = 0; i < N; i++)
    	{
    		for(j = 0; j < M;j++) c[i][j] = a[i][j] + b[i][j];
    	}
    }
    
    
    void main()
    {
    
    	MYARR *a = (MYARR *)malloc(M * sizeof (MYARR));  
    	MYARR *b = (MYARR *)malloc(M * sizeof (MYARR));  
    	MYARR *c = (MYARR *)malloc(M * sizeof (MYARR));  
    
    	inputMatrix(a,'A');
    	inputMatrix(b,'B');
    
    	addTowMatrix(a,b,c);
    
    	printf("The result for adding tow matrix\n");
    	printOutMatrix(c);
    	getch();
    
    }

    [=========> Bổ sung bài viết <=========]

    À quên lúc nãy code vội chưa free cho nó, bạn nhớ là các hàm cấp phát phải luôn đi kèm với các hàm giải phóng bộ nhớ nhé, bọn chúng không thể thiếu nhau được đâu :
    free(a);
    free(b);
    free(c);
    Được sửa bởi VuongChieuQuan lúc 18:31 ngày 17-04-2008 Reason: Bổ sung bài viết

  3. Thành viên Like bài viết này:


  4. #3
    Tham gia
    26-01-2008
    Bài viết
    36
    Like
    0
    Thanked 2 Times in 2 Posts
    bạn có thể giải thích cho mình hiểu thư viện #include <maloc.h>
    đc không? mình không rõ lắm.
    MYARR *a = (MYARR *)malloc(M * sizeof (MYARR));
    MYARR *b = (MYARR *)malloc(M * sizeof (MYARR));
    MYARR *c = (MYARR *)malloc(M * sizeof (MYARR));
    cả đoạn này nữa nha, cách thực hiện như nào?
    những hàm giải phóng free(a) ... đặt ở đâu mình chưa làm như này bao giờ nên không hiểu. bạn giải thích giúp mình nha!
    Cảm ơn Vương Chiêu Quân nhìu!

  5. #4
    Tham gia
    31-03-2008
    Bài viết
    1
    Like
    0
    Thanked 0 Times in 0 Posts
    xin chào. mình ko thuộc dân cntt nhưng mà trên lớp có cái đồ án tin học extract file AVI thành các frame riêng biệt(ngôn ngữ C), mình có tìm hiểu nhưng chưa có j` nhiều, cho mình hỏi về cái thư viện vfw32.lib đi. cảm ơn nhiều lắm.

  6. #5
    Tham gia
    26-01-2008
    Bài viết
    359
    Like
    0
    Thanked 3 Times in 3 Posts
    Con trỏ là một vấn đề quan trọng cần lắm vững. Bạn lên tìm hiểu sâu về nó, bao giờ bạn giải thích được những câu hỏi sau thì hãy bắt tay vào lập trình với con trỏ:
    1. Con trỏ là gì ? Một biến kiểu trỏ khác gì so với một biến tĩnh ?
    2. Tại sao phải dùng con trỏ ?
    3. Mô hình bộ nhớ một chương trình ?

  7. #6
    Tham gia
    20-04-2008
    Bài viết
    2
    Like
    0
    Thanked 0 Times in 0 Posts
    Có thể nói rõ hơn về con trỏ giúp mình với,câu hỏi số 2,3 của VCQ mình không hiểu lắm.Trả lời giúp mình nha. Cám ơn nhiu.

  8. #7
    Tham gia
    21-01-2008
    Bài viết
    157
    Like
    0
    Thanked 0 Times in 0 Posts
    may bai nay cung ko kho lam dau ,nhung minh biet giai

  9. #8
    Tham gia
    24-10-2007
    Location
    Bình Định
    Bài viết
    106
    Like
    0
    Thanked 1 Time in 1 Post
    Trả lời cho bạn:
    1. Đầu tiên, cái thư viện <malloc.h> là một thư viện hàm, trong đó có chứa hàm malloc hay calloc. Ở trên, anh vuongchieuquan dùng chương trình Visual C++ 6.0 trong bộ Visual studio 6.0 để viết chương trình này, nên ảnh dùng thư viện <malloc.h>. Nhưng nếu bạn dùng Borland C++ hay Turbo C++ để viết chương trình thì phải khai báo là <alloc.h>. Nếu không, có lỗi thì ráng chịu ^^. Cái này do sự khác nhau giữa các môi trường lập trình mà thôi. Còn muốn không sợ lộn, thì dùng luôn <stdlib.h> cũng được. Nó chứa luôn hai hàm malloc và calloc luôn.

    @duonghoccmk: hôm trước em đã nói qua vê cái cấu trúc của lệnh malloc cho chị rồi, mà chị vẫn không nhớ à? Em nói lại thế này hen:
    Code:
    void *malloc( size_t size );
    Như vậy, hàm malloc sẽ tạo ra một vùng nhớ trong bộ nhớ heap (đại khái là bộ nhớ động đó) một vùng nhớ tính theo bye. ví dụ: malloc(100) sẽ tạo ra trong bộ nhớ động một vùng nhớ có kích thước 100 bytes. Lấy ví dụ của anh vuongchieuquan hen:
    Code:
    MYARR *a = (MYARR *)malloc(M * sizeof (MYARR));
    ảnh truyền cho hàm malloc một đối số là số byte kích thước của kiểu dữ liệu MYARR nhân với M (còn MYARR và M là gì, xin vui lòng đọc lại code của ảnh).

    Nhân đây, xin phân biệt luôn điểm khác nhau giữa hàm malloc và hàm calloc như saU: về kết quả trả về, thì hai hàm như nhau. Nhưng cú pháp của hàm calloc thì như sau:
    Code:
    void calloc( size_t n_items, size_t size );
    hàm calloc khác với hàm malloc ở chỗ mình truyền cái gì cho nó. Hàm calloc thì mình phải truyền cho nó hai thứ: cái thứ nhất là kích thước của kiểu dữ liệu (size_t size tương ứng với cái sizeof(MYARR) ở trên), và số "mục" cần cấp phát (tương ứng với cái M ở trên). ví dụ calloc( 10, sizeof(int) ) sẽ cấp phát vùng nhớ 40 bytes (nếu mỗi số nguyên có kích thước 4bytes ^^.

    còn cái chuyện phải dùng toán tử ép kiểu (MYARR *) (MYARR là một kiểu dữ liệu đã được anh vuongchieuquan định nghĩa rồi hen), thì nguyên do là thế này: chị có thấy cú pháp của hàm malloc và calloc không? cả hai đều trả về một con trỏ void. Nhưng mà con trở này thì không thể được dùng để "quản lý" vùng nhớ kiểu MYARR được. Nên phải "ép kiểu" nó sang kiểu MYARR để dùng...
    ví dụ:
    Code:
    int *a; //khai báo con trỏ a kiểu int
    a = (int *)malloc( 100 * sizeof(int) ); //con trỏ a trỏ đến vùng nhớ đủ sức chứa 100 số nguyên. Tổng kích thước sẽ la 400 bytes (trong môi trường DOS thôi)
    @hoasua_8x: anh hỏi câu khó quá. Không phải không trả lời được, mà là trả lời thì dài dòng lắm. Anh có hai cách để trả lời 2 câu hỏi trên là: hoặc là hỏi thầy, tìm tài liệu (tiếng anh mới có đủ), tìm trên mạng; hoặc là... học riết rồi rút ra kinh nghiệm. Ở đây, vì sự làm siêng... có hạn, em chỉ đưa ra được vài ý kiến nhỏ của mình mà thôi:

    1. Câu hỏi số 2 là để "ôn" lại câu hỏi 1. Vì thực chất, thì chính sự khác nhau giữa biến tĩnh và biến động phần nào nói lên cách dùng của con trỏ.
    2. Câu hỏi số 3 là để biết được câu trả lời cho câu hỏi số 2.
    Nói chung, mục đích chính vẫn là cách dùng con trỏ.
    Ở đây, em xin bỏ qua phần giới thiệu tác dụng của con trở. Chỉ xin đưa ra một số trường hợp cần và phải dùng đến con trỏ như sau:

    1. Khi chương trình cần tiêu tốn quá nhiều bộ nhớ, thì hãy dùng bộ nhớ động, nếu không muốn gặp lỗi "tràn bộ nhớ" (không biết thuật ngữ có đúng không ta?). Với lại, đã cấp "thổ cư" được, thì khi cần, chính quyền (chương trình" cũng có thể thu hồi lại bằng lệnh free hay delete (trong C++), nên có thể linh hoạt sử dụng bộ nhớ, trong điều kiện ram chỉ có 2 hay 3mb thời cổ lỗ sĩ (giờ thì lập trình vô tư mà không sợ bị gì đâu).

    2. Mở rộng ra, ta dùng con trỏ cho một số cấu trúc dữ liệu phức tạp, thường có kích thước lơn, như kiểu danh sách liên kết "cấu trúc"... hì hì...

    3. Khi muốn thay đổi giá trị của biến khi hàm thực hiện xong. Măc định, khi truyền một biến cho hàm theo kiểu tham trị, trình biên dịch sẽ tạo ra bản sao cho biến đó, nên khi hàm làm xong công việc rồi, bản sao đó bị hủy, còn cái biến mình truyền thì chẳng bị... thằng nào đụng đến nên còn nguyên. Muốn làm thay đổi nó, phải dùng con trỏ, chỉ dích danh đến nhà nó, mới phá được (nghĩa là mới thực sự thay đổi được giá trị của nó). (chú ý, kiểu chuỗi, thực chất là con trỏ, do đó, khi hàm thực hiện xong, giá trị vẫn thay đổi, nên đừng thâc mắc là tui nói bậy hen). Trong C chuẩn, thì dùng con trỏ là cách duy nhất làm thay đổi giá trị của biến. Nhưng trong C++, còn chiêu độc hơn là truyền theo kiểu tham biến (truyền địa chỉ của biến đó mà).

    4. Vâng vâng... mỏi tay rồi, nghỉ đã. Nếu có ý tưởng gì, em nói thêm.

    Đó là ý kiến riêng của em thôi. Các anh chị hiểu biết hơn, thấy em gà quá thì đừng có cười hen. ^^
    Được sửa bởi trhthong lúc 17:55 ngày 20-04-2008

  10. #9
    Tham gia
    11-04-2008
    Bài viết
    16
    Like
    0
    Thanked 1 Time in 1 Post
    Thật sự là có nhiều lúc tui vẫn không phân biệt được sự khác biệt giữa C++ và C. Tui cứ viết lẫn lộn hoài. Tui viết một chương trình mà trong đó phối hợp cả hai ngôn ngữ luôn thì có sao không?

  11. Thành viên Like bài viết này:


  12. #10
    Tham gia
    24-10-2007
    Location
    Bình Định
    Bài viết
    106
    Like
    0
    Thanked 1 Time in 1 Post
    ^^
    @kid1412: Thực ra, khi mới học C mà dùng mấy chương trình dịch For Dos như Turbo C++ hay Borland C++, chúng ta cũng đã "lẫn lộn" giữa C và C++ ở một đặc điểm rất nhỏ, là:
    Code:
    void main()
    {
    int a; int b; int c;
    clrscr();
    }
    và:
    Code:
    void main()
    {
    clrscr();
    int a; int b; int c;
    }
    Cái trên, đúng là ngôn ngữ C chuẩn rồi. Còn cái dưới, thì hắn là C++ đấy . Trong C chuẩn, bắt buộc phải khai báo biến toàn cục trước. Còn trong C++, thì quy tắc này được xem nhẹ, nghĩa là có thể khai báo biến bất cứ khi nào cần. Như vậy mới có chuyện:
    Code:
    for( int i=0; i<n; i++){}
    Như vậy, chúng mình có thể dùng C và C++ lẫn lộn được. Nhưng phải tuân theo một số qui tắc rất đơn giản, ví dụ:
    1. Phải lưu file source với đuôi .cpp, đừng có mà lưu với đuôi .c, rồi bảo ông thầy dạy sai hen (vì có khi, thầy cũng dùng lẫn lộn giữa C và C++ mà không biết).
    2. Chú ý đến môi trường lập trình. Nghĩa là phải dùng môi trường lập trình C++ để lập trình C "lai". Vì khi đó, source của mình mới được compile mà không có lỗi. Đơn giản nhất là dùng cái Turbo C++ hay Borland C++.
    3.....

  13. Thành viên Like bài viết này:


Trang 1 / 3 123 LastLast

Bookmarks

Quy định

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