Con trỏ và mảng ?

Thảo luận trong 'Lập trình & Đồ hoạ' bắt đầu bởi hagiang12a19, 20/8/06.

  1. hagiang12a19

    hagiang12a19 Mr & Ms Pac-Man

    Tham gia ngày:
    2/12/03
    Bài viết:
    109
    Nơi ở:
    PCIE-16X
    Xin coi đoạn mã sau : (VC++ 6.0)

    #include <stdio.h>
    #include <conio.h>

    void main()
    {
    int a[5];
    // mang 5 phan tu : a[0] a[1] ... a[5]
    int *intp;
    // con tro kieu int


    intp = (int *)(&a); // cach 01
    //intp = (int *)a; // cach 02
    //intp = a; // cach 03
    //intp = &a; // cach 04


    *(intp+1) = 1;
    // gan gia tri 1 vao phan tu thu 2 = a[1]
    printf("%d", *(intp+1));
    // in ra

    getch();
    }

    Trong cả 3 cách đầu tiên : gán địa chỉ mảng a[5] cho con trỏ đều cho kết quả đúng ! Nhưng cách thứ 04 : intp = &a; lại báo lỗi ! Có bro nào biết vì sao kô vậy ? Xin chỉ giúp.
     
  2. ZeroCrazy

    ZeroCrazy T.E.T.Я.I.S

    Tham gia ngày:
    8/4/06
    Bài viết:
    516
    Nơi ở:
    hỏi làm chi ?
    Phép toán &(variable) trả về con trỏ đến nó.
    Ví dụ : &n trả về con trỏ đến n. Nếu n là int thì trả về int*, nếu n là int* thì trả về int**.

    Cách 4 lỗi vì gán không đúng kiểu: int* = int**

    Cách 3 là hợp lí.

    Cách 2 hơi thừa vì a đã là int*.

    Cách 1 dùng mã không an toàn. Nhưng vì a và &a đều cho kết quả là địa chỉ đầu mảng a nên kết quả vẫn đúng.
     
  3. ZeroCrazy

    ZeroCrazy T.E.T.Я.I.S

    Tham gia ngày:
    8/4/06
    Bài viết:
    516
    Nơi ở:
    hỏi làm chi ?
    Sorry, tui đã lẫn lộn 1 tí. Trong C++ mảng không phải là con trỏ như C#.
    Tôi xin đính chính lại thế này:

    Cách 4: gán không hợp lệ int* = int(*)[5]

    Cách 3: gán hợp lệ int* = int[]

    Cách 2: ép kiểu không cần thiết vì int[] có thể gán trực tiếp cho int* như cách 3.

    Cách 1: biểu thức a hay &a đều cho kết quả là địa chỉ đầu mảng a nên cách 1 và 2 có kết quả như nhau.

    Để hiểu rõ hơn ban chạy thử đoạn code này.
    Mã:
    #include<iostream.h>
    
    int main()
    {
    	int* p;
    	int a[5];
    	
    	for(int i = 0 ; i < 5 ; i++)
    		cout << "Address of a[" << i << "] : " << a+i
    		     << endl; 
    	
    	cout << "Expression a return  : " << a  << endl;
    	cout << "Expression &a return : " << &a << endl;
    	cout << endl;
    
    	p = a;
    	a[0] = 100;
    	cout << "Value of p       : " << p  << endl
    	     << "Address of p     : " << &p << endl
    	     << "p point to value : " << *p << endl;
    
    	return 0;
    }
     

Chia sẻ trang này