chuong 4 mang, chuoi, con tro

47
Chương 4 - Mảng, Chuổi, Con t Chương 4 - Mảng, Chuổi, Con t rỏ rỏ 1 Mảng, Chuỗi và Con trỏ Mảng, Chuỗi và Con trỏ Mảng, chuỗi, con trỏ Mảng, chuỗi, con trỏ Mối quan hệ giữa con trỏ với Mối quan hệ giữa con trỏ với mảng và chuỗi mảng và chuỗi Hàm với con trỏ, mảng và chuỗi Hàm với con trỏ, mảng và chuỗi Cấp phát và giải phóng bộ nhớ Cấp phát và giải phóng bộ nhớ động động

Upload: man-nguyen-van

Post on 01-Dec-2014

1.977 views

Category:

Documents


6 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 11

Mảng, Chuỗi và Con trỏMảng, Chuỗi và Con trỏ

Mảng, chuỗi, con trỏMảng, chuỗi, con trỏ Mối quan hệ giữa con trỏ với mảng và Mối quan hệ giữa con trỏ với mảng và chuỗichuỗi Hàm với con trỏ, mảng và chuỗiHàm với con trỏ, mảng và chuỗi Cấp phát và giải phóng bộ nhớ độngCấp phát và giải phóng bộ nhớ động

Page 2: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 22

MảngMảngMảng:Mảng: là một tập hợp nhiều biến có cùng kiểu là một tập hợp nhiều biến có cùng kiểu dữ liệu và cùng têndữ liệu và cùng tên– Các phần tử của mảng đựơc truy xuất thông qua Các phần tử của mảng đựơc truy xuất thông qua

chỉ số.chỉ số.

<kieu_du_lieu> <ten_mang> <ds_cac_chieu><kieu_du_lieu> <ten_mang> <ds_cac_chieu>Ví dụ:Ví dụ: int a[10], b[3][2]; int a[10], b[3][2];Chỉ số mảng:Chỉ số mảng:– Là một số int (bắt đầu từ 0)Là một số int (bắt đầu từ 0)– Không vượt qua kích thước của mảngKhông vượt qua kích thước của mảng

Lấy địa chỉ của phần tử mảng:Lấy địa chỉ của phần tử mảng: &ten_bien[i] &ten_bien[i]– Note: Tên của mảng sẽ chứa địa chỉ đầu của Note: Tên của mảng sẽ chứa địa chỉ đầu của

mảngmảngVí dụ: int a[10]; Ví dụ: int a[10]; a=&a[0]a=&a[0];;

Page 3: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 33

Nhập xuất dữ liệu cho các phần tử Nhập xuất dữ liệu cho các phần tử mảngmảng

Cách 1:Cách 1: Nhập trực tiếp Nhập trực tiếpDùng được với mảng 1 chiều và mảng hai chiều kiểu intDùng được với mảng 1 chiều và mảng hai chiều kiểu int

Ví dụ:Ví dụ:int i, a[5];int i, a[5];for(i=0;i<5;i++)for(i=0;i<5;i++){{

printf(“\na[%d] = ”,i);printf(“\na[%d] = ”,i);scanf(“%d”,scanf(“%d”,&a[i]&a[i]););

}}for(int i=0;i<5;i++)for(int i=0;i<5;i++)

Printf(“%d ”,a[i]);Printf(“%d ”,a[i]);

Page 4: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 44

Nhập xuất dữ liệu cho các phần tử Nhập xuất dữ liệu cho các phần tử mảngmảng

Cách 2:Cách 2: Nhập gián tiếp Nhập gián tiếpDùng được cho cả mảng 1 chiều và đa chiềuDùng được cho cả mảng 1 chiều và đa chiều

Ví dụ:Ví dụ:float temp, a[3][3];float temp, a[3][3];for(int i=0;i<3;i++)for(int i=0;i<3;i++)

for(int j=0;j<3;j++)for(int j=0;j<3;j++){{

printf(“a[%d][%d] = ”,i,j);printf(“a[%d][%d] = ”,i,j);scanf(“%f”,scanf(“%f”,&temp&temp););a[i][j]=tempa[i][j]=temp;;

}}for(int i=0;i<3;i++)for(int i=0;i<3;i++){{

printf(“\n”);printf(“\n”);for(int j=0;j<3;j++)for(int j=0;j<3;j++){{

printf(“%.2f ”,a[i][j]);printf(“%.2f ”,a[i][j]);

}}}}

Page 5: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 55

Biến, mảng nộiBiến, mảng nội

Đinh nghĩa:Đinh nghĩa: các biến (mảng) khai báo bên các biến (mảng) khai báo bên trong thân của một hàm.trong thân của một hàm.Thời gian tồn tại:Thời gian tồn tại: bắt đầu làm việc với hàm bắt đầu làm việc với hàm đến khi hàm đó kết thúc.đến khi hàm đó kết thúc.Phạm vi sử dụng:Phạm vi sử dụng: bên trong hàm được khai bên trong hàm được khai báobáoQui tắc khởi đầu:Qui tắc khởi đầu:– Dùng toán tử gánDùng toán tử gán– Giá trị của nó sẽ Giá trị của nó sẽ không xác địnhkhông xác định nếu không nếu không

được khởi tạođược khởi tạo

Page 6: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 66

Ví dụ minh họaVí dụ minh họa

int a[3]={10,20,30};int a[3]={10,20,30};static int b[2][3]={{10,20,30},{11,21,31}};static int b[2][3]={{10,20,30},{11,21,31}};

for(int i=0;i<3;i++)for(int i=0;i<3;i++)printf(“a[%d] = %d\t”,i,a[i]);printf(“a[%d] = %d\t”,i,a[i]);

