Notes

Powered by The LE Company

Wednesday, October 13, 2010

Mảng Đa Chiều và Con Trỏ

© Le Trung Thang  Nov - 2010





Chú ý:
Một con trỏ (hay biến nói chung) luôn phải có kiểu giá trị (hay nội dung) gắn liền với nó. Ở qui tắc đầu tiên trong 4 qui tắc trên, ta chỉ nói đến kiểu của A. Về giá trị, thì cách tính giữa mảng A và con trỏ thông thường sẽ khác nhau:
- Nếu A là c/trỏ thông thường cấp n (n >=2 ), thì giá trị của *A sẽ là giá trị các ô nhớ (thường là 4byte) mà A trỏ tới.
- Nếu A là mảng cấp n (n >=2 ), thì giá trị của *A sẽ là địa chỉ của những ô nhớ mà A trỏ tới. (như ví dụ trên).

Xem ví dụ 1 sau:
int main() // ví dụ 1
{
   int* a  ;
   int* b ;
   int **pointer ;  // pointer tro toi kieu int, *pointer tro toi kieu char.
// Tuy vậy,ko hề tồn tại biến nào là *pointer cả, đây chỉ là cách nói hình thức,
// trong bộ nhớ chỉ có biến pointer. 
    
int Array[3][3] = {// col 1  2  3
                         {0,1,2},//row 1
                         {3,4,5},//row 2
                         {6,7,8},//row 3
                    };
pointer = (int**)Array;//ve syntax thi pointer va Array khac kieu, nen phai ép kiểu.
a = pointer[1]; // pointer tăng mỗi lần 4 byte, vì pointer trỏ tới kiểu dữ liệu
                //4 byte (int), còn *pointer trỏ tới kiểu dữ liệu 1 byte (char).         
                // Để ý là: pointer[1] = (*(pointer+1))
b = *(Array+1) ; // = Array[1]

printf("Pointer 2D: a = %d, b = %d, &Array = %d, &Array[0] = %d, &Array[1] = %d,&Array[1][0]=%d\n", a,b,Array,&Array[0],Array[1],&Array[1][0]);
getchar(); 
return 0;    // Để ý sự khác nhau giữa *(Array+1) và *(pointer+1)
}
Output:  Pointer 2D: a = 1,  b = 2293532,  & Array = 2293520, 
&Array[0] = 2293520,  &  Array[1] = 2293532,
&Array[1][0]=2293532


The best tools for embedded system: 

No comments: