lecture06 pointer string

34
Con tr- Pointer

Upload: petr

Post on 03-Oct-2015

235 views

Category:

Documents


2 download

DESCRIPTION

C

TRANSCRIPT

  • Con tr - Pointer

  • Con tr Pointer n Khai bo n Cc ton t &, *, =, + n Nhc li v truyn tham s a ch n Con tr v mng n Cp pht vng nh ng

  • Con tr Mt s l do nn s dng n Con tr l kiu d liu lu tr a ch ca cc

    vng d liu trong b nh my tnh n Kiu con tr cho php:

    Truyn tham s kiu a ch Biu din cc kiu, cu trc d liu ng Lu tr d liu trong vng nh heap

    n Con tr c s dng trong hm scanf

  • Con tr Khai bo trong C Kiu con tr phi c nh ngha trn mt kiu c s c nh ngha trc .

    typedef kiucs *Tnkiu; typedef int *PINT; //PINT l kiu con tr - a ch vng nh kiu int

    int x; PINT p; //p, p1: bin kiu int * int *p1;

  • int *pi; long int *p; float *pf; char c, d, *pc; /* c v d kiu char

    pc l con tr n char */ double *pd, e, f; /* pd l con tr n double

    e and f are double */ char *start, *end;

    Con tr Khai bo trong C

  • 0x91A2

    0x1132

    Con tr - Ton t & n &: ton t ly a ch ca 1 bin n a ch ca tt c cc bin trong chng trnh u

    c ch nh t khi khai bo

    char g = 'z'; int main() {

    char c = 'a'; char *p; p = &c; p = &g; return 0;

    }

    p c 'a'

    0x1132

    p g 'z'

    0x91A2

  • n *: ton t truy xut gi tr ca vng nh c qun l bi con tr.

    #include char g = 'z'; int main() {

    char c = 'a'; char *p; p = &c; printf("%c\n", *p); p = &g; printf("%c\n", *p); return 0;

    }

    a z

    xut gi tr do p ang qun l

    Con tr - Ton t *

    0x91A2

    0x1132 p c

    'a' 0x1132

    p g 'z'

    0x91A2

  • Con tr - Truyn tham s a ch #include void change(int *v); int main() {

    int var = 5; change(&var); printf("main: var = %i\n", var); return 0;

    } void change(int *v) {

    (*v) *= 100; printf("change: *v = %i\n", (*v));

    }

  • Con tr NULL n Gi tr c bit ch rng con tr khng qun l vng

    no. Gi tr ny thng c dng ch mt con tr khng hp l.

    #include int main() {

    int i = 13; short *p = NULL; if (p == NULL) printf(Con tr khng hp l!\n"); else printf(Gi tr : %0xi\n", *p); return 0;

    }

  • 0x15A0

    0x15A4

    0x15A0

    Con tr - Ton t gn = n C s khc bit rt quan trng khi thc hin cc php gn:

    int i = 10, j = 14; int *p = &i; int *q = &j; *p = *q;

    int i = 10, j = 14; int *p = &i; int *q = &j; p = q;

    v:

    p i 10

    0x15A0 14

    q j

    0x15A4 14

    p i 10

    0x15A0 q j 0x15A4

    0x15A4 14

    0x15A4

  • Luyn tp in vo trng int main(void) {

    int i = 10, j = 14, k; int *p = &i; int *q = &j;

    *p += 1; p = &k; *p = *q; p = q; *p = *q;

    return 0;

    }

    i 0x2100

    j 0x2104

    k 0x1208

    p 0x120B

    q 0x1210

  • Con tr v Mng n Bin kiu mng l a ch tnh ca mt vng nh, c xc

    nh khi khai bo, khng thay i trong sut chu k sng. n Bin con tr l a ch ng ca mt vng nh, c xc

    nh qua php gn a ch khi chng trnh thc thi. #include int main() {

    int a[10] = {1, 3, 4, 2, 0}; int *p; p = a; //a = p: sai printf(0x%08X %i 0x%08X %i\n, ); a, a[0], p, *p); return 0;

    }

  • 3 4

    0x15A0 0x15A2

    Con tr - Ton t + vi s nguyn #include int main() {

    short a[10] = {1, 3, 5, 2, 0}; short *p = a; printf(0x%08X %i 0x%08X %i\n, ); a, a[0], p, *p); p ++; printf(0x%08X %i 0x%08X %i\n, ); a, a[0], p, *p); (*p) ++; printf(0x%08X %i 0x%08X %i\n, ); a, a[0], p, *p); return 0;

    }

    1

    5 2 0

    a

    0x15A0

    p 0x16B2

  • Con tr - Luyn tp #include int main() {

    int a[10] = {2, 3, 5, 1, 4, 7, 0}; int *p = a; printf(%i %i\n, a[0], *p); p ++; printf(%i %i\n, *p, p[2]); p ++; a[2] = 9; printf(%i %i\n, p[1], *p); p -= 2; printf(%i %i\n, p[3], p[1]); return 0;

    }

    2 2 3 1 1 9 1 3

  • Con tr - Cp pht vng nh ng

    #include int main() {

    int *p = malloc(10*sizeof(int)); p[0] = 1; p[3] = -7; free(p); return 0;

    }

    n C th ch nh vng mi cho 1 con tr qun l bng cc lnh hm malloc (memory-alloc), calloc (clear-alloc) hoc ton t new ca C++

    n Vng nh do lp trnh vin ch nh phi c gii phng bng lnh free (malloc, calloc) hoc ton t delete (new)

  • Tng kt

    n Khai bo n Cc ton t &, *, =, + n Nhc li v truyn tham s a ch n Con tr v mng n Cp pht vng nh ng

  • Chui k t - String

  • Chui k t Strings n Mt s qui tc n Nhp / xut n Con tr v chui k t n Mt s hm th vin

  • Chui k t - Mt s qui tc n Chui k t l mng mt chiu c mi thnh phn l mt

    s nguyn c kt thc bi s 0. n K t kt thc (0) cui chui k t thng c gi l

    k t null (khng ging con tr NULL). C th ghi l 0 hoc \0 (khng phi ch o).

    n c khai bo v truyn tham s nh mng mt chiu.

    char s[100]; unsigned char s1[1000];

  • char first_name[5] = { 'J', 'o', 'h', 'n', '\0' }; char last_name[6] = "Minor"; char other[] = "Tony Blurt"; char characters[7] = "No null";

    first_name

    last_name

    other

    characters

    Chui k t - V d

    'J' 'o' 'h' 'n' 0

    'M' 'i' 'n' 'o' 'r' 0

    'T' 'o' n

    'y' 32 'B' 'l' 'u' 'r' 't' 0

    'N' 'o' 32 'n' 'u' 'l' 'l' 0

  • n C th nhp / xut chui k t s bng cch nhp tng k t ca s

    n Hoc s dng cc hm scanf v printf vi k t nh dng %s

    n Nhp chui c khong trng dng hm gets

    n scanf and gets have a potential overflow problem (use fgets(s, len, stdin) instead to specify the maximum buffer)

    char name[100]; printf("Nhap mot chuoi ky tu %s: "); gets(name);

    Chui k t - Nhp / xut

    char other[] = "Tony Blurt"; printf("%s\n", other);

  • Lu : kt thc chui #include int main() {

    char other[] = "Tony Blurt";

    printf("%s\n", other);

    other[4] = '\0';

    printf("%s\n", other);

    return 0; }

    Tony Blurt Tony

    other

    "Blurt" s khng c in ra

    'T' 'o' n

    'y' 32 'B' 'l' 'u' 'r' 't' 0

  • Chui k t Mt s hm th vin n Ly di chui

    l = strlen(s); n i ton b cc k t ca chui thnh IN HOA

    strupr(s); n i ton b cc k t ca chui thnh in thng

    strlwr(s);

  • Chui k t Mt s hm th vin n So snh chui: so snh theo th t t in Phn bit IN HOA in thng: int strcmp(const char *s1, const char *s2);

    Khng phn bit IN HOA in thng: int stricmp(const char *s1, const char *s2);

  • #include #include int main() {

    char s1[] = "Minor"; char s2[] = "Tony"; int cmp = strcmp(s1, s2); if (cmp < 0) printf("%s < %s", s1, s2); else if (cmp == 0) printf("%s = %s", s1, s2); else printf("%s > %s", s1, s2); return 0;

    }

    Chui k t v d strcmp

    Minor < Tony

  • Chui k t Mt s hm th vin n Gn ni dung chui:

    o Chp ton b chui source sang chui dest: int strcpy(char *dest, const char *src);

    o Chp ti a n k t t source sang dest: int strncpy(char *dest, const char *src, int n);

    n To chui mi t chui c:

    char *strdup(const char *src);

  • #include #include int main() {

    char s[] = "Tony Blurt"; char s2[100], *s3; strcpy(s2, s); printf("%s\n", s2); strncpy(s2 + 2, "12345,3); printf("%s\n", s2); s3 = strdup(s + 5); printf("%s\n", s3); free(s3); return 0;

    }

    Chui k t v d strcpy

    Tony Blurt To123Blurt Blurt

  • Chui k t Mt s hm th vin n Ni chui:

    char *strcat(char *dest, const char *src);

    n Tch chui:

    char *strtok(char *s, const char *sep);

    Tr v a ch ca on u tin. Mun tch on k tip tham s th nht s l NULL

  • #include #include #define SEPARATOR "., " int main() {

    char s[]= "Thu strtok: 9,123.45"; char *p; p = strtok(s, SEPARATOR); while (p != NULL) { printf("%s\n", p); p = strtok(NULL, SEPARATOR); } return 0;

    }

    Chui k t v d strtok

    Thu strtok: 9 123 45

  • Chui k t Mt s hm th vin n Tm mt k t trn chui:

    char *strchr(const char *s, int c); n Tm mt on k t trn chui:

    char *strstr(const char *s1, const char *s2);

  • #include #include int main() {

    char s[]= "Thu tim kiem chuoi"; char *p; p = strchr(s, 'm'); printf("%s\n", p); p = strstr(s, "em"); printf("%s\n", p); return 0;

    }

    Chui k t v d tm kim

    m kiem chuoi em chuoi

  • #include #include void StrIns(char *s, char *sub) {

    int len = strlen(sub); memmove(s + len, s, strlen(s)+1); strncpy(s, sub, len);

    } int main() {

    char s[]= "Thu chen"; StrIns(s, "123"); printf("%s\n", s); StrIns(s + 8, "45"); printf("%s\n", p); return 0;

    }

    Chui k t chn mt on k t

    123 Thu chen 123 Thu 45chen

  • #include void StrDel(char *s, int n) {

    memmove(s, s + n, strlen(s+n)+1); } int main() {

    char s[]= "Thu xoa 12345"; StrDel(s, 4); printf("%s\n", s); StrDel(s + 4, 3); printf("%s\n", p); return 0;

    }

    Chui k t xa mt on k t

    xoa 12345 xoa 45

  • Tng kt

    n Khai bo n Nhp / xut n Con tr v chui k t n Mt s hm th vin n Chn / loi b mt on con