for (int hang=0;hang<2;hang++)for (int hang=0;hang<2;hang++){{

for(int cot=0;cot<3;cot++)for(int cot=0;cot<3;cot++)printf(“%5d\t”,a[hang][cot]);printf(“%5d\t”,a[hang][cot]);printf(“\n”);printf(“\n”);

}}

Page 7: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 77

Biến, mảng ngoạiBiến, mảng ngoại

Định nghĩa:Định nghĩa: các biến (mảng) khai báo các biến (mảng) khai báo bên ngoài các hàmbên ngoài các hàm

Thời gian tồn tại:Thời gian tồn tại: suốt chương trình suốt chương trình

Phạm vi sử dụng:Phạm vi sử dụng: từ vị trí nó được khai từ vị trí nó được khai báo đến cuối chương trìnhbáo đến cuối chương trình

Qui tắc khởi đầu: (next slide)Qui tắc khởi đầu: (next slide)

Page 8: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 88

Các qui tắc khởi đầu đối với biến, Các qui tắc khởi đầu đối với biến, mảng ngoại – R1mảng ngoại – R1

Khởi đầu một lần vào lúc dịch chương Khởi đầu một lần vào lúc dịch chương trình bằng cách dùng toán tử gán và các trình bằng cách dùng toán tử gán và các biểu thức hằng.biểu thức hằng.– Nếu không được khởi đầu, máy sẽ gán giá trị Nếu không được khởi đầu, máy sẽ gán giá trị

0.0.

Ví dụ:Ví dụ:long x=24*9*2345;long x=24*9*2345;float a[3]={5.4,2.0,6.1};float a[3]={5.4,2.0,6.1};int b[3][2]={{1,2},{3,4},{5,6}};int b[3][2]={{1,2},{3,4},{5,6}};

Page 9: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 99

Có thể không cần chỉ ra kích thước Có thể không cần chỉ ra kích thước mảng khi khởi đầumảng khi khởi đầu. Khi đó máy tính sẽ . Khi đó máy tính sẽ dành cho mảng một khỏang nhớ đủ để dành cho mảng một khỏang nhớ đủ để nhận danh sách giá trị khởi đầu.nhận danh sách giá trị khởi đầu.

Ví dụ:Ví dụ:float a[]={2.5,7,1.2};float a[]={2.5,7,1.2};

int b[][4]={{1,2,3,4},{5,6,7,8}};int b[][4]={{1,2,3,4},{5,6,7,8}};

Các qui tắc khởi đầu đối với biến, Các qui tắc khởi đầu đối với biến, mảng ngoại – R2mảng ngoại – R2

Page 10: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 1010

Các qui tắc khởi đầu đối với biến, Các qui tắc khởi đầu đối với biến, mảng ngoại – R3mảng ngoại – R3

Khi chỉ ra kích thước mảng, Khi chỉ ra kích thước mảng, kích thước kích thước này cần không nhỏ hơn kích thước bộ này cần không nhỏ hơn kích thước bộ khởi đầukhởi đầu

Ví dụ:Ví dụ:float a[5]={2.5,7,1.2};float a[5]={2.5,7,1.2};

int b[6][4]={{1,2,3,4},{5,6,7,8}};int b[6][4]={{1,2,3,4},{5,6,7,8}};

Page 11: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 1111

Các qui tắc khởi đầu đối với biến, Các qui tắc khởi đầu đối với biến, mảng ngoại – R4mảng ngoại – R4

Đối với mảng Đối với mảng 2 chiều2 chiều có thể khởi đầu có thể khởi đầu theo 2 cách:theo 2 cách:– float a[][3]={{5},{2.5,7,1.2},{-6,7}};float a[][3]={{5},{2.5,7,1.2},{-6,7}};– int b[10][4]={{5},{1,2,3,4},{9,3},{5,6,7,8}};int b[10][4]={{5},{1,2,3,4},{9,3},{5,6,7,8}};

Page 12: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 1212

Các qui tắc khởi đầu đối với biến, Các qui tắc khởi đầu đối với biến, mảng ngoại – R5mảng ngoại – R5

Bộ khởi đầu của một Bộ khởi đầu của một mảng charmảng char có thể: có thể:– hoặc là danh sách các hằng ký tựhoặc là danh sách các hằng ký tự– hoặc là một hằng chuỗi ký tựhoặc là một hằng chuỗi ký tự

Ví dụ:Ví dụ:char name[]={‘h’,’a’,’n’,’g’,’\0’};char name[]={‘h’,’a’,’n’,’g’,’\0’};

char name[]=“hang”;char name[]=“hang”;

