Con trỏ Con trỏ

ươ

Ch

ng 8

ụ ụ

ọ ọ M c tiêu bài h c M c tiêu bài h c

ử ụ ể ề ỏ ỏ  Tìm hi u v  con tr  và khi nào thì s  d ng con tr

ử ụ ế ỏ ử ỏ  Cách s  d ng bi n con tr  và các toán t con tr

ỏ  Gán giá tr  cho con tr ị

 Phép toán trên con trỏ

 So sánh con trỏ

ỏ ộ  Con tr  và m ng m t chi u ề ả

ề ỏ  Con tr  và m ng nhi u chi u ề ả

Elementary Programming with C/Session 8/ Slide 2 of 30

ể ấ ộ ớ  Tìm hi u cách c p phát b  nh

ỏ ỏ Con tr  là gì? Con tr  là gì?

ớ ủ ế ế ỏ ộ ộ ỉ  Con tr  là m t bi n, nó ch a đ a ch  ô nh   c a m t bi n khác ứ ị

ứ ị ế ế ế ế ộ ộ  N u m t bi n ch a đ a ch  c a m t bi n khác, thì bi n này  ỉ ủ

ượ ọ ứ ỏ tr  đ n đ c g i là con tr ế ỏ ế  bi n th  hai

ấ ỏ ươ ứ ế ế ấ  Con tr  cung c p ph ị ng th c truy xu t gián ti p đ n giá tr

ầ ử ữ ệ ộ ủ c a m t ph n t d  li u

ể ữ ệ ơ ả ể ỏ ế ế ỏ  Các con tr  có th  tr  đ n các bi n có ki u d  li u c  b n

ữ ệ ậ ợ nh  ư int, char, double, hay d  li u t p h p nh ư m ngả  ho c ặ c u ấ

Elementary Programming with C/Session 8/ Slide 3 of 30

trúc.

ỏ ượ ử ụ ỏ ượ ử ụ

ể ể

c s  d ng đ  làm  c s  d ng đ  làm

Con tr  đ Con tr  đ gì?gì?

ố ể ả ề

ỏ ơ

Các tình hu ng con tr  có th  đ  Đ  tr  v  nhi u h n m t giá tr  t ề

ể ượ ử ụ c s  d ng:  ị ừ ộ  m t

ế

m t hàm đ n

hàm ể ộ ể

 Đ  truy n m ng và chu i t ỗ ừ ộ ả ơ ệ m t hàm khác thu n ti n h n  Đ  làm vi c v i các ph n t ầ ử ủ ệ ớ

ả ầ ử

c a m ng  ấ ự ế thay vì truy xu t tr c ti p vào các ph n t này

ấ ộ

 Đ  c p phát b  nh  và truy xu t b  nh   ớ ớ

Elementary Programming with C/Session 8/ Slide 4 of 30

ể ấ ấ

ớ ự ế

ộ (C p phát b  nh  tr c ti p)

ế ế

ỏ ỏ

Bi n con tr Bi n con tr

Khai báo con tr : ch  ra m t ki u c  s  và  ỉ c đ t tr m t tên bi n đ

ể ơ ở ế ượ ặ ướ ở ấ * c b i d u

ổ Cú pháp khai báo t ng quát:

type *name;

Ví d :ụ

int *var2;

Elementary Programming with C/Session 8/ Slide 5 of 30

ử ử

ỏ ỏ

Các toán t Các toán t

con tr  con tr

ử ặ

 Hai toán t

đ c bi

ỏ   ệ ượ ử ụ c s  d ng v i con tr : *

ả ề ị

t đ và& ớ  m t ngôi và nó tr  v  đ a ch  ô nh

 & là toán t ử ộ ạ ủ c a toán h ng

var2 = &var1;  ử * là ph n b  xung c a toán t ổ

ử ộ

ử &. Đây    ị ứ

ớ ượ

ỏ ế

ế

Toán t là toán t trong vùng nh  đ

ủ ả ề  m t ngôi và nó tr  v  giá tr  ch a  ở c tr  đ n b i bi n con tr temp = *var2;

