第 5 章 指针、数组和结构

35
吉吉吉吉 吉 1吉 C++ 5 5 吉 吉吉 吉吉吉吉吉 吉 吉吉 吉吉吉吉吉

description

第 5 章 指针、数组和结构. p. c. &c. ‘a’. 5.1 指针. 1 、指针的定义 T T* char c=‘a’; char *p=&c; char c2= * p. 间接引用. 各种类型指针: int *pi; char **ppc; int *ap[15]; int (*fp)(char*); int *fp (char *);. 5.1.1 零 0 可以被用于作为任意类型的常量 const int NULL = 0 ; 0 可以被用于指针常量; int *p=NULL; - PowerPoint PPT Presentation

Transcript of 第 5 章 指针、数组和结构

Page 1: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 1页 C++ 程序设计

第第 55 章 指针、数组和结构章 指针、数组和结构

Page 2: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 2页 C++ 程序设计

5.1 5.1 指针指针• 1 、指针的定义T T*char c=‘a’;char *p=&c;char c2=*p

&c ‘a’

p c

间接引用

Page 3: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 3页 C++ 程序设计

• 各种类型指针:int *pi;char **ppc;int *ap[15];int (*fp)(char*);int *fp (char *);

Page 4: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 4页 C++ 程序设计

• 5.1.1 零0 可以被用于作为任意类型的常量const int NULL = 0 ;0 可以被用于指针常量;int *p=NULL;int *p=0;(C++)

Page 5: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 5页 C++ 程序设计