char name[10]={[]={‘h’,’a’,’n’,’g’,’\0’};char name[10]={[]={‘h’,’a’,’n’,’g’,’\0’};

char name[10]=“hang”;char name[10]=“hang”;

Page 13: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 1313

Chuỗi ký tựChuỗi ký tự

Định nghĩa:Định nghĩa: một dãy các ký tự đặt trong một dãy các ký tự đặt trong hai dấu nháy kép.hai dấu nháy kép.– được cấp một mảng kiểu char: chứa cá ký tự được cấp một mảng kiểu char: chứa cá ký tự

và ‘\0’.và ‘\0’.

Nhận xét:Nhận xét: – Chuỗi ký tự là một trường hợp riêng của Chuỗi ký tự là một trường hợp riêng của

mảng một chiều khi mỗi thành phần của mảng mảng một chiều khi mỗi thành phần của mảng là một ký tự (khác nhau ở ‘\0’)là một ký tự (khác nhau ở ‘\0’)

– ‘‘A’ và “A” là khác nhau.A’ và “A” là khác nhau.

Page 14: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 1414

Ví dụ minh họa về ChuỗiVí dụ minh họa về Chuỗi

char chuoi[]=“Hello”;char chuoi[]=“Hello”;main()main(){{

printf(“Chuoi ky tu la %s. \n”,chuoi);printf(“Chuoi ky tu la %s. \n”,chuoi);printf(“cac ky tu se la: \n”);printf(“cac ky tu se la: \n”);printf(“%c\n”,chuoi[0]);printf(“%c\n”,chuoi[0]);printf(“%c\n”,chuoi[1]);printf(“%c\n”,chuoi[1]);printf(“%c\n”,chuoi[2]);printf(“%c\n”,chuoi[2]);printf(“%c\n”,chuoi[3]);printf(“%c\n”,chuoi[3]);printf(“%c\n”,chuoi[4]);printf(“%c\n”,chuoi[4]);printf(“%c\n”,chuoi[5]);printf(“%c\n”,chuoi[5]);

}}

Page 15: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 1515

Thao tác với ChuỗiThao tác với ChuỗiKhông tồn tại các phép toán so sánh, gán nội dung Không tồn tại các phép toán so sánh, gán nội dung của chuỗi này cho chuỗi khác.của chuỗi này cho chuỗi khác.#include <string.h>#include <string.h>Một số hàm thông dụng:Một số hàm thông dụng:– int strlen(char s[])int strlen(char s[])– strcpy(char dest[], char sour[])strcpy(char dest[], char sour[])– strcat(char s1[], char s2[])strcat(char s1[], char s2[])– int strcmp(char s1[], char s2[])int strcmp(char s1[], char s2[])– char *strchr(char s[]; char c); /* tim lan xuat hien dau tien cua char *strchr(char s[]; char c); /* tim lan xuat hien dau tien cua

ky tu c ky tu c trong chuoi s, tra ve trong chuoi s, tra ve dia chi cua ky tu nay*/dia chi cua ky tu nay*/

– char *strstr(char s1[], char s2[]);char *strstr(char s1[], char s2[]);– strlwrchar(char s[])strlwrchar(char s[])– strupchar(char s[])strupchar(char s[])– strset(char s[], char c)strset(char s[], char c)

Page 16: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 1616

Con trỏCon trỏCon trỏ dùng để lưu giữ địa chỉCon trỏ dùng để lưu giữ địa chỉMỗi kiểu địa chỉ cần có kiểu con trỏ tương Mỗi kiểu địa chỉ cần có kiểu con trỏ tương ứngứngVí dụ:Ví dụ:– float a[20][30], *pa, (*pm)[30];float a[20][30], *pa, (*pm)[30];

Khi đó:Khi đó:– pa=a;pa=a; // sai// sai– pm=a;pm=a; //đúng//đúng

Vì:Vì:– pa là con trỏ kiểu floatpa là con trỏ kiểu float– pm là con trỏ kiểu float[30]pm là con trỏ kiểu float[30]– a là địa chỉ kiểu float[30]a là địa chỉ kiểu float[30]

Page 17: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 1717

Các toán tử một ngôi (Toán tử & và Các toán tử một ngôi (Toán tử & và toán tử *)toán tử *)

Toán tử &:Toán tử &:– Cho địa chỉ của một đối tượngCho địa chỉ của một đối tượng– Ví dụ: p=&c;Ví dụ: p=&c; // c la bien ky tu// c la bien ky tu

Toán tử *:Toán tử *:– Cho nội dung của một đối tượng con trỏCho nội dung của một đối tượng con trỏ– Truy cập đến các đối tượng được trỏ bởi con trỏTruy cập đến các đối tượng được trỏ bởi con trỏ

Ví dụ:Ví dụ:– int x=1,y=2,z[10], *pi;int x=1,y=2,z[10], *pi;– pi=&x;pi=&x;– y=*pi;y=*pi; //y=1;//y=1;– *pi=0;*pi=0; //tu bay gio x co gia tri bang 0//tu bay gio x co gia tri bang 0– pi=&z[0];pi=&z[0]; //tu day pi chua dia chi cua z[0], tuc la dia chi //tu day pi chua dia chi cua z[0], tuc la dia chi

cua mang zcua mang z

Page 18: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 1818

Các toán tử một ngôi (tt)Các toán tử một ngôi (tt)

Các toán tử một ngôi (&, *) có độ ưu tiên Các toán tử một ngôi (&, *) có độ ưu tiên cao hơn các toán tử số học.cao hơn các toán tử số học.

Ví dụ:Ví dụ:– y=*pi+10;y=*pi+10;– *pi+=1; ++*pi; (*pi)++ là tương đương. /* các *pi+=1; ++*pi; (*pi)++ là tương đương. /* các

tóan tử * và ++ có cùng độ ưu tiên và được tóan tử * và ++ có cùng độ ưu tiên và được thực hiện tử phải qua trái*/thực hiện tử phải qua trái*/

Page 19: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 1919

Các phép toán trên con trỏCác phép toán trên con trỏ

Phép gánPhép gán

Phép tăng giảm địa chỉPhép tăng giảm địa chỉ

Phép truy cập bộ nhớPhép truy cập bộ nhớ

Phép so sánhPhép so sánh

Page 20: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 2020

Phép gánPhép gán

Chỉ nên thực hiện phép gán cho các con trỏ Chỉ nên thực hiện phép gán cho các con trỏ cùng kiểucùng kiểu– Ví dụ:Ví dụ:

int x=1,*pi,*qi;int x=1,*pi,*qi;pi=&x;pi=&x;qi=pi;qi=pi; //pi va qi cung tro den cung mot doi tuong x//pi va qi cung tro den cung mot doi tuong x

Muốn gán các con trỏ khác kiểu phải dùng phép Muốn gán các con trỏ khác kiểu phải dùng phép ép kiểuép kiểu– Ví dụ:Ví dụ:

int x;int x;char *pc;char *pc;pc = (char*) (&x);pc = (char*) (&x);

Page 21: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 2121

Phép tăng giảm địa chỉPhép tăng giảm địa chỉ

Ví dụ:Ví dụ:– float x[30], *px;float x[30], *px;– px=&x[10]; // px tro den phan tu x[10]px=&x[10]; // px tro den phan tu x[10]– px + i trỏ đến phần tử x[10+i]px + i trỏ đến phần tử x[10+i]– px – i trỏ đến phần tử x[10-1]px – i trỏ đến phần tử x[10-1]

Page 22: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 2222

Phép truy cập bộ nhớPhép truy cập bộ nhớNguyên tắc:Nguyên tắc:– Con trỏ float truy cập 4 bytesCon trỏ float truy cập 4 bytes– Con trỏ int truy cập 2 bytesCon trỏ int truy cập 2 bytes– Con tro char truy cập 1 byteCon tro char truy cập 1 byte

Ví dụ:Ví dụ:– float *pf; //*pf: 10001 ~ 10004float *pf; //*pf: 10001 ~ 10004– int pi; //*pi: 10001 ~ 10002int pi; //*pi: 10001 ~ 10002– char *pc; // *pc: 10001char *pc; // *pc: 10001

Note:Note:– Hai phép toán gán và tăng giảm địa chỉ không Hai phép toán gán và tăng giảm địa chỉ không

dùng được cho con trỏ kiểu voiddùng được cho con trỏ kiểu void

Page 23: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 2323

Phép so sánhPhép so sánh

Cho phép so sánh các con trỏ cùng kiểuCho phép so sánh các con trỏ cùng kiểu

Ví dụ:Ví dụ:– float p1,p2;float p1,p2;– p1<p2: địa chỉ p1 trỏ tới thấp hơn địa chỉ p2 p1<p2: địa chỉ p1 trỏ tới thấp hơn địa chỉ p2

trỏ tớitrỏ tới– p1=p2: bằngp1=p2: bằng– p1>p2: cao hơnp1>p2: cao hơn

Page 24: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 2424

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

Tên mảng là một hằng địa chỉ chứa địa chỉ của phần tử Tên mảng là một hằng địa chỉ chứa địa chỉ của phần tử đầu tiênđầu tiênVí dụ:Ví dụ:– float a[10] thì a = &a[0] và a+i = &(a[i]);float a[10] thì a = &a[0] và a+i = &(a[i]);

Nhận xét:Nhận xét:– Để truy xuất đến các phần tử của mảng ta có thể dùng chỉ số hoặc Để truy xuất đến các phần tử của mảng ta có thể dùng chỉ số hoặc

dùng con trỏ.dùng con trỏ.– Nếu con trỏ p trỏ vào phần tử thứ k của mảng a thì Nếu con trỏ p trỏ vào phần tử thứ k của mảng a thì p+ip+i sẽ trỏ đến sẽ trỏ đến

phần tử thứ phần tử thứ k+ik+i của mảng a. của mảng a.– Ví dụ:Ví dụ:

float a[10],*p,*q;float a[10],*p,*q;p=a; // p tro toi phan tu a[0]p=a; // p tro toi phan tu a[0]q=p+5; // q tro vao phan tu thu 5q=p+5; // q tro vao phan tu thu 5Khi đó:Khi đó: p+i = &a[i], q=&a[5]; a[i]=*(a+i)=*(p+i)=p[i] p+i = &a[i], q=&a[5]; a[i]=*(a+i)=*(p+i)=p[i]

Page 25: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 2525

Ví dụ minh họaVí dụ minh họa

main()main(){{

int a[3]={10,20,30};int a[3]={10,20,30};int *ptr;int *ptr;ptr=a;ptr=a;printf(“Noi dung cua a[0] = %d \n”,*ptr);printf(“Noi dung cua a[0] = %d \n”,*ptr);printf(“Noi dung cua a[1] = %d \n”,*(ptr+1));printf(“Noi dung cua a[1] = %d \n”,*(ptr+1));printf(“Noi dung cua a[2] = %d \n”,*(ptr+2));printf(“Noi dung cua a[2] = %d \n”,*(ptr+2));

}}

Page 26: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 2626

Ví dụ minh họa (tt)Ví dụ minh họa (tt)

/* Minh hoa viec nhap du lieu vao mang bang con tro*//* Minh hoa viec nhap du lieu vao mang bang con tro*/main()main(){{

int i, a[5],*p;int i, a[5],*p;p=a;p=a;for (i=0;i<5;i++)for (i=0;i<5;i++)

{{printf(“\n a[%d] = ”,i);printf(“\n a[%d] = ”,i);scanf(“%d”,p+i); // nhap vao dia chi &a[i]scanf(“%d”,p+i); // nhap vao dia chi &a[i]

}}

for(i=0;i<5;i++)for(i=0;i<5;i++)printf(“%d ”,*(a+i)); // hoac a[i] hoac *(p+i) hoac p[i]printf(“%d ”,*(a+i)); // hoac a[i] hoac *(p+i) hoac p[i]

}}

Page 27: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 2727

Con trỏ và chuỗi ký tựCon trỏ và chuỗi ký tự

Nhắc lại:Nhắc lại:– Khi ta khai báo một chuỗi, thì máy sẽ cung cấp một Khi ta khai báo một chuỗi, thì máy sẽ cung cấp một

vùng nhớ cho một mảng kiểu char đủ lớn để lưu các vùng nhớ cho một mảng kiểu char đủ lớn để lưu các ký tự của chuỗi và ký tự ‘\0’ký tự của chuỗi và ký tự ‘\0’

– Khi đó:Khi đó: chuỗi này là một hằng địa chỉ -> chứa địa chỉ chuỗi này là một hằng địa chỉ -> chứa địa chỉ đầu của mảng lưu giữ nó.đầu của mảng lưu giữ nó.

Ví dụ:Ví dụ:– char *p;char *p;– p=“Turbo C”p=“Turbo C”– *p=‘T’; *(p+1)=‘u’*p=‘T’; *(p+1)=‘u’– printf(“%s”,p); // in chuoi Turbo C ra man hinhprintf(“%s”,p); // in chuoi Turbo C ra man hinh

Page 28: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 2828

Ví dụ minh họaVí dụ minh họa

/* Minh hoa ve con tro chuoi *//* Minh hoa ve con tro chuoi */char s[] = “Hello”;char s[] = “Hello”;main()main(){{

char *ptr;char *ptr;ptr=s;ptr=s;printf(“Chuoi ky tu la %s. \n”,s);printf(“Chuoi ky tu la %s. \n”,s);printf(“Cac ky tu se la: \n”);printf(“Cac ky tu se la: \n”);printf(“%c\n”,*ptr);printf(“%c\n”,*ptr);printf(“%c\n”,*(ptr+1));printf(“%c\n”,*(ptr+1));printf(“%c\n”,*(ptr+2));printf(“%c\n”,*(ptr+2));printf(“%c\n”,*(ptr+3));printf(“%c\n”,*(ptr+3));printf(“%c\n”,*(ptr+4));printf(“%c\n”,*(ptr+4));printf(“%c\n”,*(ptr+5));printf(“%c\n”,*(ptr+5));

}}

Page 29: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 2929

Ví dụ minh họa (tt)Ví dụ minh họa (tt)

/* Minh hoa ve dia chi con tro trong chuoi *//* Minh hoa ve dia chi con tro trong chuoi */char s[] = “Hello”;char s[] = “Hello”;main()main(){{

char *ptr;char *ptr;ptr=s;ptr=s;printf(“Chuoi ky tu la %s. \n”,s);printf(“Chuoi ky tu la %s. \n”,s);printf(“Cac dia chi va ky tu tuong ung se la: \n”);printf(“Cac dia chi va ky tu tuong ung se la: \n”);printf(“Dia chi : %d, noi dung: %c\n”,ptr,*ptr);printf(“Dia chi : %d, noi dung: %c\n”,ptr,*ptr);printf(“Dia chi : %d, noi dung: %c\n”,ptr+1,*(ptr+1));printf(“Dia chi : %d, noi dung: %c\n”,ptr+1,*(ptr+1));printf(“Dia chi : %d, noi dung: %c\n”,ptr+2,*(ptr+2));printf(“Dia chi : %d, noi dung: %c\n”,ptr+2,*(ptr+2));printf(“Dia chi : %d, noi dung: %c\n”,ptr+3,*(ptr+3));printf(“Dia chi : %d, noi dung: %c\n”,ptr+3,*(ptr+3));printf(“Dia chi : %d, noi dung: %c\n”,ptr+4,*(ptr+4));printf(“Dia chi : %d, noi dung: %c\n”,ptr+4,*(ptr+4));printf(“Dia chi : %d, noi dung: %c\n”,ptr+5,*(ptr+5));printf(“Dia chi : %d, noi dung: %c\n”,ptr+5,*(ptr+5));

}}

Page 30: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 3030

Ví dụ minh họa (tt)Ví dụ minh họa (tt)

Xét đoạn chương trình:Xét đoạn chương trình:– char *p,t[25];char *p,t[25];– t=“Turbo C”t=“Turbo C”– scanf(“%s”,t);scanf(“%s”,t);– scanf(“%s”,p);scanf(“%s”,p);

Chổ nào không hợp lệ?Chổ nào không hợp lệ?

Trả lời:Trả lời: dòng t=“Turbo C” là không hợp lệ. Vì t là dòng t=“Turbo C” là không hợp lệ. Vì t là một hằng địa chỉ chứa địa chỉ của mảng gồm 25 một hằng địa chỉ chứa địa chỉ của mảng gồm 25 ký tự, chứ không phải là một biến con trỏ.ký tự, chứ không phải là một biến con trỏ.

Page 31: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 3131

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

Không phải mọi quy tắc đúng với mảng một chiều đều có thể đem Không phải mọi quy tắc đúng với mảng một chiều đều có thể đem ra áp dụng đối với mảng nhiều chiềura áp dụng đối với mảng nhiều chiềuPhép toán lấy địa chỉ nói chung không dùng được đối với các thành Phép toán lấy địa chỉ nói chung không dùng được đối với các thành phần của mảng nhiều chiều (trừ trường hợp mảng nhiều chiều các phần của mảng nhiều chiều (trừ trường hợp mảng nhiều chiều các số nguyên)số nguyên)Ví dụ:Ví dụ:float a[10][20];float a[10][20];int i,j,n=5;int i,j,n=5;for(i=0;i<n;i++)for(i=0;i<n;i++)

for(j=0;j<n;j++)for(j=0;j<n;j++){{

printf(“a[%d][%d] = ”,i,j)printf(“a[%d][%d] = ”,i,j)scanf(“%f”,&a[i][j]); // ERRORscanf(“%f”,&a[i][j]); // ERROR

}}

Giải pháp:Giải pháp:– (float *)a+i*N+j;(float *)a+i*N+j; // N la kich thuoc cot cuc dai cua mang hai chieu// N la kich thuoc cot cuc dai cua mang hai chieu

Page 32: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 3232

Mảng các con trỏMảng các con trỏ

Cú pháp:Cú pháp: type *pointer_array[size]; type *pointer_array[size];– Ví dụ:Ví dụ: char *ma[10]; char *ma[10];

Ý nghĩa:Ý nghĩa: mảng ma gồm 10 phần tử, mỗi phần tử mảng ma gồm 10 phần tử, mỗi phần tử là một con trỏ kiểu char, dùng để lưu trữ 10 địa là một con trỏ kiểu char, dùng để lưu trữ 10 địa chỉ của 10 chuỗi ký tự nào đó.chỉ của 10 chuỗi ký tự nào đó.– Ta có được một mảng đặc biệt gồm các biến mà vị trí Ta có được một mảng đặc biệt gồm các biến mà vị trí

thực sự của chúng trong bộ nhớ là bất kỳ.thực sự của chúng trong bộ nhớ là bất kỳ.– Nếu đổi chổ các con trỏ thành phần, có thể đổi thứ tự Nếu đổi chổ các con trỏ thành phần, có thể đổi thứ tự

sắp xếp của các biến trong con trỏ này mà không cần sắp xếp của các biến trong con trỏ này mà không cần thay đổi thực sự vị trí của chúng.thay đổi thực sự vị trí của chúng.

Page 33: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 3333

Ví dụVí dụint I,j,*x;*ptr_array[6];int I,j,*x;*ptr_array[6];int d=10,e=3,f=7,a=12,b=2,c=6;int d=10,e=3,f=7,a=12,b=2,c=6;ptr_array[0]=&a;ptr_array[0]=&a;ptr_array[1]=&b;ptr_array[1]=&b;ptr_array[2]=&c;ptr_array[2]=&c;ptr_array[3]=&d;ptr_array[3]=&d;ptr_array[4]=&e;ptr_array[4]=&e;ptr_array[5]=&f;ptr_array[5]=&f;for(i=0;i<5;i++)for(i=0;i<5;i++)

for(j=i+1;j<6;j++)for(j=i+1;j<6;j++)if(*ptr_array[i]>*ptr_array[j])if(*ptr_array[i]>*ptr_array[j]){{

x=ptr_array[i];x=ptr_array[i];ptr_array[i]=ptr_array[j];ptr_array[i]=ptr_array[j];ptr_array[j]=x;ptr_array[j]=x;

}}

for(i=0;i<6;i++)for(i=0;i<6;i++)printf(“%d \n”,*ptr_array[i]);printf(“%d \n”,*ptr_array[i]);

Page 34: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 3434

Mảng các con trỏ (tt)Mảng các con trỏ (tt)

Nếu các phần tử của các con trỏ thành phần lại Nếu các phần tử của các con trỏ thành phần lại được gán địa chỉ của các mảng khác -> ta được được gán địa chỉ của các mảng khác -> ta được một mảng các mảng.một mảng các mảng.

Không giống như các mảng hai chiều, các mảng Không giống như các mảng hai chiều, các mảng con ở đây có thể ở vị trí bất kỳ.con ở đây có thể ở vị trí bất kỳ.

Vì ta chỉ lưu điạ chỉ của chúng, nên việc sắp xếp Vì ta chỉ lưu điạ chỉ của chúng, nên việc sắp xếp lại các thứ tự các mảng này với nhau thực chất lại các thứ tự các mảng này với nhau thực chất chỉ là việc sắp xếp lại các địa chỉ của chúng chỉ là việc sắp xếp lại các địa chỉ của chúng trong mảng các con trỏ mà thôi.trong mảng các con trỏ mà thôi.

Page 35: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 3535

Ví dụ minh họaVí dụ minh họa

Viết chương trình nhận nhiều tên người Viết chương trình nhận nhiều tên người vào từ bàn phím, sắp xếp lại theo thứ tự vào từ bàn phím, sắp xếp lại theo thứ tự và in ra kết quả đã sắp xếp ra.và in ra kết quả đã sắp xếp ra.

Page 36: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 3636

char name[20],*p, *strlist[100];char name[20],*p, *strlist[100];int i,j,len,nlines=0;int i,j,len,nlines=0;while(nlines<100)while(nlines<100){{

printf(“Nhap ten thu %d”,nlines+1);printf(“Nhap ten thu %d”,nlines+1);gets(name);gets(name);if((len=strlen(name))==0) break;if((len=strlen(name))==0) break;if((p=(char*)malloc(len+1))==NULL) break; // cap phat vung bo nho cho con tro pif((p=(char*)malloc(len+1))==NULL) break; // cap phat vung bo nho cho con tro pstrcpy(p,name);strcpy(p,name);strlist[nlines++]=p;strlist[nlines++]=p;if(nlines==0) printf(“Khong doc duoc ten nhap vao”);if(nlines==0) printf(“Khong doc duoc ten nhap vao”);elseelse{{

for(i=0;i<nlines-1;i++)for(i=0;i<nlines-1;i++)for(j=i+1;j<nlines;j++)for(j=i+1;j<nlines;j++)if(strcmp(strlist[i],strlist[j])>0)if(strcmp(strlist[i],strlist[j])>0){{

p=strlist[i];p=strlist[i];strlist[i]=strlist[j];strlist[i]=strlist[j];strlist[j]=p;strlist[j]=p;

}}for(i=0;i<nlines;i++) // in danh sach len man hinhfor(i=0;i<nlines;i++) // in danh sach len man hinh

printf(“%d - %s\n”,i+1,strlist[i]);printf(“%d - %s\n”,i+1,strlist[i]);for(i=0;i<nlines;i++) // giai phong vung bo nho da cap phatfor(i=0;i<nlines;i++) // giai phong vung bo nho da cap phat

free(strlist[i]);free(strlist[i]);}}

}}