Elementary Programming with C/Session 8/ Slide 6 of 30

ỏ ỏ

ị ố ớ ị ố ớ Gán tr  đ i v i con tr Gán tr  đ i v i con tr

ỏ c gán cho con tr

 Các giá tr  có th  đ ị thông qua toán t

ể ượ  ử &.

ptr_var = &var;  ượ ư ỉ ủ

ế

đây đ a ch  c a var đ

c l u vào bi n

Ở ptr_var.

ể ế

 Cũng có th  gán giá tr  cho con tr  thông  ỏ qua m t bi n con tr  khác tr  có cùng   ki u.ể

ptr_var = &var;

ptr_var2 = ptr_var;

Elementary Programming with C/Session 8/ Slide 7 of 30

ỏ ỏ

ế

ị ố ớ ị ố ớ tr  đ i v i con tr  (tt) GánGán  tr  đ i v i con tr  (tt)  Có th  gán giá tr  cho các bi n thông  ị ể qua con tr  ỏ

*ptr_var = 10;

ế

ị ỏ ế

ệ ế

 Câu l nh trên gán giá tr  10 cho bi n  var n u ptr_var đang tr  đ n var

Elementary Programming with C/Session 8/ Slide 8 of 30

ể ự

 Ch  có th  th c hi n phép toán c ng và tr  trên

Phép toán con trỏ Phép toán con trỏ ỉ con trỏ

c l u tr  t

i đ a ch

int var, * ptr_var; ptr_var = & var; var = 500; ptr_var ++;  ả ử ế var đ  s  bi n  ị ư

 Gi ỉ 1000 ượ ư  ptr_var l u giá tr  1000. Vì s  nguyên có kích

ướ

ữ ạ ị ố ể

c là  2   bytes, nên sau bi u th c  “ptr_var+

th ị +;” ptr_var s  có giá tr  là 1002 mà không là  1001

Elementary Programming with C/Session 8/ Slide 9 of 30

Phép toán con tr  (tt)ỏ Phép toán con tr  (tt)ỏ

Elementary Programming with C/Session 8/ Slide 10 of 30

Phép toán con tr  (tt)ỏ Phép toán con tr  (tt)ỏ

ỏ ế

ớ c tăng tr , nó tr  đ n ô nh

ỏ ế

ầ ử ứ

 M i l n con tr  đ ỏ ượ ầ ử ế ế  k  ti p  M i l n con tr  đ ỏ ượ  đ ng tr ỏ ẽ ể ữ ệ

ỗ ầ ủ c a ph n t ỗ ầ ủ c a ph n t ấ ả ướ ủ

ả ớ c gi m tr , nó tr  đ n ô nh   ướ c nó  T t c  con tr  s  tăng ho c gi m tr  theo kích  ặ ỏ ế c c a ki u d  li u mà chúng đang tr  đ n

th

Elementary Programming with C/Session 8/ Slide 11 of 30

So sánh con trỏ So sánh con trỏ

ể ượ

 Hai con tr  có th  đ

c so sánh trong m t bi u

ệ ế

ỏ ế

ế

ế

 Gi

s  ptr_a và ptr_b là hai bi n con tr  tr  đ n

ầ ử ữ ệ

ườ

ỏ ỏ ế ợ ng h p

ứ th c quan h  n u chúng tr  đ n các bi n có cùng  ể ữ ệ ki u d  li u ả ử  d  li u a và b. Trong tr các ph n t này, các phép so sánh sau là có th : ể

Elementary Programming with C/Session 8/ Slide 12 of 30

So sánh con tr  (tt)ỏ So sánh con tr  (tt)ỏ

Elementary Programming with C/Session 8/ Slide 13 of 30

ỏ ỏ

ộ ộ

ả ả

Con tr  và m ng m t  Con tr  và m ng m t  chi u ềchi u ề

ể  m ng có th

đ

ướ

ị ễ ượ  S  d ng ký hi u & tr

c m t ph n t

ầ ử

 S  d ng m t bi u th c trong đó ch  s   ỉ ố

ộ ầ ử ượ ộ  đ

