1. Trang chủ
  2. » Công Nghệ Thông Tin

kỹ thuật lập trình C chuyên nghiệp phần 4

24 5 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 24
Dung lượng 523 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Tham khảo tài liệu ''kỹ thuật lập trình c chuyên nghiệp phần 4'', 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 1

C t ỏ

Con trỏ Con trỏ –– Pointer Pointer

„ KhaiKhai báobáo

Cá t át á tửtử ““ ”” ““**”” “ ”“ ” “+”“+”

„ CácCác toántoán tửtử ““&&”,”, ““**”,”, “=”,“=”, “+”“+”

„ NhắcNhắc lạilại vềvề truyềntruyền thamtham sốsố địađịa chỉchỉ

„ ConCon trỏtrỏ vàvà mảngmảng

„ Cấ háthát ùù hớhớ độđộ

„ CấpCấp phátphát vùngvùng nhớnhớ độngđộng

Trang 2

„ KiểuKiểu concon trỏtrỏ chocho phépphép::

… TruyềnTruyền thamtham sốsố kiểukiểu địađịa chỉchỉ

… BiểuBiểu diễndiễn cáccác kiểu,kiểu, cấucấu trúctrúc dữdữ liệuliệu độngđộng

… LưuLưu trữtrữ dữdữ liệuliệu trongtrong vùngvùng nhớnhớ heapheap

„ ConCon trỏtrỏ đãđã đượcđược sửsử dụngdụng trongtrong hàmhàm scanfscanf

Trang 3

C t ỏ

C t ỏ Kh i bá Kh i bá C C

Con trỏ

Kiể t ỏt ỏ hảihải đđ đị h hĩhĩ t êt ê ộtột kiểkiể ởở đãđãKiểu

Kiểu concon trỏtrỏ phảiphải đượcđược địnhđịnh nghĩanghĩa trêntrên mộtmột kiểukiểu cơcơ sởsở đãđãđược

được địnhđịnh nghĩanghĩa trướctrước đóđó

typedef kiểucơsở * Tênkiểu Tênkiểu; ;

typedef kiểucơsở * Tênkiểu Tênkiểu; ;

//

//PINT PINT là kiểu con trỏ là kiểu con trỏ địa chỉ vùng nhớ kiểu int địa chỉ vùng nhớ kiểu int

PINT // // 1 1 biế biế kiể kiể i t *

PINT p; p; //p, p1: biến kiểu //p, p1: biến kiểu int *

Trang 4

double* pd, e, f; /* pd là con trỏ đến double

e and f are double */

char *start, *end;

Trang 5

C t ỏ

C t ỏ T á ử “ T á ử “ ””

Con trỏ

Con trỏ Toán tử “ Toán tử “& & ””

„ ““&&””:: toántoán tửtử lấylấy địađịa chỉchỉ củacủa 11 biếnbiến

„ & :: toántoán tửtử lấylấy địađịa chỉchỉ củacủa 11 biếnbiến

„ Địa Địa chỉ chỉ của của tất tất cả cả các các biến biến trong trong chương chương trình trình đều đều đã đã được

được chỉ chỉ định định từ từ khi khi khai khai báo báo

Trang 6

char c = 'a';

char *p;

a z

Trang 8

C t ỏ NULL

Con trỏ NULL

„ GiáGiá t ịt ị đặđặ biệtbiệt đểđể hỉhỉ ằằ t ỏt ỏ khôkhô ảả lýlý ùù

„ GiáGiá trịtrị đặcđặc biệtbiệt đểđể chỉchỉ rằngrằng concon trỏtrỏ khôngkhông quảnquản lýlý vùngvùngnào

nào GiáGiá trịtrị nàynày thườngthường đượcđược dùngdùng đểđể chỉchỉ mộtmột concon trỏtrỏkhông

Trang 9

j int* p = &i;

Trang 10

q

0x1210

}

Trang 11

C t ỏ à Mả