5.2 5.2 数组数组• T T[size] float v[3];char* a[32];int b[2][3];size 为常量表达式void f(int i){ int v1[i];// 错误

vector<int> v2(i);// 可变界数组 int bad[5,2] ;// 错误}

Page 6: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 6页 C++ 程序设计

• 5.2.1 数组初始化• 当数组声明中没给出数组大小,有初始化列表,则大小由列表元素个数决定。int vl[ ]={1,2,3,4}char v2[3]={‘a’,’b’,0};• 给出大小,则初始化列表给出多于元素就是错误。char v3[2]= {‘a’,’b’,0};• 给出大小,如初始化列表的元素太少则由 0 补。int v5[8]={1,2,3,4};

Page 7: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 7页 C++ 程序设计

• 5.2.2 字符串文字量“this is a string”• 长度:• 存储长度: sizeof(“hello”)• 类型:适当个数的 const 字符的数组const char[6]

Page 8: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 8页 C++ 程序设计

• 可以将字符串文字量给 char * 赋值,但不能通过该指针修改字符串文字量。void f(){

char* p=“plato” p[4]=‘e’; }

Page 9: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 9页 C++ 程序设计

• 改为void f(){

char p[]=“zeno”;// char p[5]; p[0]=‘R’;}

Page 10: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 10页 C++ 程序设计

• 字符串文字量是静态分配的 , 可作为函数返回值。const char* error_message(int i){

//…return “range error”;

}

Page 11: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 11页 C++ 程序设计

• 字符串文字量可有转义符“asdsfgf\00sdsad”

Page 12: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 12页 C++ 程序设计

5.3 5.3 到数组的指针到数组的指针• 一个数组的名字能够被用作到它的开始元素的指针。int v[]={1,2,3,4};int *p1=v;int *p2=&v[0];int *p3=&v[4];

1 2 3 4v

Page 13: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 13页 C++ 程序设计

• 从数组名到这个数组的开始元素的隐式转换在 C 风格中广泛使用extern “C” int strlen(const char *);//string.hvoid f(){

char v[]=“Annermarie”; char*p=v; strlen(p);

strlen(v);v=p;

}

Page 14: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 14页 C++ 程序设计

5.3.1 在数组里漫游指向数组的指针运算:p1+1;p3-1;p1++;p3--;1.当两个指针指向同一个数组元素时,指针相减才有定义。2.两个指针相加是不允许的。

Page 15: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 15页 C++ 程序设计

void fi(char v[]){

for(int i=0;v[i]!=0;i++) use(v[i]);}

void fi(char v[]){

for(char *p=v;*p!=0;i++) use(*(p+i));}

遍历字符数组

Page 16: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 16页 C++ 程序设计

• 数组不具有自述性,遍历时需提供元素个数void fp(int v[] , unsigned int size){ for(int i=0;i<size;i++) use(v[i]);}• 大多数 C++ 实现不提供对数组范围的检查。

Page 17: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 17页 C++ 程序设计

5.4 5.4 常量常量• 1 、定义——“不变化的值”const int model=90;const int v[]={1,2,3,4};const int x;

常量必须初始化常量必须初始化

Page 18: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 18页 C++ 程序设计

• 将某些东西声明为常量,就保证了其作用域内不能改变它们的值。• 例题:void f(){const int model=90;const int v[]={1,2,3,4};model=200;v[2]++;}

Page 19: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 19页 C++ 程序设计

• const 改变了类型,但没有描述常量如何分配void g(const X*p){*p= ;}void h(){X val;g(&val);}

Page 20: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 20页 C++ 程序设计

• const 最常见的作用是作为数组的界和作为分情况标号。const int max=128;int v[max];const int a=100;void f(int i){switch(i){case a://…}

Page 21: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 21页 C++ 程序设计

• 5.4.1 指针和常量• const char *pc;到 const char 的指针char *const cp;到 char 的 const 的指针

Page 22: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 22页 C++ 程序设计

void f1(char*p){char s[]="gorm";const char *pc=s;pc[3]='g';pc=p;char *const cp=s;cp[3]='a';cp=p;const char*const cpc=s;cpc[3]='a';cpc=p;}

Page 23: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 23页 C++ 程序设计

• 在参数中使用指向常量的指针做参数,就禁止了这个函数对改参数的修改。char *strcpy(char *p,const char *

q);

Page 24: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 24页 C++ 程序设计

• 可以将一个变量的地址赋给一个到常量的指针,但不能将常量的地址赋给一个未加限制的指针。 void f4(){

int a=1; const int c=2; const int* p1=&c; const int *p2=&a; int *p3=&c;//const_cast<int*>(&c)int *p3=&c;//const_cast<int*>(&c) *p3=7;*p3=7;}

Page 25: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 25页 C++ 程序设计

5.5 5.5 引用引用• 定义和作用: T&一个引用就是某对象的另一个名字,主要用途描述函数的参数和返回值。• 引用必需做初始化引用必需做初始化。int i=1;int &r1=i;

Page 26: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 26页 C++ 程序设计

void g( ){

int ii=0;int &rr=ii;rr++;int *pp=&rr;

}

&ii

0

pp:

ii:

rr:

Page 27: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 27页 C++ 程序设计

• 普通 T& 的初始式必须是一个类型 T的左值;• const T& 的初始值不必是一个左值,甚至可以不是类型 T 的左值。double &dr=1;const double &cdr=1;double temp=double(1);const double &cdr=temp

Page 28: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 28页 C++ 程序设计

• 通过引用描述函数的参数void increment(int& aa){aa++;}void f(){

int x=1; increment(x); std::cout<<x<<‘\n’;}

Page 29: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 29页 C++ 程序设计

5.6 5.6 指向指向 voidvoid 的指针的指针• 任何类型指针都可以赋值给 void*的变量 ( 除到函数的指针及到成员的指针);• 可以显式将 void* 转换到另一个类型指针;• 其他操作均不安全;

Page 30: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 30页 C++ 程序设计

void f(int *pi)// 判断{void *pv=pi;*pv; pv++; int *pi2=static_cast<int*>(pv); double *pd1=pv; double *pd2=pi; double *pd3= static_cast<double*>(pi); }

Page 31: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 31页 C++ 程序设计

• void 的最重要的用途是需要向函数传递一个指针,而又不能对对象类型做任何假设,还用就是作为函数的返回值。• 一般用于系统中很低的层次。void *my_alloc(size_t n);

Page 32: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 32页 C++ 程序设计

5.7 5.7 结构结构struct address{

char *name; long int number; ….;};address jd,*pjd=&jd;jd.name;pjd->name;

Page 33: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 33页 C++ 程序设计

• 结构对象可用初始化列表进行初始化(一般用构造函数)address jd = {“jim Dandy”,61,…};• 结构类型对象可以被赋值、作为函数参数传递、作为函数返回值返回。

Page 34: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 34页 C++ 程序设计

• 类型的名字在出现之后就可以使用了,不必等到看到完整的声明之后。struct link{ link*pre; link*suc;}• 在完整声明被看到之前,不能声明这个结构类型的新对象。struct No_good{No_good member;}

Page 35: 第 5 章 指针、数组和结构

吉林大学计算机学院 第 35页 C++ 程序设计

• struct 是类的简单形式5.7.1 类型等价• 两个结构总是不同类型,即使它们有相同的成员;struct s1{int a;};struct s2{int a;};// 考虑 typedef s1 s2;s1 x;s2 y=x;