c c ng vào tên c a

  Đ a ch  c a m t ph n t ầ ử ả ỉ ủ ể c bi u di n theo hai cách: ử ụ m ng.ả ử ụ ủ c a ph n t m ngả .

Elementary Programming with C/Session 8/ Slide 14 of 30

ề Ví dụ ề

ộ ộ

ỏ ỏ

ả ả Con tr  và m ng m t chi u­ Con tr  và m ng m t chi u­

#include void main(){

static int ary[10]

={1,2,3,4,5,6,7,8,9,10};

int i; for (i= 0;i<10;i++){

printf(“\ni=%d,ary[i]=%d,*(ary+i)=%d“,

i,ary[i],*(ary + i));

printf(“&ary[i]=%X,ary+i=%X”,&ary[i],

ary+i);

/*%X gives unsigned hexadecimal*/ }

Elementary Programming with C/Session 8/ Slide 15 of 30

}

ỏ ỏ

ộ ộ

ề ề

ả ả

ụ ụ Con tr  và m ng m t chi u­ví d   Con tr  và m ng m t chi u­ví d   tttt

Elementary Programming with C/Session 8/ Slide 16 of 30

ỏ ỏ

ề ề

ả ả Con tr  và m ng đa chi u Con tr  và m ng đa chi u

ể ượ ị

ư c đ nh nghĩa nh

i m t nhóm các m ng

ể ư

 M ng hai chi u có th  đ ộ ỏ ỏ ớ là m t con tr  tr  t ế ề m t chi u liên ti p nhau   Khai báo m t m ng hai chi u có th  nh  sau: ả ộ

data_type  (*ptr_var) [expr 2];

thay vì

data_type (*ptr_var) [expr1] [expr 2];

Elementary Programming with C/Session 8/ Slide 17 of 30

ỏ ỏ

ỗ ỗ Con tr  và chu i  Con tr  và chu i

#include #include void main (){

char a, str[81], *ptr; printf(“\nEnter a sentence:”); gets(str); printf(“\nEnter character to search for:”); a = getche(); ptr = strchr(str,a); /* return pointer to char*/ printf( “\nString starts at address: %u”,str); printf(“\nFirst occurrence of the character is

at address: %u ”,ptr);

printf(“\n Position of first occurrence(starting

from 0)is: % d”, ptr_str); }

Elementary Programming with C/Session 8/ Slide 18 of 30

ỗ ỗ

ỏ ỏ

Con tr  và chu i (tt) Con tr  và chu i (tt)

Elementary Programming with C/Session 8/ Slide 19 of 30

ấ ấ

ộ ớ ộ ớ C p phát b  nh   C p phát b  nh

ể ự

ườ

ớ ừ

ượ ử ộ c  s   Hàm  malloc()  là  m t  trong  các  hàm  đ ệ ệ ụ ng  xuyên  nh t  đ   th c  hi n  vi c  d ng  th ớ ộ ấ c p phát b  nh  t

vùng nh  còn t

do.

ộ ố

ố ủ Tham  s   c a  hàm

malloc()  là  m t  s   nguyên

ầ ấ

xác đ nh s  bytes c n c p phát

.

Elementary Programming with C/Session 8/ Slide 20 of 30

ộ ớ ộ ớ

ấ ấ

C p phát b  nh   (tt) C p phát b  nh   (tt)

Elementary Programming with C/Session 8/ Slide 21 of 30

Hàm free() Hàm free()

ộ i phóng b

ượ ử ụ ầ

ể ả c s  d ng đ  gi Hàm free()  đ ữ .  nh  khi nó không c n dùng n a Cú pháp:

ượ

ỏ c tr

Hàm này gi ể b i ở ptr, đ  dùng cho t

void free(void*ptr); i phóng không gian đ ươ ng lai.

ả ượ

ướ

ớ ờ ọ

c đó v i l ặ

ptr ph i đ c dùng tr hàm malloc(), calloc(), ho c realloc()

i g i  .

Elementary Programming with C/Session 8/ Slide 22 of 30

Hàm free()  ­ tt Hàm free()  ­ tt