Page 37: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 3737

Mảng nhiều chiều vs. mảng các con Mảng nhiều chiều vs. mảng các con trỏtrỏ

Nhược:Nhược:– Mảng nhiều chiều:Mảng nhiều chiều: cần chỗ cho tất cả các phần tử cần chỗ cho tất cả các phần tử– Mảng con trỏ:Mảng con trỏ: chỉ cấp bộ nhớ để lưu biến con trỏ, chỉ cấp bộ nhớ để lưu biến con trỏ,

việc xin chỗ cho các mảng (con) và gán địa chỉ của việc xin chỗ cho các mảng (con) và gán địa chỉ của chúng cho các con trỏ là công việc của chúng ta.chúng cho các con trỏ là công việc của chúng ta.

Ưu:Ưu:– Việc truy xuất đến các phần tử là truy xuất gián tiếp Việc truy xuất đến các phần tử là truy xuất gián tiếp

thông qua con trỏ => vị trí của các mảng con là bất thông qua con trỏ => vị trí của các mảng con là bất kỳkỳ

– Sắp xếp mảng:Sắp xếp mảng:Mảng con trỏ:Mảng con trỏ: hoán chuyển bản thân các con trỏ trong hoán chuyển bản thân các con trỏ trong mảng(cha).mảng(cha).Mảng nhiều chiều:Mảng nhiều chiều: hoán chuyển vị trí của toàn bộ phần tử hoán chuyển vị trí của toàn bộ phần tử trong mảng con.trong mảng con.