Con trỏ và Mảng

„ BiếBiế kiểkiể ảả làlà địđị hỉhỉ tĩ htĩ h ủủ ộtột ùù hớhớ đđ áá

„ BiếnBiến kiểukiểu mảngmảng làlà địađịa chỉchỉ tĩnhtĩnh củacủa mộtmột vùngvùng nhớ,nhớ, đượcđược xácxácđịnh

định khikhi khaikhai báo,báo, khôngkhông thaythay đổiđổi trongtrong suốtsuốt chuchu kỳkỳ sốngsống

„ BiếnBiến concon trỏtrỏ làlà địađịa chỉchỉ độngđộng củacủa mộtmột vùngvùng nhớnhớ đượcđược xácxác

„ BiếnBiến concon trỏtrỏ làlà địađịa chỉchỉ độngđộng củacủa mộtmột vùngvùng nhớ,nhớ, đượcđược xácxácđịnh

định quaqua phépphép gángán địađịa chỉchỉ khikhi chươngchương trìnhtrình thựcthực thithi

#include <stdio h>

int main() {

Trang 12

… printf(“0x%04X %i 0x%04X %i\n“,

Trang 14

lệnh hàmhàm malloc,, calloc hoặchoặc toántoán tửtử new củacủa C++C++

„ VùngVùng nhớnhớ dodo lậplập trìnhtrình viênviên chỉchỉ địnhđịnh phảiphải đượcđược giảigiải phóngphóng

„ VùngVùng nhớnhớ dodo lậplập trìnhtrình viênviên chỉchỉ địnhđịnh phảiphải đượcđược giảigiải phóngphóngbằng

bằng lệnhlệnh free (malloc,(malloc, calloc)calloc) hoặchoặc toántoán tửtử delete (new)

#include <stdio.h>

int main() {

int *p = new int[10];

Trang 15

Cấ hát hát độ độ ll ll () () àà ll ll () () Cấp

Cấp phát phát động động: : malloc malloc() () và và calloc calloc() ()

Trang 16

Ví d 1 dù ll ()

Ví dụ 1: dùng malloc()

11 #include #include <stdio <stdio h> h>

1 #include #include <stdio <stdio h> h>

2 #include #include <string <string h> h>

3 #include #include <alloc <alloc h> h>

4 #include #include <process <process h> h>

5 int int main(void) main(void)

6 {{ char char *str *str;;

77 /* /* allocate allocate memory memory for for string string */ */

7 /* /* allocate allocate memory memory for for string string */ */

8 if if ((str ((str = = (char (char *) *) malloc( malloc(10 10)) )) == == NULL) NULL)

9 {{{{

10 printf("Not printf("Not enough enough memory memory to to allocate allocate buffer buffer\\n") n");;

11 exit( exit(11));; /* /* terminate terminate program program if if out out of of memory memory */ */

12 }}

Trang 17

Ví d 1 (tt)

13 /* /* copy copy "Hello" "Hello" into into string string */ */

13 /* /* copy copy "Hello" "Hello" into into string string */ */

14 strcpy(str, strcpy(str, "Hello") "Hello");;

15 /* /* display display string string */ */

Trang 18

Ví d 2 ll ()

Ví dụ 2: calloc()

11 #include #include <stdio <stdio h> h>

1 #include #include <stdio <stdio h> h>

2 #include #include <alloc <alloc h> h>

3 #include #include <string <string h> gg h>

4 int int main(void) main(void)

5 {{

6 char char *str *str = = NULL NULL;;

7 /* /* allocate allocate memory memory for for string string */ */

8 str str = = (char (char *) (( *) calloc( )) calloc(10 (( ,, 10,, sizeof(char)) sizeof(char));; ( ( )) ));;

9 /* /* copy copy "Hello" "Hello" into into string string */ */

10 strcpy(str, strcpy(str, "Hello") "Hello");;

Trang 19

Ví d 2 ll ()

Ví dụ 2: calloc()

11 /* /* display display string string */ */

11 /* /* display display string string */ */

Trang 20

Giải hó ù hớ

Giải phóng vùng nhớ

Khi

Khi th átth át khỏikhỏi hàhà áá biếbiế kh ikh i bábá tt hà ẽẽ ““biếbiế

„ KhiKhi thoátthoát khỏikhỏi hàmhàm, , cáccác biếnbiến khaikhai báobáo trongtrong hàmhàm sẽsẽ ““biếnbiếnmất

mất” ” TuyTuy nhiênnhiên cáccác vùngvùng nhớnhớ đượcđược cấpcấp phátphát độngđộng vẫnvẫn còncòntồn

tồn tạitại vàvà đượcđược ““đánhđánh dấudấu”” làlà đangđang ““đượcđược dùngdùng”” ÆÆ bộbộ nhớnhớtồn

tồn tạitại vàvà đượcđược đánhđánh dấudấu làlà đangđang đượcđược dùngdùng ÆÆ bộbộ nhớnhớcủa

của máymáy tínhtính sẽsẽ hếthết

tmpArraytmpArray = (= (intint *)*)mallocmalloc((ii ** sizeofsizeof((intint));));

tmpArraytmpArray = (= (intint ))mallocmalloc((ii sizeofsizeof((intint));));

} tmpArray ii

Trang 21

((mallocmalloc, free), free)

((mallocmalloc, free) , free) ((calloccalloc, free), free)

„ C C dùngdùng hàmhàm free free đểđể giảigiải phóngphóng vùngvùng nhớnhớ cấpcấp phátphát độngđộng

void free(void *block);

Trang 22

Cấ hát l i ù hớ ll

Cấp phát lại vùng nhớ: realloc

Đôi

Đôi khikhi húhú tt ốố ởở ộộ h ặ iảiả bớtbớt kí hkí h th ớth ớ

„ ĐôiĐôi khikhi chúngchúng tata muốnmuốn mởmở rộngrộng hoặchoặc giảmgiảm bớtbớt kíchkích thướcthướcmảng

mảng

„ CC dùngdùng hàmhàm reallocrealloc đểđể cấpcấp phátphát lạilại vùngvùng nhớnhớ thựcthực hiệnhiện

„ C C dùngdùng hàmhàm reallocrealloc đểđể cấpcấp phátphát lạilại vùngvùng nhớnhớ, , thựcthực hiệnhiệnchép

chép nộinội dung dung củacủa vùngvùng nhớnhớ cũcũ sang sang vùngvùng nhớnhớ mớimới

void *

void *reallocrealloc(void *block, (void *block, size t(( ,, size t size); size););

„ víví dụdụ::

intint **tmpArraytmpArray, N=5,i;, N=5,i;

tmpArraytmpArray ( (intint ))reallocrealloc((tmpArraytmpArray, 7);, 7);

Trang 23

Ví d ll ()

Ví dụ: realloc()

11 #i l d <#i l d < tdi htdi h>>

1. #include <#include <stdio.hstdio.h>>

2. #include <#include <alloc.halloc.h>>

7. /* allocate memory for string */

8. strstr = (char *) = (char *) mallocmalloc(10);(10);

Trang 24

9. /*/* copycopy "Hello""Hello" intointo stringstring */*/

10. strcpy(str,strcpy(str, "Hello")"Hello");;

11. printf("Stringprintf("String isis %%ss\\nn AddressAddress isis %%pp\\n",n", str,str, str)str);;

( h( h *)*) ll ( 2020))

12. strstr == (char(char *)*) realloc(str,realloc(str, 2020));;

13. printf("Stringprintf("String isis %%ss\\nn NewNew addressaddress isis %%pp\\n",n", str,str, str)str);;

14. /*/* freefree memorymemory */*/

15. free(str)free(str);;

16. returnreturn 00;;

17. }}

Ngày đăng: 08/05/2021, 19:20