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
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 uví d Con tr và m ng m t chi uví 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
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