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

Đề tài: Hỏi về biến con trỏ

  1. #1
    Ngày gia nhập
    01 2008
    Bài viết
    240

    Mặc định Hỏi về biến con trỏ

    Em chào các bạc
    Các bác cho em hỏi 1 chút về con trỏ nhé


    Code:
    // ggg.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    
    struct  LinkList{
    	int x;
    	LinkList*next;
    
    };
    
    LinkList*getNode(){
    
    	LinkList*p=(LinkList*)malloc(sizeof(LinkList));
    }
    void Add_Head(LinkList**head,int x){
    
    	LinkList*p=getNode();
    
    	p->x=x;
    	p->next=NULL;
    
    if(*head==NULL)
    *head=p;
    
    	else{
    		p->next=*head;
    		*head=p;
    	}
    }
    void Add_Head1(LinkList*head,int x){
    	
    	LinkList*p=getNode();
    	
    	p->x=x;
    	p->next=NULL;
    	
    	if(head==NULL)
    		head=p;
    	
    	else{
    		p->next=head;
    		head=p;
    	}
    }
    
    int main(int argc, char* argv[])
    {
    	LinkList*head1=NULL;
    
    	Add_Head1(head1,1);
    	Add_Head(&head1,2);
    }
    Các thắc mắc như sau:

    1:
    -head: nó chứa cái gì vậy(tức địa chỉ của cái gì)?
    -&head: nó chứa cái gì vậy(tức địa chỉ của cái gì)?
    -*head: nó chứa cái gì vậy(tức địa chỉ của cái gì)?
    2:
    -Tại sao hàm Add_Head() hoạt động đúng mà trong khi Add_Head1() lại hoạt động sai
    3:
    Em muốn hiểu ý về hàm Add_Head1() như thế nào các bác xem hộ em chút nhé xem sai ở đâu!
    -Khi ta gọi hàm Add_Head1(head1,2) tức là ta đã đặt head1=head do đó mọi sự thay đổi trong hàm Add_Head1(head1,2) đối với biến head đều làm biến đổi biến head1 nhưng thật bất ngờ là biến head1 không bao giờ thay đổi chuyền vào như thế nào thì nó không thay đổi(địa chỉ của biến head1 vì thao tác trên hàm Add_Head1() có cả thay đổi địa chỉ của biến) vì mình đã in ra địa chỉ của biến rội mà nó luôn luôn in ra 1 địa chị Trong khi mình in địa chỉ của biến trong hàm Add_Head() thì nó luôn in ra các địa chỉ khác nhạu
    Cảm ơn các bác

  2. #2
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Nếu bạn đã hiểu rõ về Link-List, thì vấn đề này khá dễ hiểu: Dr cũng không biết cách nào để giúp bạn dễ hiểu nhất, nhưng Dr nghĩ, chỉ cần bạn đơn giản nó đi, nó sẽ đơn giản hơn những gì bạn nghĩ.

    LinkList *Head; // Cái này dùng để khai báo một mảng cấu trúc LinkList, hoặc địa chỉ phần tử đầu tiên của danh sách.

    Nếu bạn đơn giản hóa đi: Coi LinkList là một type data, và *head là một pointer thì nó giống ý như như dòng lệnh sau:

    int *point;

    và dĩ nhiên là LinkList **Head cũng giống với int **point.

    Bây giờ bạn lại coi *Head là một biến, rõ ràng **Head chứa địa chỉ của biến *Head.

    &Head; Dr không nhớ rõ lắm là cái này có sử dụng được không? Nhưng theo Dr thì không cần nhớ nhiều quá và không nên sử dụng kiểu này.

    Add_Head(); là một hàm để thêm một nút cho danh sách, do đó nó đã làm thay đổi danh sách. Để thay đổi dữ liệu của danh sách thì bạn cần phải truyền vào địa chỉ của đối, chứ không phải là đối số. Đọc lại phần Đối con trỏ của hàm, bạn sẽ rõ.


    Chúc bạn thành công!
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  3. #3
    Ngày gia nhập
    12 2007
    Bài viết
    224

    Code:
    &Head
    : Em nghĩ nếu head là 1 biến con trỏ thì nó cũng có địa chỉ của nó --> &head là phép lấy địa chỉ của biến con trỏ .

  4. #4
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Xem ví dụ :
    PHP Code:
     int a  5;
     
    int *ptr = &a
    ptr là con trỏ tới a, bây h nếu có 2 ý nghĩa sau :
    *ptr tức là a;
    ptr tức là con trỏ tới a;
    dấu * đặt trước con trỏ tức là khử tham chiếu của con trỏ ( mình thì ghét từ khử tham chiếu này, vì nghe nó khó chịu sao sao đó, mình cứ hiểu là nếu có dấu * trước con trỏ tức là mình đang thao tác trên cái mà nó trỏ tới thế thôi ).
    Ví dụ :
    *ptr = 10 tức là bạn đang sử dụng phép gán cho a = 10 , ok ?

    Còn ptr là địa chỉ mà nó trỏ tới tức là &a.
    Dấu & có 2 ý nghĩa :
    - Nếu bên vế phải tức là lấy địa chỉ
    - Nếu bên vế trái là tham chiếu ( cái này với con trỏ cũng tương tự )
    -head: nó chứa cái gì vậy(tức địa chỉ của cái gì)?
    -&head: nó chứa cái gì vậy(tức địa chỉ của cái gì)?
    -*head: nó chứa cái gì vậy(tức địa chỉ của cái gì)?
    Nếu đây là link list nó cũng y như quy luật trên :
    - head là con trỏ tới đầu của list, vậy nó chính là địa chỉ của dữ liệu đầu tiên. Ví dụ bạn có dữ liệu
    Code:
     [a][b][c][d][e][f]...
    Vậy head chính là địa chỉ của [a]
    *head là giá trị của a
    &head là địa chỉ của con trỏ đó.

    Vì sao có &head ? Vì trong đó bạn có sử dụng **head, tức là con trỏ tới con trỏ, tại sao &head work ? Con trỏ tới con trỏ thì phải lưu địa chỉ của con trỏ chứ ? Phần 2 hàm thì có lẽ bạn dưa vào trên đọc kĩ 1 chút chắc chắn sẽ hiểu.

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

    Nói túm lại:
    & dùng để lấy địa chỉ 1 biến
    *được dùng để lấy giá trị tại địa chỉ mà biến con trỏ đang trỏ tới

    Code:
    #include <iostream>
    
    using std::cout;
    using std::cin;
    
    void main ()
    {
    	int a;
    	int *p;
    	a = 5;
    	p = &a;
    	a++;
    
    	cout << "Gia tri cua bien a: "<<a<<"\n";
    	cout << "Gia tri tai dia chi cua bien con tro p dang tro toi: "<<*p<<"\n";
    }

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

  1. Lỗi chương trình không nhận biến(không return được biến từ public sang main)
    Gửi bởi nang trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 4
    Bài viết cuối: 02-10-2011, 06:04 PM
  2. Thuộc tính khóa ngoài( tham chiếu) biến mất khi biến đổi từ file XML sang DataTable
    Gửi bởi itmanhieu trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 17-08-2011, 08:02 PM
  3. làm sao để 2 biến Datetime trừ nhau ra biến float or double?
    Gửi bởi robocon1183 trong diễn đàn Thắc mắc Microsoft SQL Server & Microsoft Access
    Trả lời: 1
    Bài viết cuối: 10-12-2009, 05:11 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