Lecture 6 指针 (下)

指向指针数据的指针,简称指向指针的指针

类型名 **变量名

.char *(*p);  或者 char **p;    自右向左结合

例:

int main()

{ char **p;

char *name[]={"basic","fortran","c++","pascal","cobol"};

p=name+2;

cout<<*p<<endl;    p指向一维字符数组name[2],即c++

cout<<**p<<endl;    p为指向字符的指针,为c

}

字符串与指针的关系

char ch[] ="Hello";  1维数组,用 "字符串"常量初始化,不需要加大括号但加了也可以
char ch[]={'H','e','l','l','o','\0'}; 1维数组用 '字符常量' 初始化,必须 要加大括号
字符串常量,字符常量,一个用双引号,另一个用单引号

访问一个字符串的方法:

字符数组存放一个字符串

.char str[ ]=”i love china”;     str++错误,因为str为数组名,无法改变

字符串变量存放字符串

string str=”i love china”;

字符指针指向一个字符串 

.int main() 

{ char *str=”i love chian”;     str++成立,因为str是一个指针变量,++后指向下一单元

 .cout<<str<<endl;   str为一维数组,输出 i love china

 .return 0;

}

判断输入的字符串是否“回文”,若是回文,则输出yes

回文:如adgjgda,或adggda

void main()

{

char s[81],cr,*pi,*pj;

int i,j,n;

cin.getline(s,81);   istream类的成员

n=strlen(s);

pi=s;pj=s+n-1;

while(*pi==' ')

pi++;

while(*pj==' ')

pj--;     消除输入字符串前后的空格

while((pi<pj)&&(*pi==*pj))

{

pi++;

pj--;

}

if(pi<pj)

cout<<"NO"<<endl;

else cout<<"YES"<<endl;

}

cin.getline用法cin.getline(变量名,个数,指定结束符)

例:cin.getlinestr,81,’#’)表示遇到#结束

变量的引用C++C的一个重要扩充

引用的作用:为一个变量取一个别名

.int a;     定义a是整型变量(a分配空间)

.int &b=a;  声明ba的引用,ba的别名(b不专门开辟空间)

在定义时,&不表示取地址,而是声明变量b为引用类型,并不需要另外开辟内存单元来存放b的值

ba占内存中同一个存储单元,具有同一地址

&在此处为引用声明符,并不代表地址

引用可以理解为:使变量b具有变量a的地址,之后ab同时变化

声明引用变量要同时初始化,即声明它代表哪一个变量

在声明变量b是变量a的引用后,在它们所在函数执行期间,该引用类型变量b始终与其代表的变量a相联系,不能再作为其他变量的引用

.int a1,a2;

.int &b=a1;

.int &b=a2;    错误

引用传值,不像指针那么繁琐,也不像形参变实参不变一样做无用功

例:通过引用将两数交换

int main()

{void s(int &a,int &b);

 int i,j;

 i=3,j=5;

 s(i,j);   ai的引用,bj的引用

 cout<<"i="<<i<<" "<<"j="<<j<<endl;

 return 0;

}

void s(int &a,int &b)

{int temp;

 temp=a;

 a=b;

 b=temp;       引用的值交换,则实际参数也随之交换

}

例:对3个变量排序

int main()

{void s(int &,int &,int &);

 int a=2,b=4,c=3;

 int a1,b1,c1;

 a1=a;b1=b;c1=c;

 s(a1,b1,c1);

 cout<<a<<b<<c<<endl;   输出2 4 3

 cout<<a1<<b1<<c1<<endl;  输出2 3 4

 return 0;

}

void s(int &i,int &j,int &k)

{void change(int &,int &);

if(i>j)  change(i,j);

if(i>k)  change(i,k);

if(j>k)  change(j,k);

}

void change(int &x,int &y)

{int temp;

 temp=x;

 x=y;

 y=temp;

}

函数与指针

用函数指针变量调用函数:一个函数在编译时在程序区被分配给一个入口地址,称为函数的指针

定义指向函数的指针变量

.int (*p)(int, int);    对照 int f(int, int);   形参和返回值均为int

变量后面加(),则说明后面为函数,*p表示p是指向函数的指针变量,int表示函数的返回值类型为int

int max(int x,int y);

int (*p)(int,int);   p为指向函数的指针   定义变量p,而非声明

int a=25,b=43,m;

p=max;   max为函数名,即函数地址,赋给指针p

m=p(a,b);    p指向max函数的地址

指针指向的地址可以改变,之后还可以p=min

指向函数的指针可以作为函数参数

返回指针值的函数:简称指针函数

类型名 *函数名(参数列表)

如:int *a(int x,int y);

a是一个函数,有两个形式参数,函数的返回值为指向整型的指针

有关指针的数据类型


指针运算中,指针变量可以有空值,即不指向任何变量

P=NULL; p的值等于NULL不同于p未被赋值,而是指p赋值为空地址

NULL的值为0p指向地址为0的空间(操作系统专用),不能直接访问,所以一把不指向任何空间 

p不赋值,则为随机数,造成计算机紊乱

.if(p==NULL)   

   p=p1;    指针变量可以与NULL比较

指针运算

两个指针变量可以进行相减

如果两个指针变量指向同一个数组的元素,则两个指针变量值之差是两个指针直接的元素个数

例:若a[ ]为一维整型数组,p1a[1]的地址,p2a[2]的地址,则:

p2-p1=(a+4)-(a+1)=3

两个指针变量比较

若两个指针变量指向同一个数组的元素,则可以比较,指向前面的元素的指针变量小于指向后面元素的指针变量

例:p1<p2 的值为真

如果p1p2不指向同一数组,则比较无意义

例:指向int型和double型无法相减或比较

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值