1.1 bé trỏ là gì?

Đầu tiên, ta có thể hiểu rằng khi khai báo biến, những biến đó đều có một vùng cất nhất định trong bộ lưu trữ hay có cách gọi khác là add trong bộ nhớ, xét ví dụ dưới đây tôi khai báo 2 trở nên a và vươn lên là b sau đó kiểm tra xem chúng ở showroom nào trong cỗ nhớ bằng cách printf 2 phát triển thành a, b ra màn hình kế tiếp sử dụng cam kết hiệu &a, &b và thực hiện kiểu %x (thập lục phân) trong việc tìm kiếm ra add của 2 thay đổi trong cỗ nhớ

#include int main() int a = 10; int b<10>; printf("Dia đưa ra cua a trong bo nho la: %x",&a); printf("
Dia bỏ ra cua b vào bo nho la: %x",&b); return 0;

Dia chi cua a trong bo nho la: 62fe1c

Dia đưa ra cua b trong bo nho la: 62fdf0

Chú ý: Địa chỉ ô nhớ trên mỗi máy tính khi xúc tiến chương trình bên trên là khác nhau. Tác dụng 62fe1c và 62fdf0 chỉ là hiệu quả minh họa.

Bạn đang xem: Bài tập con trỏ trong c

Như vậy nhỏ trỏ có tương quan gì đến bộ nhớ và những biến? cùng xem những định nghĩa sau đây về nhỏ trỏ:

Con trỏ là 1 trong biến, nó chứa địa chỉ cửa hàng ô lưu giữ của một đổi thay khác
Nếu một phát triển thành chứa showroom của một thay đổi khác, thì trở thành này được hotline là con trỏ trỏ đến trở thành thứ hai
Con trỏ cung ứng phương thức tróc nã xuất gián kế tiếp giá trị của một trong những phần tử dữ liệu
Các nhỏ trỏ hoàn toàn có thể trỏ đến các biến tất cả kiểu tài liệu cơ phiên bản như int, char, double, hay dữ liệu tập đúng theo như mảng hoặc cấu trúc.

1.2 nhỏ trỏ được sử dụng làm gì?

Các trường hợp con trỏ hoàn toàn có thể được sử dụng:Để trả về nhiều hơn thế một giá chỉ trị xuất phát điểm từ 1 hàm
Để truyền mảng và chuỗi xuất phát từ một hàm mang lại một hàm khác dễ dãi hơn
Để làm việc với các bộ phận của mảng thay bởi truy xuất thẳng vào các bộ phận này
Để cung cấp phát bộ nhớ lưu trữ và truy hỏi xuất bộ nhớ (Cấp phát bộ nhớ lưu trữ trực tiếp)2.Sử dụng bé trỏ vào C

2.1 Khai báo biến bé trỏ

Cú pháp khai báo biến nhỏ trỏ như sau:

type *name

Trong đó:

Type là kiểu dữ liệu (int, float, double, char…..)Name là tên gọi của bé trỏ
Dấu * (dấu sao) trước tên là thành phần yêu cầu để khai báo rằng chính là biến nhỏ trỏ

Ví dụ sau đây tôi khai báo nhỏ trỏ với một số kiểu dữ liệu thường gặp

#include int main() int *a; float *b; double *c; char *d;

2.2 các toán tử bé trỏ

Trong nhỏ trỏ gồm 2 toán tử đặc trưng được áp dụng là toán từ bỏ (&) với (*)

(&) là toán tử trả về ô nhớ của biến(*) là toán tử trả về giá chỉ trị chứa trong vùng ghi nhớ được trỏ đến vị biến nhỏ trỏ

Ví dụ dưới đây tôi bao gồm 2 biến đó là: a với biến nhỏ trỏ *p, tôi thực hiện toán tử (&) nhằm trả về ô nhớ của biến a bằng phương pháp khai báo biến bé trỏ *p cùng gán biến bé trỏ phường = &a

#include int main() //Khai bao bien a int a = 10; // Khai bao bien bé tro *p int *p; // Gan con tro *p = &a p = &a; printf("Dia chi o nho cua bien la: %x",p);

Dia đưa ra o nho cua bien la: 62fe14
Chú ý: Địa chỉ ô ghi nhớ trên mỗi máy tính xách tay khi tiến hành chương trình bên trên là khác nhau. Công dụng trên chỉ nên minh họa

