Tham khảo tài liệu ''ngôn ngữ lập trình c và c++'', công nghệ thông tin, kỹ thuật lập trình phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả
Trang 1Ch ng 7*: M t s ch đ nâng cao
7*.1 Con tr
a) Con tr null:
− Là con tr mà không tr t i đâu c
− Không th s d ng toán t * đ l y giá tr c a con tr null N u làm nh v y thì d n
t i l i run-time
− Con tr null có ích khi dùng trong danh sách liên k t (linked-list) ho c hàm s tr v con tr null trong tr ng h p hàm có l i (v i hàm tr v m t con tr )
b) Con tr void:
− Tr t i m t ki u ch a xác đ nh
− Ng i ta c ng không th l y giá tr c a con tr void ho c s d ng toán t s h c v i
nó nh ng nó có th d dàng chuy n thành con tr thu c ki u khác
c) Con tr tr t i con tr : (pointer to pointer): Là con tr ch a đ a ch c a con tr khác
int i = 5, j = 6; k = 7;
int *ip1 = &i, *ip2 = &j;
int **ipp; // Con tr tr t i con tr
7*.2 Tham chi u:
Trang 2int i; int &ir = i; // đ t ir là bí danh c a i – là cách g i khác cho bi n i
î Thay vì gán i = 8; có th vi t ir = 8;
− So sánh tham chi u và con tr
o Gi ng: u ch a đ a ch c a bi n
Ví d :
swap2(int &a, int &b) {
int t=a; a=b; b=t;
}
int x,y; swap2(x, y);
ho c int &dx = x, &dy = y;
swap2(dx, dy);
o Khác: Tham chi u ph i đ c kh i t o (tr t i 1 bi n), con tr có th tr đ n NULL Con tr có th thay đ i đ a ch tr t i, còn tham chi u thì không
7*.3 Qu n lý b nh :
− C cung c p 3 cách riêng bi t đ c p phát b nh cho các đ i t ng
o C p phát t nh: Không gian nh cho các đ i t ng (bi n, h ng, hàm v.v.) đ c cung c p vào th i đi m biên d ch Nh ng đ i t ng này s t n t i ch ng nào ph n
đo n mã nh phân ch a chúng còn t n t i
o C p phát t đ ng: các đ i t ng có th đ c l u tr vào các stack Không gian
nh này đ c t đ ng gi i phóng và tái s d ng sau khi kh i câu l nh s d ng chúng không còn tác d ng n a
o C p phát đ ng: Các kh i nh v i ki u mong mu n có th đ c yêu c u vào th i
đi m ch y s d ng các hàm trong th vi n nh malloc() t m t vùng nh
đ c g i là heap Nh ng kh i nh này s đ c s d ng tái s d ng sau khi hàm
th vi n free đ c g i
− Nh ng cách ti p c n này là phù h p trong nh ng tình hu ng khác nhau
− C p phát t đ ng ho c c p phát t nh th ng hay đ c s d ng vì vi c l u tr đ c trình biên d ch qu n lý, giúp l p trình viên tránh kh i nh ng sai sót d g p ph i khi
ph i t mình c p phát và gi i phóng b nh
− Ví d : C p phát s d ng malloc và free
Trang 3o C p phát đ ng cho m ng 1 chi u:
scanf("%d", &n);
int memsize = n*sizeof(int);
if ( (arr = (int *)malloc(memsize) ) == NULL ) {
printf("Khong cap phat duoc bo nho");
exit(1);
}
//
free(arr);
o C p phát đ ng cho m ng 2 chi u:
float **ptr;
int m,n,i;
//Kh i t o m ng ptr[m][n]
//Kh i t o chi u th nh t c a m ng
ptr=(float **)malloc(m*sizeof(*ptr));
for(i=0;i<m;i++)
//Kh i t o chi u th hai c a m ng
ptr[i]=(float*)malloc(n*sizeof(**ptr));
//Xóa vùng d li u đã c p phát
for(i=0;i<m;i++)
free(ptr);
7*.4 Hàm – Tham s , tr tr v
a) L u gi giá tr c a bi n sau khi k t thúc hàm:
}
b) Truy n m ng cho hàm:
int GetMax(int arr[], int n) {
int max = arr[0];
Trang 4int GetMax2(int *arr, int n) {
int max = *arr;
for(i=1; i<n; i++) {
max = ( max<*(arr+i) )?*(arr+i):max;
}
}
c) Truy n m ng hai chi u cho hàm:
func(int a[5][7]) { /* ÚNG */
}
func(int a[][7]){ /* ÚNG */
}
func(int (*a)[7]){ /* ÚNG */
}
nh sau là sai:
func(int **a) { /* SAI! */
}
d) Hàm tr v m t m ng:
int *Bsort(int *a, int N) {
int i, j;
for (i=0; i<N-1; i++) {
for (j=i+1; j<N; j++) {
if (a[i] > a[j]) {
int temp = a[i];
} }
}
}
Trang 5e) Hàm tr v m t xâu ký t :
− Ví d 1:
char *month_name(int n)
{
static char *name[] = {
"Illegal month",
"January", "February", "March",
"April", "May", "June",
"July", "August", "September",
"October", "November", "December"
};
return (n < 1 || n > 12) ? name[0] : name[n]; }
− Ví d 2:
char *itoa(int n) {
char retbuf[25];
sprintf(retbuf, "%d", n);
return retbuf;
} // SAI
char *itoa(int n) {
char *retbuf = malloc(25);
if(retbuf == NULL)
return NULL;
sprintf(retbuf, "%d", n);
return retbuf;
} // ÚNG
char *itoa(int n) {
static char retbuf[25];
sprintf(retbuf, "%d", n);
return retbuf;
} // ÚNG
char *itoa(int n, char buf[]) {
sprintf(buf, "%d", n);
return buf;
} // ÚNG