114
7 7 第 第第 第 第第 C C 语语语语语语 语语语语语语

第 7 章 指针

Embed Size (px)

DESCRIPTION

C 语言程序设计. 第 7 章 指针. 内容提要. 指针的概念 难点:理解指针数据类型 用指针做函数参数,向函数传递变量值、数组元素和字符串 用指针数组处理多个字符串 指向数组的指针与指针数组的区别 带参数的 main 函数; 动态内存分配函数及其应用 一维、二维动态数组的实现 Skill 用指针做函数参数编程. 为什么引入指针的概念. 指针 为函数提供修改变量值的手段 为 C 的动态内存分配系统提供支持 为动态数据结构(如链表、队列、二叉树等)提供支持 改善某些子程序的执行效率. 内存:计算机内的存储部件 所有指令和数据都保存在内存里 - PowerPoint PPT Presentation

Citation preview

  • 7 C

    **/119

    mainSkill

    **/119

    C

    **/119

    (Variables) (Address)int a=0;0x0037b000a

    **/119

    (Variables) (Address)int a=0;0x0037b000a0x0037b0010x0037b0020x0037b003&a

    **/119

    (Variables) (Address)int a=0;0x0037b000a0x0037b0010x0037b0020x0037b003&a

    **/119

    (Variables) (Address)int a=0;0x0037b000a0x0037b0010x0037b0020x0037b003&a

    **/119

    (Variables) (Address)int a=0;0x0037b000a0x0037b0010x0037b0020x0037b003&a

    **/119

    Pointer

    **/119

    Declaring pointersint a=10;0x0037b000a0x0037b0040x0037b0080x0037b00B&a......100x0037b000

    **/119

    Declaring pointersint a=10;0x0037b000a0x0037b0040x0037b0080x0037b00B&a......100x0037b000int *pa;pa

    **/119

    Pointer Assignmentsint a=10;0x0037b000a0x0037b0040x0037b0080x0037b00B&a......100x0037b000int *pa;pa = &a;int *pa=&a;pa

    **/119

    Pointer Assignmentsint a=10;0x0037b000a0x0037b0040x0037b0080x0037b00B&a......100x0037b000int *pa;pa = &a;int *pa=&a;pa

    **/119

    Pointer Assignmentsint a=10;0x0037b000a0x0037b0040x0037b0080x0037b00B&a......100x0037b000int *pa;pa = &a;int *pa=&a;pa

    **/119

    int i,*pp=&i; int *p;float *q;p=q;int i;float *p;p=&i;int *p;p=100;!!

    **/119

    Dereferencing Pointers and the Address Operatorint i = 24;i is an int variable&i is like an int pointer, pointing to the variable ithe Address Operator

    **/119

    Dereferencing Pointers and the Address Operatorint *p;p = &i;p is an int pointer *p *p *pthe pointer Operator

    **/119

    Dereferencing Pointers and the Address Operatorint a=10;0x0037b000a0x0037b0040x0037b0080x0037b00B&a......200x0037b000int *pa=&a; *(&a)/*a*/

    &(*pa) /*a*/pa

    **/119

    Using Pointersint a=10;0x0037b000a0x0037b0040x0037b0080x0037b00B&a......100x0037b000int *pa;pa = &a;int *pa=&a;*pa = 20;20pa

    **/119

    Using Pointersint a=10;0x0037b000a0x0037b0040x0037b0080x0037b00B&a......200x0037b000int *pa;pa = &a;int *pa=&a;*pa = 20;pa

    **/119

    int i; scanf("%d", i); /* */

    char c; scanf("%d", &c); /* */ii==100100intccint

    **/119

    Using Pointersint i;int *iPtr = &i;int j = 3;int *jPtr = &j;

    Consider:

    *jPtr = *iPtr; i = 4;*jPtr = i;iPtr = j;

    **/119

    pointer manipulation short *p, a[10]; p = a; p++; pa[0]

    **/119

    pointer manipulation short *p, a[10]; p = a; p++; pshortlongpa[0]

    **/119

    pointer manipulation

    **/119

    Pointers and ErrorsTo increment a dereferenced pointer, use

    (*p)++

    rather than

    *p++ /* correct but means */

    **/119

    pointer manipulation 10p > q p < q p == q

    **/119

    pointer manipulation

    main(){ int *p; scanf("%d",p); }main(){ int a,*p=&a; scanf("%d",p); }TCVC

    **/119

    Pointers and FunctionsCall by ValueCan not modify the argument parameter variableCall by Reference In order to modify the argument use: (Pointer parameter) &(variable)

    **/119

    void Swap(int *x, int *y) { int temp; temp = *x; *x = *y; *y = temp; }/* call by reference: int a = 15, b = 8; swap(&a, &b); */7.1~7.2

    **/119

    void Swap(int *x, int *y) { int temp; temp = *x; *x = *y; *y = temp; }/* call by reference: int a = 15, b = 8; int *pa = &a, *pb = &b; swap(pa, pb); */7.1~7.2

    **/119

    7.1~7.2

    void Swap(int x,int y){ int temp; temp = x; x = y; y = temp;}

    void Swap(int *x,int *y){ int temp; temp = *x; *x = *y; *y = temp;}

    main(){ int a, b; a = 5; b = 9; Swap( &a, &b ); printf("a=%d,b=%d",a,b);} main(){ int a, b; a = 5; b = 9; Swap(a, b); printf("a=%d,b=%d",a,b);} 1 2 Trace the execution

    **/119

    main(){ int a, b; a = 5; b = 9; Swap(a, b); printf("a=%d,b=%d",a,b);}void Swap(int x, int y){ int temp; temp = x; x = y; y = temp;}55ab 99 1xy55temp9x y

    **/119

    main(){ int a, b; a = 5; b = 9; Swap(&a, &b); printf("a=%d,b=%d",a,b);}void Swap(int *x, int *y){ int temp; temp = *x; *x = *y; *y = temp;}&a&a &b&b 2xy5temp5ab995*x*yx y

    **/119

    void Swap(int *x, int *y){ int temp;

    temp = *x; *x = *y; *y = temp;}pTemppTempvoid Swap(int *x, int *y){ int *pTemp; *pTemp = *x; *x = *y; *y = *pTemp;}

    **/119

    void Swap(int *x, int *y){ int temp;

    temp = *x; *x = *y; *y = temp;}void Swap(int *x, int *y){ int *pTemp; pTemp = x; x = y; y = pTemp;}

    **/119

    **/119

    7.5~7.6

    **/119

    C''"Hello China"pStr'\0'

    **/119

    char *pStr = "Hello China";"Hello China"pStrchar str[12] = {"Hello China"}; char *pStr;pStr = "Hello China";strpStr = &str[0];

    **/119

    str = "Hello China";"Hello China"pStrchar str[12] = {"Hello China"}; char *pStr;pStr = "Hello China";strstr pStr

    **/119

    7.5 void MyStrcpy(char dstStr[], char srcStr[]){int i = 0; while (srcStr[i] != '\0'){ dstStr[i] = srcStr[i]; i++; }dstStr[i] = '\0';}srcStr[i]dstStr[i]Hi=0ei=1li=2li=3oi=4i=5Ci=6hi=7ii=8ni=9ai=10\0srcStr[i]=='\0

    **/119

    7.5 void MyStrcpy(char *dstStr, char *srcStr){while (*srcStr != '\0'){ *dstStr = *srcStr; srcStr++; dstStr++; }*dstStr = '\0'; }*srcStr*dstStrHelloChina\0*srcStr=='\0srcStr++dstStr++

    **/119

    7.5 void MyStrcpy(char *dstStr, const char *srcStr){while (*srcStr != '\0'){ *dstStr = *srcStr; srcStr++; dstStr++; }*dstStr = '\0'; }*srcStr*dstStrHellChina\0oconst Protecting Parameter Values

    **/119

    A const qualifier qualify pointersconst const int *p; pointer to a constant integerp the value of p may change, but the value of *p can not*p = 10VC error C2166: l-value specifies const objectint *const p; constant pointer to integerpthe value of *p can change, but the value of p can not

    **/119

    7.6 unsigned int MyStrlen(char str[]){ int i;unsigned int len = 0; for (i=0; str[i]!='\0'; i++) {len++; }return (len);}

    unsigned int MyStrlen(const char *pStr){ unsigned int len = 0; for (; *pStr!='\0'; pStr++) {len++; }return (len); }

    21

    **/119

    int a[4]={1,2,3,4};0x0037b000a[0]0x0037b0040x0037b0080x0037b00Ba....1int *pa=a;paint *pa=&a[0];234a[1]a[2]a[3]

    **/119

    int a[4]={1,2,3,4};0x0037b000a[0]0x0037b0040x0037b0080x0037b00Ba....1int *pa=a;paint *pa=&a[0];234a[1]a[2]a[3]a[i]*(a+i)pa[i]*(pa+i)a+1*(a+1)pa[0]*(pa+2)pa+2*pa

    **/119

    int a[4]={1,2,3,4};0x0037b000a[0]0x0037b0040x0037b0080x0037b00Ba....1p234a[1]a[2]a[3]for (i=0; i