#include #include /*required for the malloc and free functions*/ int main(){ int number; int *ptr; int i; printf("How many ints would you like store? "); scanf("%d", &number); ptr = (int *) malloc (number*sizeof(int));

/*allocate memory */ if(ptr!=NULL) {

for(i=0 ; i

Elementary Programming with C/Session 8/ Slide 23 of 30

Còn ti p…ế

Hàm free() ­ tt Hàm free() ­ tt

for(i=number ; i>0 ; i--) {

printf("%d\n",*(ptr+(i-1))); /* print out in reverse order */

}

free(ptr); /* free allocated memory */ return 0; } else { printf("\nMemory allocation failed -

not enough memory.\n");

return 1; } }

Elementary Programming with C/Session 8/ Slide 24 of 30

Hàm calloc()  Hàm calloc()

ươ

nh

t

ư ự ư malloc, nh ng đi m khác bi ượ ư c l u vào không gian

ng t calloc t ặ chính là m c nhiên giá tr  0 đ ớ ừ ấ ộ b  nh  v a c p phát

ế ầ ấ

ng các bi n c n c p

phát b  nhộ

ướ ủ

ế ỗ c c a m i bi n

ố ầ calloc yêu c u hai tham s  Tham s  th  nh t là s  l ố ượ ố ứ ấ ớ  Tham s  th  hai là kích th ố ứ Cú pháp:

void *calloc( size_t num, size_t size );

Elementary Programming with C/Session 8/ Slide 25 of 30

Hàm calloc() ­ tt Hàm calloc() ­ tt

#include #include int main() { float *calloc1, *calloc2; int i; calloc1 = (float *)calloc(3,sizeof(float)); calloc2 = (float *)calloc(3, sizeof(float)); if(calloc1!=NULL && calloc2!=NULL){ for(i=0 ; i<3 ; i++){

printf("calloc1[%d] holds %05.5f ",i,

calloc1[i]); printf("\ncalloc2[%d] holds %05.5f",

i,*(calloc2+i));

}

Còn ti p……ế

Elementary Programming with C/Session 8/ Slide 26 of 30

Hàm calloc() ­ tt Hàm calloc() ­ tt

free(calloc1); free(calloc2); return 0; } else{ printf("Not enough memory\n"); return 1; } }

Elementary Programming with C/Session 8/ Slide 27 of 30

Hàm realloc()  Hàm realloc()

ượ ấ

i cho m t vùng đã đ

c c p

ớ ố

ử ụ

realloc,

ể ấ Có th  c p phát l ằ (thêm/b t s  bytes) b ng cách s  d ng hàm  ấ ữ ệ mà không làm m t d  li u.

ế

ế

ậ realloc nh n hai tham s  Tham s  th  nh t là con tr  tham chi u đ n b   ộ ố ứ ấ

nhớ

ố ấ

ố ứ

 Tham s  th  hai là t ng s  byte mu n c p phát ổ  Cú pháp:

void *realloc( void *ptr, size_t size );

Elementary Programming with C/Session 8/ Slide 28 of 30

Hàm realloc() ­ tt Hàm realloc() ­ tt

#include #include int main(){ int *ptr; int i; ptr = (int *)calloc(5, sizeof(int *));

if(ptr!=NULL) {

*ptr = 1; *(ptr+1) = 2; ptr[2] = 4; ptr[3] = 8; ptr[4] = 16; ptr = (int *)realloc(ptr, 7*sizeof(int)); if(ptr!=NULL){ printf("Now allocating more memory...\n"); ptr[5] = 32; /* now it's legal! */ ptr[6] = 64;

Elementary Programming with C/Session 8/ Slide 29 of 30

Hàm realloc() ­ tt Hàm realloc() ­ tt

for(i=0;i<7;i++) {

printf("ptr[%d] holds %d\n", i, ptr[i]);

}

realloc(ptr,0);

/* same as free(ptr); - just fancier! */

return 0; } else { printf("Not enough memory-realloc failed.\n"); return 1; } } else { printf("Not enough memory-calloc failed.\n"); return 1; } }

Elementary Programming with C/Session 8/ Slide 30 of 30