Giả sử tôi mong muốn lấy cực hiếm của bé trỏ *p sinh sống trên thì sao??

Như sinh hoạt trên tôi vẫn đề cập mang đến toán tử (*) để đưa ra cực hiếm của nhỏ trỏ:

#include int main() //Khai bao bien a int a = 10; // Khai bao bien con tro *p int *p; // Gan con tro *p = &a p = &a; printf("Dia đưa ra o nho cua bien la: %x",p); // Hien thi gia tri bé tro bang cach su dung toan tu *p printf("
Gia tri cua con tro p la: %d",*p);

Dia chi o nho cua bien la: 62fe14

Gia tri cua bé tro phường la: 10

Chú ý: Địa chỉ ô lưu giữ trên mỗi máy tính xách tay khi thực hiện chương trình trên là không giống nhau. Công dụng trên chỉ với minh họa

Ngoài ra tôi cũng hoàn toàn có thể gán lại cực hiếm cho đổi mới a bằng cách gán trải qua con trỏ *p

#include int main() //Khai bao bien a ban dau int a = 10; printf("Gia tri bien a ban dau la: %d",a); // Khai bao bien nhỏ tro *p int *p; // Gan nhỏ tro *p = &a phường = &a; //Gan gia tri moi mang lại bien a thong qua con tro *p *p = 20; printf("
Gia tri cua bien a sau khi duoc gan lai: %d",a);

Gia tri bien a ban dau la: 10

Gia tri cua bien a sau thời điểm duoc gan lai: 20

2.3 Phép toán con trỏ

Con trỏ chỉ hoàn toàn có thể thực hiện đươc nhì phép toán sẽ là phép cùng và trừ trên con trỏ. Tôi có một lấy ví dụ sau

int a, *p; p = &a; a = 500; p++; đưa sử trở nên a được tàng trữ tại địa chỉ cửa hàng 1000 , sau khoản thời gian gán p = &a thì p lưu cực hiếm 1000. Sau biểu thức “p++;” p sẽ có giá trị là 1004 bởi vì số nguyên có form size là 4 bytes nên lúc tăng p. Lên một đơn vị sẽ là 1000 + 4 = 1004

Tất cả con trỏ đã tăng hoặc sút trị theo kích thước của kiểu dữ liệu mà chúng đang trỏ mang lại ví dụ dạng hình int làm việc trên kích cỡ là 4bytes đề nghị tăng kích cỡ là +4 và giảm kích thước là -4. Các bạn có thể đọc lại bài những kiểu tài liệu căn bạn dạng trong C để nắm rõ thêm một số size của một số trong những kiểu tài liệu khác

Xét a và p trên lấy ví dụ trên tôi có một trong những phép toán bé trỏ như sau:

Phép toánÝ nghĩa
++p hoặc p++Trỏ mang đến số nguyên được lưu lại trữ tiếp đến sau a
–p hoặc p. —Trỏ mang đến số nguyên được tàng trữ liền trước a
p + iTrỏ mang đến số nguyên được lưu giữ trữ i vị trí sau a
p – iTrỏ đến số nguyên được tàng trữ i vị trí trước a
(*p)++Tăng giá trị của a lên 1

Chú ý vào phép toán p++ và p + i, vì đấy là 2 phép toán sẽ tiến hành sử dụng đôi lúc thao tác với bé trỏ. (Đặc biệt là làm việc con trỏ với mảng ở bài bác sau)

Xét ví dụ dưới đây cho những phép toán:

Phép toán: ++p hoặc p++

#include int main() int a; int *p; p. = &a; a = 500; printf("Dia chi o nho ban dau la: %x", p); p++; printf("
Dia đưa ra o nho lúc p++ la: %x", p);

Dia bỏ ra o nho ban dau la: 62fe14

Dia bỏ ra o nho khi p++ la: 62fe18

Chú ý: Địa chỉ ô nhớ trên mỗi laptop khi thực hiện chương trình trên là không giống nhau. Tác dụng trên chỉ với minh họa

Phép toán: –p hoặc p –

#include int main() int a; int *p; p = &a; a = 500; printf("Dia bỏ ra o nho ban dau la: %x", p); p--; printf("
Dia đưa ra o nho lúc p++ la: %x", p);

Dia đưa ra o nho ban dau la: 62fe14

Dia chi o nho khi p++ la: 62fe10

