ap-02-pointer.pdf

Upload: ba-quy

Post on 01-Jun-2018

217 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/9/2019 AP-02-Pointer.pdf

    1/27

    ConCon trỏtrỏGV.GV. NguyễnNguyễn MinhMinh HuyHuy

     

    1Kỹ thuật lập trình - Nguyễn Minh Huy

  • 8/9/2019 AP-02-Pointer.pdf

    2/27

    NộiNội dungdung

    KháiKhái niệmniệm concon trỏtrỏ..

    SửSử dụngdụng concon trỏtrỏ..

    MảngMảng vàvà concon trỏtrỏ..

    2Kỹ thuật lập trình - Nguyễn Minh Huy

  • 8/9/2019 AP-02-Pointer.pdf

    3/27

    NộiNội dungdung

    KháiKhái niệmniệm concon trỏtrỏ..

    SửSử dụngdụng concon trỏtrỏ..

    MảngMảng vàvà concon trỏtrỏ..

    3Kỹ thuật lập trình - Nguyễn Minh Huy

  • 8/9/2019 AP-02-Pointer.pdf

    4/27

    KháiKhái niệmniệm concon trỏtrỏ

    BộBộ nhớnhớ máymáy tínhtính:: RAM (RAM (RRandomandom AAccessccess MMemory).emory).

    RAMRAM dùngdùng đểđể chứachứa:: HệHệ điềuđiều hànhhành..

    LệnhLệnh ++ dữdữ liệuliệu chươngchương trìnhtrình..

     

    RAM (4GB)0

    BaoBao g mg m cáccác ôô nhớnhớ 1 byte.1 byte. RAM 4GB ~ 4RAM 4GB ~ 4 tỷtỷ ôô nhớnhớ..

    MỗiMỗi ôô nhớnhớ cócó địađịa chỉ chỉ đánhđánh sốsố từtừ 0.0.

    RAM 1GBRAM 1GB địađịa chỉ chỉ từtừ 00

    223030

     – – 1.1. RAM 4GBRAM 4GB địađịa chỉ chỉ từtừ 00 223232 – – 1.1.

    4Kỹ thuật lập trình - Nguyễn Minh Huy

    232

  • 8/9/2019 AP-02-Pointer.pdf

    5/27

    KháiKhái niệmniệm concon trỏtrỏ

    ĐịaĐịa chỉ chỉ biếnbiến:: ĐiềuĐiều gìgì xảyxảy rara khikhi khaikhai báobáo biếnbiến??

    CấpCấp mộtmột dãydãy ôô nhớnhớ liênliên tiếptiếp.. SốSố ô =ô = kíchkích thướcthước kiểukiểu dữdữ liệuliệu..

    GắnGắn têntên biếnbiến vớivới địađịa chỉ chỉ ôô đầuđầu dãydãy..

     

    ? ? ? ?

    intint xx;;

    xx

    65 66 67 6865 66 67 68

    == ..GiáGiá trịtrị biếnbiến đượcđược lưulưu thếthế nàonào??

    ChiaChia giágiá trịtrị biếnbiến thànhthành cáccác byte.byte.

    LưuLưu mỗimỗi bytebyte vàovào mộtmột ôô nhớnhớ..

    ThứThứ tựtự lưulưu byte:byte: thấpthấp đếnđến caocao..

    ThứThứ tựtự lưulưu vàovào ôô nhớnhớ:: đầuđầu đếnđến cuốicuối dãydãy..

    5Kỹ thuật lập trình - Nguyễn Minh Huy

    xx = 1057;= 1057;

    33 4 0 0xx 65 66 67 6865 66 67 68

  • 8/9/2019 AP-02-Pointer.pdf

    6/27

    KháiKhái niệmniệm concon trỏtrỏ

    KiểuKiểu địađịa chỉ chỉ trongtrong C:C:MỗiMỗi biếnbiến cócó mộtmột địađịa chỉ chỉ..

    ĐịaĐịa chỉ chỉ biếnbiến cócó kiểukiểu: **.. BiếnBiến intint cócó địađịa chỉ chỉ kiểukiểu intint *.*.

    ToánToán tửtử &&::

    CôngCông dụngdụng:: lấylấy địađịa chỉ chỉ củacủa biếnbiến.. CúCú pháppháp:: &&;

    intint x = 1057;x = 1057;float y = 1.25;float y = 1.25;

    intint **dia_chi_xdia_chi_x == &&x;x;float *float *dia_chi_ydia_chi_y == &&y;y;

    6Kỹ thuật lập trình - Nguyễn Minh Huy

    xx = 1057;= 1057;

    33 4 0 0xx

    65 66 67 6865 66 67 68

    65 0 0 0dia_chi_xdia_chi_x91 92 93 9491 92 93 94

  • 8/9/2019 AP-02-Pointer.pdf

    7/27

    KháiKhái niệmniệm concon trỏtrỏ

    ConCon trỏtrỏ trongtrong C:C: LàLà biếnbiến cócó kiểukiểu địađịa chỉ chỉ..

    NhậnNhận giágiá trịtrị làlà địađịa chỉ chỉ củacủa biếnbiến kháckhác.. KíchKích thướcthước concon trỏtrỏ::

    BằngBằng nhaunhau dùdù kháckhác kiểukiểu địađịa chỉ chỉ..

    BằngBằng kíchkích thướcthước địađịa chỉ chỉ RAM.RAM. TùyTùy thuộcthuộc vàovào hệhệ máymáy tínhtính..

    VíVí dụdụ::-- HệHệ máymáy 1616--bit, 2 bytes (64KB)bit, 2 bytes (64KB)

    -- HệHệ máymáy 3232--bit, 4 bytes (4GB)bit, 4 bytes (4GB)

    7Kỹ thuật lập trình - Nguyễn Minh Huy

  • 8/9/2019 AP-02-Pointer.pdf

    8/27

    NộiNội dungdung

    KháiKhái niệmniệm concon trỏtrỏ..

    SửSử dụngdụng concon trỏtrỏ..

    MảngMảng vàvà concon trỏtrỏ..

    8Kỹ thuật lập trình - Nguyễn Minh Huy

  • 8/9/2019 AP-02-Pointer.pdf

    9/27

    SửSử dụngdụng concon trỏtrỏ

    KhaiKhai báobáo concon trỏtrỏ:: KhaiKhai báobáo biếnbiến cócó kiểukiểu địađịa chỉ chỉ..

    CáchCách 1:1: **;

    intint **p1;p1; // Con// Con trỏtrỏ kiểukiểu int.int.  **   ..

    CáchCách 2:2:typedef typedef  ** ;

    ;

    typedef typedef intint ** ConTroIntConTroInt;;typedef typedef floatfloat ** ConTroFloatConTroFloat;;ConTroIntConTroInt p1;p1;ConTroFloatConTroFloat p2;p2;

    9Kỹ thuật lập trình - Nguyễn Minh Huy

  • 8/9/2019 AP-02-Pointer.pdf

    10/27

    SửSử dụngdụng concon trỏtrỏ

    KhởiKhởi tạotạo concon trỏtrỏ:: ConCon trỏtrỏ vừavừa khaikhai báobáo chưachưa nhậnnhận địađịa chỉ chỉ nàonào..

    TToánoán tửtử &&:: khởikhởi tạotạo địađịa chỉ chỉ chocho concon trỏtrỏ.. = &&;

    intint x;x;**  

    ConCon trỏtrỏ kiểukiểu gìgì thìthì chỉ chỉ nhậnnhận địađịa chỉ chỉ củacủa biếnbiến kiểukiểu đóđó!!!!float y;float y;intint **q =q = &&y;y; //// SaiSai..

    ĐịaĐịa chỉ chỉ NULL:NULL: ĐịaĐịa chỉ chỉ rỗngrỗng,, khôngkhông thuộcthuộc ôô nhớnhớ nàonào..

    DùngDùng đểđể khởikhởi tạotạo địađịa chỉ chỉ mặcmặc địnhđịnh chocho concon trỏtrỏ..

    intint **r =r = NULLNULL;; // r// r nhậnnhận địađịa chỉ chỉ rỗngrỗng..

    10Kỹ thuật lập trình - Nguyễn Minh Huy

  • 8/9/2019 AP-02-Pointer.pdf

    11/27

    SửSử dụngdụng concon trỏtrỏ

    TruyTruy xuấtxuất nộinội dungdung vùngvùng nhớnhớ:: ToánToán tửtử **::

    CôngCông dụngdụng:: truytruy xuấtxuất nộinội dungdung vùngvùng nhớnhớ concon trỏtrỏ giữgiữ địađịa chỉ chỉ.. CúCú pháppháp: = **;

    intint x = 5;x = 5;**  ==

    intint k =k = *p*p;; //// lấylấy giágiá trịtrị củacủa x.x.printf printf(“%d(“%d\\n”,n”, pp);); //// XuấtXuất địađịa chỉ chỉ x.x.printf printf(“%d(“%d\\n”,n”, *p*p);); //// XuấtXuất giágiá trịtrị x.x.printf printf(“%d(“%d\\n”,n”, &p&p););//// XuấtXuất địađịa chỉ chỉ p.p.

    ConCon trỏtrỏ ““trỏtrỏ”” đếnđến vùngvùng nhớnhớ nónó giữgiữ địađịa chỉ chỉ!!!!

    11Kỹ thuật lập trình - Nguyễn Minh Huy

    5 0 0 0xx72 73 74 7572 73 74 75

    72 0 0 0pp91 92 93 9491 92 93 94

  • 8/9/2019 AP-02-Pointer.pdf

    12/27

    SửSử dụngdụng concon trỏtrỏ

    TruyềnTruyền thamtham sốsố concon trỏtrỏ:: TruyềnTruyền thamtham trịtrị::

    NhậnNhận vàovào: con: con trỏtrỏ,, địađịa chỉ chỉ biếnbiến.. LàmLàm việcviệc trêntrên bảnbản saosao concon trỏtrỏ..

    GiáGiá trịtrị concon trỏtrỏ KHÔNGKHÔNG thaythay đổiđổi..

      ““ ””

    voidvoid foofoo((intint **g)g){{

    *g = *g + 1;*g = *g + 1;

    g = g + 1;g = g + 1;}}

    voidvoid mainmain()() 

    CÓ THỂCÓ THỂ bịbị thaythay đổiđổi..

    12Kỹ thuật lập trình - Nguyễn Minh Huy

    intint x = 5;x = 5;intint *p = &x;*p = &x;

    foofoo((pp););

    foofoo((&x&x););//// GiáGiá trịtrị xx đổiđổi..}}

    main()

    5 0 0 0xx

    72 73 74 7572 73 74 75

    72 0 0 0pp91 92 93 9491 92 93 94

    foo(int *g)

    72 0 0 0gg66 67 68 6966 67 68 69

  • 8/9/2019 AP-02-Pointer.pdf

    13/27

    SửSử dụngdụng concon trỏtrỏ

    TruyềnTruyền thamtham sốsố concon trỏtrỏ:: TruyềnTruyền thamtham chiếuchiếu::

    NhậnNhận vàovào:: chỉ chỉ concon trỏtrỏ.. LàmLàm việcviệc trêntrên bảnbản gốcgốc concon trỏtrỏ..

    GiáGiá trịtrị concon trỏtrỏ CÓ THỂCÓ THỂ thaythay đổiđổi..

      ““ ””

    voidvoid foofoo((intint *&*&g)g){{

    *g = *g + 1;*g = *g + 1;

    g = g + 1g = g + 1}}

    voidvoid mainmain()() 

    CÓ THỂCÓ THỂ bịbị thaythay đổiđổi..

    13Kỹ thuật lập trình - Nguyễn Minh Huy

    intint x = 5;x = 5;intint *p = &x;*p = &x;

    foofoo((pp););

    foofoo((&x&x); //); // SaiSai//// GiáGiá trịtrị xx đổiđổi..//// GiáGiá trịtrị pp đổiđổi..

    }}

    main()

    5 0 0 0xx

    72 73 74 7572 73 74 75

    foo(int *&g)

    72 0 0 0pp91 92 93 9491 92 93 94

    gg

  • 8/9/2019 AP-02-Pointer.pdf

    14/27

    SửSử dụngdụng concon trỏtrỏ

    ConCon trỏtrỏ cấucấu trúctrúc::GiữGiữ địađịa chỉ chỉ biếnbiến cấucấu trúctrúc..

    KhaiKhai báobáo:: CáchCách 1: **;

    CáchCách 2:2: typedef typedef  ** ;

      < nn concon r r >;>;

    structstruct PhanSoPhanSo{{

    intint tutu,, maumau;;

    };};typedef typedef PhanSoPhanSo ** ConTroPhanSoConTroPhanSo;;

    PhanSoPhanSo **p;p;

    ConTroPhanSoConTroPhanSo q;q;

    14Kỹ thuật lập trình - Nguyễn Minh Huy

  • 8/9/2019 AP-02-Pointer.pdf

    15/27

    SửSử dụngdụng concon trỏtrỏ

    ConCon trỏtrỏ cấucấu trúctrúc:: TruyTruy xuấtxuất thànhthành phầnphần::

    CáchCách 1:1: (*(*)).; CáchCách 2: -->>;

    PhanSoPhanSo **p;p;

    (*(*pp))..tutu = 1;= 1;pp-->>maumau = 2;= 2;

    (*(*qq))..tutu = 1;= 1;qq-->>maumau = 3;= 3;

    15Kỹ thuật lập trình - Nguyễn Minh Huy

  • 8/9/2019 AP-02-Pointer.pdf

    16/27

    NộiNội dungdung

    KháiKhái niệmniệm concon trỏtrỏ..

    SửSử dụngdụng concon trỏtrỏ..

    MảngMảng vàvà concon trỏtrỏ..

    16Kỹ thuật lập trình - Nguyễn Minh Huy

  • 8/9/2019 AP-02-Pointer.pdf

    17/27

    MảngMảng vàvà concon trỏtrỏ

    MảngMảng trongtrong C:C: LàLà mộtmột concon trỏtrỏ..

    GiữGiữ địađịa chỉ chỉ phầnphần tửtử đầuđầu tiêntiên..voidvoid mainmain()(){{

    printf printf(“%d(“%d\\n”,n”, aa););printf printf(“%d(“%d\\n”,n”, &a[0]&a[0]);); // a == &a[0].// a == &a[0].

    }}

    17Kỹ thuật lập trình - Nguyễn Minh Huy

    1 0 0 0aa72 73 74 7572 73 74 75

    2 0 0 0 3 0 0 076 77 78 7976 77 78 79 80 81 82 8380 81 82 83

    a[0]a[0] a[1]a[1] a[2]a[2]

  • 8/9/2019 AP-02-Pointer.pdf

    18/27

    MảngMảng vàvà concon trỏtrỏ

    ConCon trỏtrỏ đếnđến mảngmảng:: TruyTruy xuấtxuất mảngmảng giángián tiếptiếp..

    XétXét đoạnđoạn chươngchương trìnhtrình sausau::intint a[100] = { 1, 2, 3 };a[100] = { 1, 2, 3 };intint *p = a*p = a;;* = ** = *

    printf printf(“%d(“%d\\n”, *p);n”, *p); CơCơ chếchế hoạthoạt độngđộng::

    18Kỹ thuật lập trình - Nguyễn Minh Huy

    1 0 0 0aa72 73 74 7572 73 74 75

    2 0 0 0 3 0 0 076 77 78 7976 77 78 79 80 81 82 8380 81 82 83

    a[0]a[0] a[1]a[1] a[2]a[2]

    72 0 0 0pp44 45 46 4744 45 46 47

  • 8/9/2019 AP-02-Pointer.pdf

    19/27

    MảngMảng vàvà concon trỏtrỏ

    PhépPhép toántoán tăngtăng,, giảmgiảm concon trỏtrỏ::GiáGiá trịtrị concon trỏtrỏ tăngtăng giảmgiảm theotheo kíchkích thướcthước kiểukiểu dữdữ liệuliệu..

    CôngCông thứcthức:: +/-- k = +/-- k *k * sizeof sizeof().

    intint a[100] = { 1, 2, 3 };a[100] = { 1, 2, 3 };**

    printf printf(“%d(“%d\\n”,n”, p + 1p + 1););printf printf(“%d(“%d\\n”,n”, *(p + 2)*(p + 2) ););

    19Kỹ thuật lập trình - Nguyễn Minh Huy

    1 0 0 0aa72 73 74 7572 73 74 75

    2 0 0 0 3 0 0 076 77 78 7976 77 78 79 80 81 82 8380 81 82 83

    a[0]a[0] a[1]a[1] a[2]a[2]

    72 0 0 0pp44 45 46 4744 45 46 47 p + 1p + 1 p + 2p + 2

  • 8/9/2019 AP-02-Pointer.pdf

    20/27

    MảngMảng vàvà concon trỏtrỏ

    ToánToán tửtử [ ]:[ ]: TruyTruy xuấtxuất nộinội dungdung vùngvùng nhớnhớ concon trỏtrỏ giữgiữ địađịa chỉ chỉ..

    CôngCông thứcthức::)

    intint a[100] = { 1, 2, 3 };a[100] = { 1, 2, 3 };**

    a[2] = 5;a[2] = 5;*(a + 2) = 5;*(a + 2) = 5;*(p + 2) = 5;*(p + 2) = 5;

    p[2] = 5;p[2] = 5;

    20Kỹ thuật lập trình - Nguyễn Minh Huy

  • 8/9/2019 AP-02-Pointer.pdf

    21/27

    MảngMảng vàvà concon trỏtrỏ

    TruyềnTruyền thamtham sốsố mảngmảng:: KhôngKhông phảiphải truyềntruyền tấttất cảcả mảngmảng..

    Chỉ Chỉ truyềntruyền địađịa chỉ chỉ phầnphần tửtử đầuđầu tiêntiên.. ThamTham sốsố mảngmảng làlà concon trỏtrỏ ““trỏtrỏ”” đếnđến phầnphần tửtử đầuđầu tiêntiên..

    voidvoid xuatMangxuatMang((intint a[ ]a[ ],, intint n) {n) { for (for (intint ii = 0;= 0; ii < n;< n; ii++)++)

    printf printf(“%d “,(“%d “, *(a++)*(a++) );); //// TươngTương tựtự a[a[ ii ]]}}voidvoid mainmain() {() {

    intint a[100];a[100];xuatMangxuatMang((aa, 100);, 100);for (for (intint ii = 0;= 0; ii < n;< n; ii++)++)

    printf printf(“%d “,(“%d “, *(a++)*(a++) );); //// SaiSai..}}

    21Kỹ thuật lập trình - Nguyễn Minh Huy

    ắắ

  • 8/9/2019 AP-02-Pointer.pdf

    22/27

    TómTóm tắttắt

    KháiKhái niệmniệm concon trỏtrỏ:: BiếnBiến cócó kiểukiểu làlà địađịa chỉ chỉ..

    SửSử dụngdụng concon trỏtrỏ:: KhaiKhai báobáo: *.

      ..

    ToánToán tửtử *:*: truytruy xuấtxuất nộinội dungdung vùngvùng nhớnhớ..

    MảngMảng vàvà concon trỏtrỏ::

    MảngMảng trongtrong CC làlà mộtmột hằnghằng concon trỏtrỏ.. ConCon trỏtrỏ cócó thểthể ““trỏtrỏ”” đếnđến vùngvùng nhớnhớ mảngmảng..

    ToánToán tửtử [ ]:[ ]: truytruy nộinội dungdung vùngvùng nhớnhớ mảngmảng..

    22Kỹ thuật lập trình - Nguyễn Minh Huy

  • 8/9/2019 AP-02-Pointer.pdf

    23/27

    BàiBài tậptập

    BàiBài tậptập 2.1:2.1:ChoCho đoạnđoạn chươngchương trìnhtrình sausau::void main()void main()

    {{intint *x, y;*x, y;float *z;float *z;

    y = 2;y = 2;z = &y;z = &y;*x = *x + y;*x = *x + y;printf printf(“%d”, y);(“%d”, y);

    }}

    a)a) ĐoạnĐoạn chươngchương trìnhtrình trêntrên cócó lỗilỗi gìgì??

    b)b) HãyHãy thửthử sửasửa lạilại chocho đúngđúng..

    23Kỹ thuật lập trình - Nguyễn Minh Huy

  • 8/9/2019 AP-02-Pointer.pdf

    24/27

    BàiBài tậptập

    BàiBài tậptập 2.2:2.2:ChoCho đoạnđoạn chươngchương trìnhtrình sausau::void main()void main()

    {{doubledouble m[100];m[100];doubledouble *p1, *p2;*p1, *p2;

    p1 = m;p1 = m;p2 = &m[6];p2 = &m[6];}}

    HãyHãy chocho biếtbiết p1p1 cáchcách p2p2 baobao nhiêunhiêu byte?byte?

    24Kỹ thuật lập trình - Nguyễn Minh Huy

    BàiBài tậtậ

  • 8/9/2019 AP-02-Pointer.pdf

    25/27

    BàiBài tậptập

    BàiBài tậptập 2.3:2.3:HãyHãy giảigiải thíchthích sựsự kháckhác nhaunhau giữagiữa 33 hàmhàm sausau::void swap1(void swap1(intint x,x, intint y)y)

    {{intint temp = x;temp = x;x = y;x = y; = tem= tem

    void swap3(void swap3(intint *x,*x, intint *y)*y)

    {{intint temp = *x;temp = *x;*x = *y;*x = *y;* = tem* = tem 

    }}

    void swap2(void swap2(intint &x,&x, intint &y)&y){{

    intint temp = x;temp = x;

    x = y;x = y;y = temp;y = temp;

    }}

    25Kỹ thuật lập trình - Nguyễn Minh Huy

     

    }}

    BàiBài tậtậ

  • 8/9/2019 AP-02-Pointer.pdf

    26/27

    BàiBài tậptập

    BàiBài tậptập 2.4:2.4:HãyHãy chocho biếtbiết kếtkết quảquả xuấtxuất rara mànmàn hìnhhình củacủa đoạnđoạn chươngchương trìnhtrình sausau::#include

    void main()void main(){{

    intint x = 1023x = 1023 

    char *p = (char *)&x;char *p = (char *)&x;

    printf printf(“%d %d %d %d(“%d %d %d %d\\n”, p[0], p[1], p[2], p[3]);n”, p[0], p[1], p[2], p[3]);}}

    26Kỹ thuật lập trình - Nguyễn Minh Huy

    BàiBài tậtậ

  • 8/9/2019 AP-02-Pointer.pdf

    27/27

    BàiBài tậptập

    BàiBài tậptập 2.5:2.5:ViếtViết chươngchương trìnhtrình sửsử dụngdụng concon trỏtrỏ đểđể thựcthực hiệnhiện::

    a)a) NhậpNhập mảngmảng NN phânphân sốsố từtừ bànbàn phímphím..

    b)b) XuấtXuất rara mànmàn hìnhhình mảngmảng phânphân sốsố theotheo thứthứ tựtự giảmgiảm dầndần..

    27Kỹ thuật lập trình - Nguyễn Minh Huy