您的位置:首页 > 编程语言 > C语言/C++

c语言指针初探 一指针运算与多级指针

2014-08-19 16:03 316 查看
一 指针运算

指针与整数相加减,表示指针在内存空间中向上或向下移动整数个单位,该单位是多少个内存字节取决于指针所指变量的类型,short型指针每次移动两个字节,double型的指针每次移动8个字节(将指针变量增加1,其增加的值等于指向的类型占用的内存字节数)。



1.同类型指针间的比较

c++提供的6种关系运算对两个同类型的指针依旧适用,两个指针比较的是数值大小。

举例:两个指针变量p1和p2,p1的值是0X12345678,p2的值是0X12345679,则p1<p2。

2.同类型指针相减

同类型指针相减,返回值是个整数,其值可用下面的公式计算

(指针1的值 - 指针2的值)/指针所指变量占用的内存字节数

#include <iostream>
using namespace std;
int main()
{
int n=0,*pN=&n;
int m=0,*pM=&m;
cout<<"pN的值:"<<pN<<endl;
cout<<"pM的值:"<<pM<<endl;
cout<<"pN-pM="<<pN-pM<<endl;
return 0;
}


结果如下:(当指针的差值不是指针所指变量占用内存的整数倍数时,只保留整数部分)



二 指向指针的指针(二级指针)

指针变量也是变量,占据一定的内存空间,有地址,因此可以用一个指针指向它。

#include <iostream>
using namespace std;
int main()
{
double num=100;
double *pN=#
double **ppN=&pN;
cout<<*pN<<endl;    //100
cout<<**ppN<<endl;  //100
return 0;
}


来看一道面试题(如果对二级指针或者指针数组不太清楚的可以先看一下 指针与数组

#include<iostream>
using namespace std;
int main()
{
char *str[]={"welcome","to","Fortemedia","Nanjing"};
char**p=str+1;
str[0]=(*p++)+2;
str[1]=*(p+1);
str[2]=p[1]+3;
str[3]=p[0]+(str[2]-str[1]);
cout<<str[0]<<endl;
cout<<str[1]<<endl;
cout<<str[2]<<endl;
cout<<str[3]<<endl;
return 0;
}


自己先试着分析一下,看能否和电脑执行的结果一样。

答案是这样的:



好 接下来我们一起来分析一下:

1、首先str是一个指针数组,str[0],str[1],str[2],str[3]分别指向每个字符串的开头,其中str[0]比较特殊,即是第一个字符串的首地址,也是所以串的首地址。

2、二级指针p,指向的是一个指针变量,这个指针变量str+1就是str[1]所以p指针指向的是“to”这个字符串,*p是“to”的其实地址,**p是“to”的第一个字符“t”,p[0]=str[1],p[1]=str[2],p[2]=str[3],*p[0]=="t",*p[1]=="F",*p[2]=="N"。

3、str[0]=(*p++)+2; 首先取*p,也就是“to”,然后p++,因为p指向的是以“to”开头的后面所以字符串的地址,自增后,由str[1]指向str[2],取出“to”时指向的是“to”的起始地址(“t”的地址)然后+2向后移动两位指向了“\0”,所以str[0]为空。

str[0]=="\0".

4、str[1]=*(p+1);p指向str[2],p+1后,指针没有移动,p+1指向了str[3],所以str[1]=str[3]。

str[1]=="Nanjing".

5、str[2]=p[1]+3;p是指向的str[2]和str[3]的起始地址str[2],所以p[0]指向str[2],p[1]指向str[3],p[1]+3就是指向str[3]的第4个字符,所以

str[2]=="jing". str[1]和str[2]指向的是同一个字符串,只是str[2]指向的是后面三个字符而已。

5、str[3]=p[0]+(str[2]-str[1]);p[0]指向的是str[2],(注意str[2]已经变了哟)str[2]-str[1]==3(因为str[2]=p[1]+3,p[1]是指向str[1]的(还可以这样想,对于字符串“Nanjing”,str[1]指向的是其首地址,而str[2]这个指向的是4个字符的地址,因此他们之间差三个字符地址再/sizeof(char)==3)
),所以在jing上移动3个,所以str[3]=="g"了。

如果没有看懂没有关系我们再看另一个简单点的。

#include<iostream>
using namespace std;
int main()
{
char *str[]={"welcome","to","Fortemedia","Nanjing"};
char**p=str+1;
char *str1[4];

cout<<p[0]<<endl;
cout<<*p[0]<<endl;

str1[0]=(*p++)+2;
str1[1]=*(p+1);
str1[2]=p[1]+3;
str1[3]=p[0]+(str[2]-str[1]);
cout<<str[2]-str[1]<<endl;
cout<<str1[0]<<endl;
cout<<str1[1]<<endl;
cout<<str1[2]<<endl;
cout<<str1[3]<<endl;
return 0;
}




1、3就是两者首地址之差/sizeof(char)(不要把“\0”忘咯)。

2、其余基本都差不多,只是用了另一个指针数组来代替原来的数组,这样方便思考。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: