Moät soá kieán thöùc cô sôû veà laäp trình baèng ngoân ngöõ C

Phaâàn tröôùc | Muïc luïc | Phaâàn sau

XI. Kieán thöùc cô sôû veà con troû (pointer)

Noäi dung:

Vôùi phaàn naøy ta laøm quen vôùi moät trong nhöõng ñoái töôïng quan troïng nhaä cuûa ngoân ngöõ C – con troû (pointer):

 

Bieán con troû

Con troû laø moät bieán duøng ñeå chæ vaøo vò trí moät bieán khaùc theå hieän qua ñòa chæ cuûa bieán ñoù trong boä nhôù. Cho neân con troû coøn goïi laø bieán ñòa chæ.

Toùan töû Address-of (&)

Toùan töû & aùp ñaët leân moät bieán naøo ñoù seõ cho ta bieát ñòa chæ cuûa bieán ñoù trong boä nhôù.

long int x, y;
y = &x;
 
Ví duï:
 
1:  /* Obtaining addresses */
2:  #include <stdio.h>
3:
4:  main()
5:  {
6:     char  c;
7:     int   x;
8:     float y;
9:
10:    printf("c: address=0x%p, content=%c\n", &c, c);
11:    printf("x: address=0x%p, content=%d\n", &x, x);
12:    printf("y: address=0x%p, content=%5.2f\n", &y, y);
13:    c = `A';
14:    x = 7;
15:    y = 123.45;
16:    printf("c: address=0x%p, content=%c\n", &c, c);
17:    printf("x: address=0x%p, content=%d\n", &x, x);
18:    printf("y: address=0x%p, content=%5.2f\n", &y, y);
19:    return 0;
20: }

Keát quaû:

c: address=0x1AF4, content=@
x: address=0x1AF2, content=-32557
y: address=0x1AF6, content=0.00
c: address=0x1AF4, content=A
x: address=0x1AF2, content=7
y: address=0x1AF6, content=123.45
 

Ghi chuù

Ñaëc taû format %p duøng trong printf() ñöôïc hoã trôï theo ANSI. Tuy nhieân neáu boä bieân dòch khoâng cho pheùp, coù theå duøng %u hoaëc %lu.

Khai baùo con troû

 
data-type  *pointer-name;

Ví duï:

char *ptr_c;    /* declare a pointer to a character */
 
int  *ptr_int;  /* declare a pointer to an integer */
 
float *ptr_flt; /* declare a pointer to a floating-point */
 
Ví duï:
 
1:  /* Declaring and assigning values to pointers */
2:  #include <stdio.h>
3:
4:  main()
5:  {
6:     char  c, *ptr_c;
7:     int   x, *ptr_x;
8:     float y, *ptr_y;
9:
10:    c = `A';
11:    x = 7;
12:    y = 123.45;
13:    printf("c: address=0x%p, content=%c\n", &c, c);
14:    printf("x: address=0x%p, content=%d\n", &x, x);
15:    printf("y: address=0x%p, content=%5.2f\n", &y, y);
16:    ptr_c = &c;
17:       printf("ptr_c: address=0x%p, content=0x%p\n", &ptr_c, ptr_c);
18:       printf("*ptr_c => %c\n", *ptr_c);
19:    ptr_x = &x;
20:       printf("ptr_x: address=0x%p, content=0x%p\n", &ptr_x, ptr_x);
21:       printf("*ptr_x => %d\n", *ptr_x);
22:    ptr_y = &y;
23:       printf("ptr_y: address=0x%p, content=0x%p\n", &ptr_y, ptr_y);
24:       printf("*ptr_y => %5.2f\n", *ptr_y);
25:    return 0;
26: }

Keát quaû:

c: address=0x1B38, content=A
x: address=0x1B36, content=7
y: address=0x1B32, content=123.45
ptr_c: address=0x1B30, content=0x1B38
*ptr_c => A
ptr_x: address=0x1B2E, content=0x1B36
*ptr_x => 7
ptr_y: address=0x1B2C, content=0x1B32
*ptr_y => 123.45

Toùan töû dereference (*)

Toùan töû ñôn bieán * aùp ñaët leân moät bieán con troû seõ cho ta noäi dung hoaëc giaù trò cuûa bieán maø bieán con troû chæ ñeán.

Vi duï :
char  c, *ptr_c;
char   x;
float y, *ptr_y;
c = `A';
ptr_c = &c;
x = *ptr_c;

Ta thaáy, bieán x seõ coù giaù trò nhö c, töùc laø x=’A’.

Con troû troáng (Null Pointer)

Con troû troáng laø con troû coù giaù trò baèng 0, noù khoâng chæ ñeán moät bieán döõ lieäu cuï theå naøo caû.

Ví duï:

char *ptr_c;
int  *ptr_int;
 
ptr_c = ptr_int = 0;

Thay ñoåi giaù trò bieán thoâng qua con troû

Ví duï:
 
1:  /* Changing values via pointers */
2:  #include <stdio.h>
3:
4:  main()
5:  {
6:     char  c,  *ptr_c;
7:
8:     c = `A';
9:     printf("c: address=0x%p, content=%c\n", &c, c);
10:    ptr_c = &c;
11:       printf("ptr_c: address=0x%p, content=0x%p\n", &ptr_c, ptr_c);
12:       printf("*ptr_c => %c\n", *ptr_c);
13:    *ptr_c = `B';
14:       printf("ptr_c: address=0x%p, content=0x%p\n", &ptr_c, ptr_c);
15:       printf("*ptr_c => %c\n", *ptr_c);
16:    printf("c: address=0x%p, content=%c\n", &c, c);
17:    return 0;
18: }

Keát quaû:

c: address=0x1828, content=A
ptr_c: address=0x1826, content=0x1828
*ptr_c => A
ptr_c: address=0x1826, content=0x1828
*ptr_c => B
c: address=0x1828, content=B

Moät bieán coù theå coù nhieàu bieán con troû khaùc nhau cuøng chæ ñeán noù

Ví duï:
 
1:  /* Pointing to the same thing */
2:  #include <stdio.h>
3:
4:  main()
5:  {
6:     int x;
7:     int *ptr_1, *ptr_2, *ptr_3;
8:
9:     x = 1234;
10:    printf("x: address=0x%p, content=%d\n", &x, x);
11:    ptr_1 = &x;
12:    printf("ptr_1: address=0x%p, content=0x%p\n", &ptr_1, ptr_1);
13:       printf("*ptr_1 => %d\n", *ptr_1);
14:    ptr_2 = &x;
15:    printf("ptr_2: address=0x%p, content=0x%p\n", &ptr_2, ptr_2);
16:       printf("*ptr_2 => %d\n", *ptr_2);
17:    ptr_3 = ptr_1;
18:    printf("ptr_3: address=0x%p, content=0x%p\n", &ptr_3, ptr_3);
19:       printf("*ptr_3 => %d\n", *ptr_3);
20:    return 0;
21: }

Keát quaû:

x: address=0x1838, content=1234
ptr_1: address=0x1834, content=0x1838
*ptr_1 => 1234
ptr_2: address=0x1836, content=0x1838
*ptr_2 => 1234
ptr_3: address=0x1832, content=0x1838
*ptr_3 => 1234

Baøi taäp

  1. Cho 3 bieán integer , x = 512, y = 1024, vaø z = 2048. Vieát chöông trình hieån thò ñòa chæ vaønoäi dung cuûa 3 bieán treân.
  2. Vieát chöông trình thay ñoåi giaù trò cuûa flt_num ban ñaàu laø 123.45 thaønh 543.21 duøng bieán con troû.
  3. Cho bieán kyù töï ch = ‘A’. Vieát chöông trình thay ñoåi giaù trò cuûa coäng hoøa thaønh soá thöù töï 66 baèng bieán con troû.
  4. Cho 2 bieán x=5 vaø y=6. Vieát chöông trình tính x*y vaø löu tröõ giaù trò trong x, taát caû duøng pointer.

 

Phaâàn tröôùc | Muïc luïc | Phaâàn sau