Page 38: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 3838

Con trỏ chỉ đến con trỏCon trỏ chỉ đến con trỏ

Khái niệm:Khái niệm:– Con trỏ là một kiểu dữ liệuCon trỏ là một kiểu dữ liệu– Một biến con trỏ cũng có địa chỉMột biến con trỏ cũng có địa chỉ– Và ta vẫn có thể lấy địa chỉ của nó được => Và ta vẫn có thể lấy địa chỉ của nó được =>

con trỏ chỉ đến một con trỏ khác.con trỏ chỉ đến một con trỏ khác.

Cú pháp:Cú pháp: type **ptr_ptr; type **ptr_ptr;– Ví dụ:Ví dụ: int **ptr_ptr; int **ptr_ptr;

Ý nghĩa:Ý nghĩa: đối tượng của biến ptr_ptr là một đối tượng của biến ptr_ptr là một con trỏ chỉ đến một biến số kiểu con trỏ chỉ đến một biến số kiểu typetype..

Page 39: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 3939

Ví dụ minh họaVí dụ minh họa

Xét ví dụ:Xét ví dụ:char *monthname[20] = char *monthname[20] =

{“Jan”,”Feb”,”Mar”,”Apr”,”May”,”Jun”,”Jul”,”Aug”,”Sep”,{“Jan”,”Feb”,”Mar”,”Apr”,”May”,”Jun”,”Jul”,”Aug”,”Sep”,”Ocr”,”Nov”,”Dec”};”Ocr”,”Nov”,”Dec”};