Chú ý: Địa chỉ ô ghi nhớ trên mỗi máy tính xách tay khi xúc tiến chương trình bên trên là không giống nhau. Hiệu quả trên chỉ với minh họa

Phép toán: p. + i (ở trên đây tôi dùng vòng lặp để p cộng với i = 2 lần, nghĩa là phường + 2)

#include int main(){ int a; int *p; phường = &a; a = 500; printf("Dia đưa ra o nho ban dau la: %x", p); //Dung vong lap de cong p. Voi i lan for (int i = 0; i

Dia đưa ra o nho ban dau la: 62fe10

Dia đưa ra o nho khi p. + 0 la: 62fe10

Dia chi o nho khi phường + 1 la: 62fe14

Dia đưa ra o nho khi phường + 2 la: 62fe18

Chú ý: Địa chỉ ô nhớ trên mỗi máy vi tính khi xúc tiến chương trình bên trên là không giống nhau. Hiệu quả trên chỉ với minh họa

Phép toán: phường – i (ở phía trên tôi dùng vòng lặp để p. Trừ cùng với i = 2 lần, nghĩa là p – 2)

#include int main(){ int a; int *p; p = &a; a = 500; printf("Dia chi o nho ban dau la: %x", p); //Dung vong lap de tru phường voi i lan for (int i = 0; i

Dia bỏ ra o nho ban dau la: 62fe10

Dia bỏ ra o nho khi p. – 0 la: 62fe0c

Dia đưa ra o nho khi p – 1 la: 62fe08

Dia bỏ ra o nho khi p – 2 la: 62fe04

Chú ý: Địa chỉ ô nhớ trên mỗi laptop khi triển khai chương trình trên là khác nhau. Hiệu quả trên chỉ cần minh họa

Phép toán: (*p)++ (tăng quý giá của a lên 1 đối chọi vị)

#include int main() int a; int *p; p = &a; a= 500; printf("Gia tri a ban dau la: %d", a); //Tang gia tri cua a len 1 (*p)++; printf("
Gia tri a sau thời điểm (*p)++ la: %d", a);

Gia tri a ban dau la: 500

Gia tri a sau khoản thời gian (*p)++ la: 501

2.3 đối chiếu hai con trỏ

Hai bé trỏ hoàn toàn có thể được so sánh trong một biểu thức quan hệ tình dục nếu bọn chúng trỏ đến những biến bao gồm cùng kiểu dáng dữ liệu

Giả sử ptr_a với ptr_b là nhị biến nhỏ trỏ trỏ cho các bộ phận dữ liệu a cùng b. Trong trường thích hợp này, những phép đối chiếu sau là tất cả thể:

ptr_a ptr_bTrả về cực hiếm true trường hợp a được lưu giữ trữ ở chỗ sau b
ptr_a

ptr_a và ptr_b trỏ đến cùng một vị trí

ptr_a >= ptr_bTrả về cực hiếm true trường hợp a được lưu lại trữ ở phần sau b hoặc

ptr_a cùng ptr_b trỏ cho cùng một vị trí

ptr_a == ptr_bTrả về cực hiếm true nếu như cả hai bé trỏ ptr_a với ptr_b trỏ

đến cùng một phần tử dữ liệu.

ptr_a != ptr_bTrả về quý giá true nếu cả hai bé trỏ ptr_a với ptr_b trỏ

đến các thành phần dữ liệu không giống nhau nhưng bao gồm cùng kiểu

dữ liệu.

