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的值)/指针所指变量占用的内存字节数
结果如下:(当指针的差值不是指针所指变量占用内存的整数倍数时,只保留整数部分)
二 指向指针的指针(二级指针)
指针变量也是变量,占据一定的内存空间,有地址,因此可以用一个指针指向它。
来看一道面试题(如果对二级指针或者指针数组不太清楚的可以先看一下 指针与数组)
自己先试着分析一下,看能否和电脑执行的结果一样。
答案是这样的:
好 接下来我们一起来分析一下:
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"了。
如果没有看懂没有关系我们再看另一个简单点的。
1、3就是两者首地址之差/sizeof(char)(不要把“\0”忘咯)。
2、其余基本都差不多,只是用了另一个指针数组来代替原来的数组,这样方便思考。
指针与整数相加减,表示指针在内存空间中向上或向下移动整数个单位,该单位是多少个内存字节取决于指针所指变量的类型,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、其余基本都差不多,只是用了另一个指针数组来代替原来的数组,这样方便思考。
相关文章推荐
- Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型
- 【C语言提高28】多级指针
- 17.从零开始学习C语言--多级指针
- C语言复习 多级指针
- c语言之多级指针理解一
- C语言 详解多级指针与指针类型的关系
- C语言中指针和自增运算符结合时的运算顺序问题
- Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型
- 《C语言及程序设计》实践项目——指针及其运算
- 【C语言】测试不同类型的指针的算术运算
- c语言指针初探 一指针与引用
- C语言void指针的运算操作[小知识]
- C语言复习 多级指针
- c语言多级指针
- leetcode 500. Keyboard Row(C语言,判断单词是否在键盘同一行,多级指针)22
- 【C语言】指针的运算问题
- c语言指针初探 一 指针与引用(二)
- 12个C语言面试题,涉及指针、进程、运算、结构体、函数、内存,看看你能做出几个!
- NDK开发系列之第三课C语言的指针运算
- C语言:断言,指针的算数运算