Con trỏ và mảng ?

hagiang12a19

Mr & Ms Pac-Man
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.
 
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.
 
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;
}
 
Back
Top