指向指针数据的指针,简称指向指针的指针
类型名 **变量名
.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维数组, 用 '字符常量' 初始化,必须 要加大括号
字符串常量,字符常量,一个用双引号,另一个用单引号
访问一个字符串的方法:
1 用字符数组存放一个字符串
.char str[ ]=”i love china”; str++错误,因为str为数组名,无法改变
2 用字符串变量存放字符串
string str=”i love china”;
3 用字符指针指向一个字符串
.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.getline(str,81,’#’)表示遇到#结束
变量的引用:C++对C的一个重要扩充
引用的作用:为一个变量取一个别名
.int a; 定义a是整型变量(a分配空间)
.int &b=a; 声明b是a的引用,b是a的别名(b不专门开辟空间)
在定义时,&不表示取地址,而是声明变量b为引用类型,并不需要另外开辟内存单元来存放b的值
b和a占内存中同一个存储单元,具有同一地址
&在此处为引用声明符,并不代表地址
引用可以理解为:使变量b具有变量a的地址,之后a与b同时变化
声明引用变量要同时初始化,即声明它代表哪一个变量
在声明变量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); a是i的引用,b是j的引用
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的值为0,p指向地址为0的空间(操作系统专用),不能直接访问,所以一把不指向任何空间
若p不赋值,则为随机数,造成计算机紊乱
.if(p==NULL)
p=p1; 指针变量可以与NULL比较
指针运算
1 两个指针变量可以进行相减
如果两个指针变量指向同一个数组的元素,则两个指针变量值之差是两个指针直接的元素个数
例:若a[ ]为一维整型数组,p1为a[1]的地址,p2为a[2]的地址,则:
p2-p1=(a+4)-(a+1)=3
2 两个指针变量比较
若两个指针变量指向同一个数组的元素,则可以比较,指向前面的元素的指针变量小于指向后面元素的指针变量
例:p1<p2 的值为真
如果p1和p2不指向同一数组,则比较无意义
例:指向int型和double型无法相减或比较