Tôi sẽ giới thiệu một ví dụ mẫu mã về việc đối chiếu con trỏ ptr_a int main(){ int a; int b; int *ptr_a; int *ptr_b; ptr_a = &a; ptr_b = &b; printf("ptr_a la: %x ",ptr_a); printf("ptr_b la: %x ",ptr_b); //Ket qua so sinh bang 1 nghia la ptr_a be hon ptr_b nguoc lai la ptr_a khong be hon ptr_b printf("
Ket qua phep so sanh ptr_a
ptr_a la: 62fe0c

ptr_b la: 62fe08

Ket qua phep so sanh ptr_a

Kết quả bởi 0 vậy đề nghị ptr_a không nhỏ hơn ptr_b

Các chúng ta có thể tự mình kiểm tra các phép đối chiếu khác nghỉ ngơi trên.

Chú ý: Địa chỉ ô lưu giữ trên mỗi máy tính khi thực hiện chương trình trên là không giống nhau. Tác dụng trên chỉ là minh họa

3. Con trỏ NULL

Con trỏ NULL nghĩa là vấn đề ta gán quý giá cho con trỏ đó bằng NULL (rỗng).

Lưu ý rằng NULL tại chỗ này không như là với số 0, giả dụ gán bé trỏ thông qua số 0 thì con trỏ đó không hẳn là con trỏ NULL mà trái ngược con trỏ được gán bằng số 0 tương tự như mọi con trỏ bình thường được gán bởi các giá trị khác ví như 1,2,3,.v.v

#include int main () int *p = NULL; printf("Dia bỏ ra cua bé tro phường la: %x ", &p); return 0;

Dia đưa ra cua bé tro phường la: 62fe18
Chú ý: nhỏ trỏ Null cũng đều có một địa chỉ trong cỗ nhớ, mặc dù giá trị ở địa chỉ đó bởi rỗng (hay còn hiểu là NULL)

Để kiểm tra bé trỏ liệu có phải là con trỏ NULL hay là không ta áp dụng câu lệnh dưới đây:

p == NULLTrả về quý hiếm true (hay số 1) nếu phường được gán quý hiếm NULL

#include int main () int *p = NULL; printf("Ket qua kiem tra bé tro NULL la: %d", phường == NULL); return 0;

Ket qua kiem tra bé tro NULL la: 1

Các khóa huấn luyện và đào tạo qua video:Lập trình C Java C# SQL vps PHP HTML5-CSS3-Java
Script

Nếu bạn chưa tồn tại kiến thức về nhỏ trỏ, xin mời xem bài viết Con trỏ (Pointer).Con trỏ giúp dễ hàng rộng trong việc làm việc thao tác với địa chỉ các biến.Ta hoàn toàn có thể khẳng định rằng showroom được gán đến một con trỏ yêu cầu cùng các loại với pháp luật trong khai báo nhỏ trỏ. Ví dụ, trường hợp ta khai báo bé trỏ int, thì bé trỏ int này không thể trỏ đến trở thành float hoặc một vài loại biến chuyển khác, tức là nó chỉ rất có thể trỏ đến trở nên kiểu int. Để tự khắc phục sự việc này, ta sử dụng con trỏ void. Một bé trỏ đến void có nghĩa là một bé trỏ chung hoàn toàn có thể trỏ đến ngẫu nhiên loại tài liệu nào. Chúng ta có thể gán add của bất kỳ loại tài liệu nào cho bé trỏ void và bé trỏ void có thể được gán cho ngẫu nhiên loại bé trỏ nào mà lại không thực hiện ngẫu nhiên kiểu chữ cụ thể nào.

Cú pháp của con trỏ void


void *tên_con_trỏ;
Ví dụ:
void *p;
Ta xét một trong những ví dụ sau:int i=9; // integer variable initialization.int *p; // integer pointer declaration.float *fp; // floating pointer declaration.

void *ptr; // void pointer declaration.p=fp; // incorrect.fp=&i; // incorrectptr=p; // correctptr=fp; // correctptr=&i; // correct

Kích thước của nhỏ trỏ void vào C

Kích thước của bé trỏ void vào C giống như với kích cỡ của con trỏ kiểu cam kết tự. Theo nhận thức của C, việc thể hiện một con trỏ thành void giống như con trỏ của kiểu ký tự. Kích thước của bé trỏ sẽ biến đổi tùy nằm trong vào căn nguyên mà bạn đang sử dụng.Hãy coi ví dụ bên dưới đây:#include  main() void *ptr = NULL; //void pointer int *p = NULL;// integer pointer char *cp = NULL;//character pointer float *fp = NULL;//float pointer //size of void pointer printf("size of void pointer = %d ",sizeof(ptr)); //size of integer pointer printf("size of integer pointer = %d ",sizeof(p)); //size of character pointer printf("size of character pointer = %d ",sizeof(cp)); //size of float pointer printf("size of float pointer = %d ",sizeof(fp)); return 0; Kết quả:

Ưu điểm của nhỏ trỏ void

Sau đó là những ưu thế của một con trỏ void:Hàm malloc () và calloc () trả về nhỏ trỏ void, vị vậy những hàm này hoàn toàn có thể được thực hiện để phân bổ bộ nhớ của ngẫu nhiên loại dữ liệu nào.#include  #include int main() int a=90; int *x = (int*)malloc(sizeof(int)) ; x=&a; printf("Value which is pointed by x pointer : %d",*x); return 0; Kết quả: Con trỏ void trong C cũng rất có thể được áp dụng để thực hiện các hàm bình thường trong C.

Xem thêm: Hãy Yêu Bản Thân Mình Trước, Hãy Yêu Thương Bản Thân Mình

Một số điểm quan trọng đặc biệt liên quan tiền đến nhỏ trỏ void là:Hủy vứt một nhỏ trỏ trống trong CCon trỏ void trong C chẳng thể được hủy đk trực tiếp. Hãy coi ví dụ dưới đây:#include  int main() int a=90; void *ptr; ptr=&a; printf("Value which is pointed by ptr pointer : %d",*ptr); return 0; trong khúc mã trên, * ptr là 1 con trỏ void đang trỏ đến vươn lên là số nguyên "a". Như bọn họ đã biết rằng con trỏ void tất yêu bị diệt đăng ký, cho nên vì vậy đoạn mã trên sẽ đưa ra lỗi thời gian biên dịch vì họ đang in trực tiếp quý giá của biến được trỏ bởi bé trỏ "ptr".Kết quả:Bây giờ, chúng tôi viết lại mã trên để loại trừ lỗi:#include  int main() int a=90; void *ptr; ptr=&a; printf("Value which is pointed by ptr pointer : %d",*(int*)ptr); return 0; trong khúc mã trên, cửa hàng chúng tôi đánh máy bé trỏ void sang bé trỏ nguyên bằng phương pháp sử dụng câu lệnh được đưa ra dưới đây:(int *) ptr;Sau đó, shop chúng tôi in cực hiếm của biến hóa được đã cho thấy bởi con trỏ void "ptr" bằng cách sử dụng câu lệnh được chỉ dẫn dưới đây:* (int *) ptr;Kết quả: Phép toán số học trên con trỏ voidChúng ta cấp thiết áp dụng các phép toán số học tập trên những con trỏ void trong C trực tiếp. Chúng ta cần áp dụng kiểu chữ cân xứng để rất có thể thực hiện các phép toán số học trên các con trỏ void.

Hãy xem ví dụ dưới đây:#include  int main() float a<4>=6.1,2.3,7.8,9.0; void *ptr; ptr=a; for(int i=0;i printf("%f,",*ptr); ptr=ptr+1; // Incorrect. ​Đoạn mã trên cho thấy thêm lỗi thời gian biên dịch " sử dụng biểu thức void " không thích hợp lệ vì chúng ta không thể vận dụng trực tiếp các phép toán số học tập trên nhỏ trỏ void, tức là ptr = ptr + 1.Hãy viết lại mã bên trên để vứt bỏ lỗi:

#include  int main() float a<4>=6.1,2.3,7.8,9.0; void *ptr; ptr=a; for(int i=0;i printf("%f,",*((float*)ptr+i)); ​Đoạn mã trên chạy thành công khi họ áp dụng câu hỏi truyền chuẩn cho con trỏ void, tức thị (float *) ptr và sau đó chúng ta áp dụng phép toán số học, tức là * ((float *) ptr + i).Kết quả:

Tại sao bọn họ sử dụng bé trỏ void?

Chúng tôi thực hiện con trỏ void vì năng lực tái sử dụng của nó. Con trỏ trống có thể lưu trữ đối tượng người dùng thuộc bất kỳ loại như thế nào và chúng ta có thể truy xuất đối tượng người sử dụng thuộc ngẫu nhiên loại nào bằng cách sử dụng toán tử con gián tiếp với đẳng cấp chữ phù hợp.Hãy hiểu qua 1 ví dụ như sau:#include  int main() int a=56; // initialization of a integer variable "a". float b=4.5; // initialization of a float variable "b". char c="k"; // initialization of a char variable "c". void *ptr; // declaration of void pointer. // assigning the address of variable "a". ptr=&a; printf("value of "a" is : %d",*((int*)ptr)); // assigning the address of variable "b". ptr=&b; printf(" value of "b" is : %f",*((float*)ptr)); // assigning the address of variable "c". ptr=&c; printf(" value of "c" is : %c",*((char*)ptr)); return 0;  Kết quả: Ezoicreport this ad
Các khóa học qua video:Lập trình C Java C# SQL server PHP HTML5-CSS3-Java
Script« Prev: thiết kế C: những hàm xử lý tập tin