char **pp;char **pp;pp=monthname;pp=monthname;

Ý nghĩa:Ý nghĩa:– *pp trỏ đến con trỏ đầu tiên của mảng con trỏ *pp trỏ đến con trỏ đầu tiên của mảng con trỏ

monthname (tối đa 20 phần tử )monthname (tối đa 20 phần tử )– Con trỏ đầu tiên này lại trỏ đến chuỗi “Jan”.Con trỏ đầu tiên này lại trỏ đến chuỗi “Jan”.– Nếu tăng pp lên 1, thì pp sẽ chỉ đến “Feb”…Nếu tăng pp lên 1, thì pp sẽ chỉ đến “Feb”…

Page 40: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 4040

Hàm, con trỏ và mảngHàm, con trỏ và mảng

Nếu tham số thực là tên mảng Nếu tham số thực là tên mảng aa (một (một chiều) kiểu int (float, double,…), thì đối chiều) kiểu int (float, double,…), thì đối (tham số hình thức) (tham số hình thức) papa tương ứng phải là tương ứng phải là con trỏ hoặc mảng hình thức kiểu int con trỏ hoặc mảng hình thức kiểu int (float, double,…)(float, double,…)Ta có thể khai báo Ta có thể khai báo papa theo hai cách: theo hai cách:– int *pa;int *pa; // hoac float, double,…// hoac float, double,…– int pa[]int pa[] // hoac float, double,…// hoac float, double,…

