You are on page 1of 4

1.

Khởi tạo và gán pointer

a. Để tạo một biến pointer trỏ đến kiểu int, ta sử dụng cú pháp sau:

int *p;

b. Để tạo một biến tĩnh a có giá trị ban đầu bằng 10 và trỏ biến p đến a, ta sử dụng
cú pháp sau:

int a = 10;
int *p = &a;

c. Để thay đổi giá trị của a bằng cách sử dụng con trỏ p, ta sử dụng toán tử
dereference (*) để truy cập đến giá trị của biến mà p đang trỏ tới, và gán giá trị mới
cho nó như sau:

*p = 20;

Sau khi thực hiện lệnh này, giá trị của biến a sẽ được thay đổi thành 20.

d. Để tạo một biến tĩnh b có giá trị ban đầu bằng 30 và trỏ biến p đến b, ta sử dụng
cú pháp sau:

int b = 30;
p = &b;

2. Cơ chế pointer và địa chỉ (Các giá trị lấy từ câu 1)

a. In ra p, giải thích tại sao lại có giá trị này.

printf("p = %p\n", p);

Giá trị của p là địa chỉ bộ nhớ mà nó đang trỏ tới, trong trường hợp này là địa chỉ
của biến b.

b. In ra: long(p+1) - long(p), giải thích tại sao lại có giá trị này.

printf("long(p+1) - long(p) = %ld\n", long(p+1) - long(p));


Kết quả của phép tính này là kích thước của kiểu int (4 byte trên nhiều kiến trúc máy
tính). Vì khi cộng 1 vào địa chỉ của p, p sẽ trỏ tới ô nhớ tiếp theo trong bộ nhớ, và
khoảng cách giữa 2 địa chỉ này chính là kích thước của kiểu int.

c. In ra *(p+1), giải thích tại sao lại có giá trị này.


printf("*(p+1) = %d\n", *(p+1));

Giá trị này không xác định và có thể gây ra lỗi, vì khi truy cập vào ô nhớ tiếp theo
của biến b (bằng cách sử dụng p+1), ta không biết ô nhớ này chứa giá trị gì (nó có
thể là các giá trị khác, hoặc không được cấp phát cho chương trình).

d. Tạo con trỏ p1 có kiểu void. Gán p1=p. Thử in ra p1+1, giải thích tại sao lại có lỗi
này.

void *p1 = p;
printf("p1+1 = %p\n", p1+1);

Khi gán p1 = p, chương trình không biết kiểu dữ liệu mà p1 trỏ tới, do đó khi thực
hiện phép tính p1+1 (tăng địa chỉ của p1 lên 1 đơn vị), chương trình không biết bao
nhiêu byte cần được tăng, do đó gây ra

3 a. Trong ví dụ này, hàm swap được khai báo nhận vào hai tham số kiểu int. Tuy
nhiên, khi gọi hàm swap ở dòng 8, tham số truyền vào là giá trị của biến a và b trong
hàm main. Trong hàm swap, hai tham số a và b được định nghĩa lại và gán giá trị mới
cho chúng, tuy nhiên, những thay đổi này chỉ được áp dụng trong phạm vi của hàm
swap và không ảnh hưởng đến giá trị của a và b trong hàm main. Do đó, ở dòng 10,

giá trị của a và b trong hàm main vẫn giữ nguyên giá trị ban đầu và kết quả in ra sẽ là
a,b: 10,20 và a,b: 10,20.
b. Để giải quyết vấn đề trên bằng cách sử dụng con trỏ, ta cần truyền địa chỉ của
biến a và b vào hàm swap. Cụ thể:

● Khai báo hàm swap với hai tham số kiểu con trỏ int:
void swap(int *a, int *b) {
● int temp = *a;

● *a = *b;

● *b = temp;

● }

Trong hàm main, khai báo hai biến con trỏ và gán địa chỉ của a và b cho chúng:
int a = 10, b = 20;

int *ptr_a = &a, *ptr_b = &b;

Gọi hàm swap và truyền hai con trỏ ptr_a và ptr_b vào:

swap(ptr_a, ptr_b);

● Kết quả in ra sẽ là a,b: 20,10 và a,b: 20,10.

Cách giải quyết vấn đề bằng cách sử dụng con trỏ là bởi khi truyền địa chỉ của biến
a và b vào hàm swap, ta có thể truy cập và thay đổi giá trị của hai biến này thông qua

con trỏ. Bằng cách này, các thay đổi sẽ được áp dụng trên giá trị của a và b trong
hàm main.

You might also like