Bài tập con trỏ trong c có lời giải năm 2024

Con trỏ hay biến con trỏ cũng là một biến thông thường nhưng giá trị mà nó lưu lại là địa chỉ của 1 biến khác.

Ví dụ biến kiểu int N trong chương trình sẽ có địa chỉ nhất định trong bộ nhớ, để lưu trữ giá trị địa chỉ này ta cần biến con trỏ kiểu int

Khi khai báo biến con trỏ ta thêm dấu * vào trước tên biến.

Cú pháp khai báo : Kiểu_Dữ_Liệu *Tên_Biến_Con_Trỏ;

Ví dụ :

include "stdio.h"

int main(){

int *ptr;   
long long* ptr2;   
char *ptr3;  
return 0;  
}

Mỗi biến trong chương trình đều được cấp phát vùng nhớ để lưu trữ giá trị của nó, ví dụ biến int sẽ được cấp phát 4 byte liên tiếp để lưu trữ và lấy địa chỉ của byte đầu tiên làm địa chỉ cho biến.

Để in ra địa chỉ của biến bạn dùng toán tử &, ví dụ &N sẽ cho bạn địa chỉ của biến N

Code :

include "stdio.h"

int main(){

int N = 28;  
long long M = 10000012828;  
printf("Dia chi cua N trong bo nho : %d\n", &N);  
printf("Dia chi cua M trong bo nho : %d\n", &M);  
return 0;  
}

Output :

Dia chi cua N trong bo nho : 6487572 Dia chi cua M trong bo nho : 6488592

Chú ý : Khi bạn chạy code trên thì địa chỉ của N và M sẽ khác, và mỗi lần bạn chạy có thể sẽ có một địa chỉ khác nhau.

Con trỏ được sinh ra để lưu địa chỉ của biến ở kiểu dữ liệu tương ứng với nó, ví dụ biến con trỏ kiểu int sẽ lưu được địa chỉ của biến int.

Chương trình sau sẽ gán địa chỉ của N cho biến con trỏ ptr, khi đó ta nói con trỏ ptr trỏ tới biến N

con trỏ

Code :

include "stdio.h"

int main(){

int N = 1000;  
printf("Dia chi cua N : %d\n", &N);  
int *ptr;  
ptr = &N;  
printf("Gia tri cua ptr : %d\n", ptr);  
return 0;  
}

Output :

Dia chi cua N : 6487572 Gia tri cua ptr : 6487572


2. Tham Chiếu Và Giải Tham Chiếu

Khi con trỏ ptr trỏ tới hay tham chiếu (reference) tới biến N thì thông qua con trỏ ptr ta có thể truy xuất, thay đổi giá trị của biến N mà không cần dùng N.

Để truy xuất tới giá trị của biến mà con trỏ đang trỏ tới ta dùng toán tử giải tham chiếu * (dereference)

Sau khi con trỏ ptr trỏ tới biến N thì N và *ptr là một, đều truy xuất đến ô nhớ mà N đang chiếm để lấy giá trị tại ô nhớ đó.

Lưu ý là bạn cần phân biệt dấu * khi khai báo con trỏ ptr và dấu * khi giải tham chiếu con trỏ ptr. Dấu * khi khai báo thể hiện ptr là một con trỏ còn dấu * trước ptr ở những câu lệnh sau là toán tử giải tham chiếu.

include "stdio.h"

int main(){

int N = 1000;  
printf("Dia chi cua N : %d\n", &N);  
int *ptr = &N;   
printf("Gia tri cua ptr : %d\n", ptr);  
printf("Gia tri cua bien ma con tro ptr tro toi : %d\n", *ptr);   
*ptr = 280;  
printf("Gia tri cua N sau thay doi : %d %d\n", N, *ptr);  
return 0;  
}

Output :

Dia chi cua N : 6487572 Gia tri cua ptr : 6487572 Gia tri cua bien ma con tro ptr tro toi : 1000 Gia tri cua N sau thay doi : 280 280

Một biến có thể được trỏ tới bởi nhiều con trỏ, khi đó bạn có thể thông qua bất cứ 1 con trỏ nào để thay đổi giá trị của biến mà nó đang trỏ tới.

Trong ví dụ dưới đây 3 biến con trỏ ptr1, ptr2, ptr3 đều trỏ tới N nên *ptr1, *ptr2, *ptr3 và N đều có giá trị giống nhau.

con tro 2

Code :

include "stdio.h"

int main(){

int N = 1000;  
int *ptr1 = &N;   
int *ptr2 = &N;   
int *ptr3 = ptr1;   
printf("Gia tri cua 3 con tro : %d %d %d\n", ptr1, ptr2, ptr3);  
*ptr1 = 100;   
printf("Gia tri cua N : %d\n", N);  
*ptr2 = 200;   
printf("Gia tri cua N : %d\n", N);  
*ptr3 = 300;   
printf("%d %d %d %d\n", *ptr1, *ptr2, *ptr3, N);  
return 0;  
}

Output :

Gia tri cua 3 con tro : 6487572 6487572 6487572 Gia tri cua N : 100 Gia tri cua N : 200 300 300 300 300


3. Hàm Và Con Trỏ

Con trỏ làm tham số cho hàm

Để thay đổi giá trị của 1 biến sau khi hàm kết thúc thì việc truyền giá trị là không hợp lý, thay vì đó bạn hãy sử dụng con trỏ với mục đích là thay đổi giá trị của biến thông qua con trỏ.

Khi hàm có tham số là một con trỏ thì khi gọi hàm bạn cần truyền vào một giá trị phù hợp, có thể là địa chỉ của 1 biến hoặc một con trỏ khác.

Ví dụ 1: Thay đổi giá trị của biến sau khi hàm kết thúc

Code :

include "stdio.h"

void change(int *x){

printf("Gia tri cua con tro x : %d\n", x);  
printf("Gia tri cua bien ma x đang tro toi : %d\n", *x);  
*x = 1000;  
} int main(){
int N = 28;  
printf("Dia chi cua N : %d\n", &N);  
change(&N);   
printf("Gia tri cua N : %d\n", N);  
return 0;  
}

Output :

include "stdio.h"

int main(){

int N = 28;  
long long M = 10000012828;  
printf("Dia chi cua N trong bo nho : %d\n", &N);  
printf("Dia chi cua M trong bo nho : %d\n", &M);  
return 0;  
}

0

Giải thích :

Hàm change có tham số là một con trỏ kiểu int có tên là x, trong main bạn gọi change và truyền địa chỉ của N vào.

Khi đó x sẽ được gán giá trị là địa chỉ của N, trong hàm change thì câu lệnh *x = 1000 sẽ truy xuất tới ô nhớ mà x đang trỏ tới và gán giá trị 1000. Mà x lại đang tham chiếu tới N nên giá trị của N đã bị thay đổi.