Page 41: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 4141

Ví dụ minh họaVí dụ minh họa

main()main(){{int a[]={10,20,30};int a[]={10,20,30};ham_1(a);ham_1(a);}}void ham_1(int *pa)void ham_1(int *pa) //hoac pa[]//hoac pa[]{{

printf(“Noi dung cua a[0] = %d\n”,pa[0]); //hoac *(pa)printf(“Noi dung cua a[0] = %d\n”,pa[0]); //hoac *(pa)printf(“Noi dung cua a[1] = %d\n”,pa[1]); //hoac *(pa+1)printf(“Noi dung cua a[1] = %d\n”,pa[1]); //hoac *(pa+1)printf(“Noi dung cua a[0] = %d\n”,pa[2]); //hoac *(pa+2)printf(“Noi dung cua a[0] = %d\n”,pa[2]); //hoac *(pa+2)

}}

Page 42: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 4242

Hàm và chuỗi ký tựHàm và chuỗi ký tự

Nếu tham số thực là tên chuỗi ký tự Nếu tham số thực là tên chuỗi ký tự chch, tham số hình , tham số hình thức của hàm được khai báo:thức của hàm được khai báo:– char chuoi[]char chuoi[]– char *chuoi;char *chuoi;

Ví dụ:Ví dụ:main()main(){{

char s[20];char s[20];pritnf(“Ten em la gi?”);pritnf(“Ten em la gi?”);gets(s);gets(s);ham_in(s);ham_in(s);

}}void ham_in(char chuoi[])void ham_in(char chuoi[]) //hoac *chuoi//hoac *chuoi{{

printf(“%s yeu dau cua long toi!”,chuoi);printf(“%s yeu dau cua long toi!”,chuoi);}}

Page 43: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 4343

Hàm và mảng đa chiềuHàm và mảng đa chiều

float a[50][30];float a[50][30];Nếu tham số thực là tên mảng 2 chiều Nếu tham số thực là tên mảng 2 chiều aaLàm thế nào để có thể dùng tên mảng hai chiều Làm thế nào để có thể dùng tên mảng hai chiều aa trong lời gọi hàm.trong lời gọi hàm.Cách 1:Cách 1: (khai báo một trong 2 cách) (khai báo một trong 2 cách)– float (*pa)[30];float (*pa)[30];– float pa[][30];float pa[][30];– Truy cập phần tử a[i][j] dùng pa[i][j].Truy cập phần tử a[i][j] dùng pa[i][j].

Cách 2:Cách 2: (dùng 2 đối) (dùng 2 đối)– float *pa;float *pa;– int N;int N;– Truy cập phần tử a[i][j], dùng công thức *(pa+i*N+j).Truy cập phần tử a[i][j], dùng công thức *(pa+i*N+j).

Page 44: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 4444

Ví dụ minh họaVí dụ minh họa/*Ham va mang hai chieu giai bai toan tinh tong cot dau tien cua ma tran*//*Ham va mang hai chieu giai bai toan tinh tong cot dau tien cua ma tran*/main()main(){{

static int a[2][3] = {{1,2,3},{4,5,6}};static int a[2][3] = {{1,2,3},{4,5,6}};int hang,cot, tong_cot_dau;int hang,cot, tong_cot_dau;for(hang=0;hang<2;hang++)for(hang=0;hang<2;hang++){{

for(cot=0;cot<3;cot++)for(cot=0;cot<3;cot++)printf(“%d”,a[hang][cot]);printf(“%d”,a[hang][cot]);

printf(“\n\n”);printf(“\n\n”);}}tong_cot_dau = congcot(a);tong_cot_dau = congcot(a);printf(“Tong cot dau tien la %d”,tong_cot_dau);printf(“Tong cot dau tien la %d”,tong_cot_dau);

}}int cong_cot(int pa[][3])int cong_cot(int pa[][3]){{

int h, tongcot=0;int h, tongcot=0;for(h=0;h<2;h++)for(h=0;h<2;h++)

tongcot+=pa[h][0];tongcot+=pa[h][0];return tong_cot;return tong_cot;

}}

Page 45: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 4545

Cấp phát và giải phóng bộ nhớ Cấp phát và giải phóng bộ nhớ độngđộng

Cấp phát bộ nhớ khi thực hiện chương trìnhCấp phát bộ nhớ khi thực hiện chương trình

stdlib.h và alloc.hstdlib.h và alloc.h

Hàm malloc();Hàm malloc();– void *malloc(size_t void *malloc(size_t sizesize))– Ép kiểu:Ép kiểu: lưu một loại dữ liệu xác định nào đó lưu một loại dữ liệu xác định nào đó

int *num;int *num;

num=(int*)malloc(50*sizeof(int));num=(int*)malloc(50*sizeof(int));

– Toán tử Toán tử sizeofsizeof: kích cở tính theo byte của một kiểu : kích cở tính theo byte của một kiểu dữ liệu (int, float, …)dữ liệu (int, float, …)

Page 46: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 4646

Ví dụ minh họaVí dụ minh họa

/* cap phat bo nho dung malloc *//* cap phat bo nho dung malloc */main()main(){{

void *v;void *v;if((v=malloc(100))==NULL)if((v=malloc(100))==NULL){{

printf(“Khong du bo nho”);printf(“Khong du bo nho”);exit(1);exit(1);

}}printf(“Bo nho da duoc cap phat”);printf(“Bo nho da duoc cap phat”);

}}

Page 47: Chuong 4   mang, chuoi, con tro

Chương 4 - Mảng, Chuổi, Con trỏChương 4 - Mảng, Chuổi, Con trỏ 4747

Giải phóng vùng bộ nhớGiải phóng vùng bộ nhớHàm free()Hàm free()– void free(void *ptr)void free(void *ptr)

Ví dụ:Ví dụ:int i,j;int i,j;printf(“Nhap so phan tu”);printf(“Nhap so phan tu”);scanf(“%d”,&i);scanf(“%d”,&i);num=(int*)malloc(i*sizeof(int));num=(int*)malloc(i*sizeof(int));for(j=0;j<i;j++)for(j=0;j<i;j++){{

printf(“\n Ky tu thu %d”,j);printf(“\n Ky tu thu %d”,j);scanf(“ %d”,num+j);scanf(“ %d”,num+j);

}}for(j=0;j<I;j++)for(j=0;j<I;j++)

printf(“%c \n”,*(num+j));printf(“%c \n”,*(num+j));

free(num);free(num);