指针的运算:
1.解析引用符(*&:可以抵消)
1 *取内容字节数
2 指针间的减法:两个地址间相差的单位数;
1个单位 = sizeof(指向的地址)
接着上一章说的指针的概念,下面我们来看一下一些例子
int n[5] = { 5, 3, 1, 4, 2 };
int* p = n,*p1;
p1 = &n[3];
int** pp = &p;
cout << (int*)(p1 - n) << endl; //00000003
p1指向n[3]的地址,n代表n[0]的地址
所以p1 - n = &n[3] - &n[0] = 12/sizeof(int*) = 3;
有转换为int*型,所以最后结果为00000003
cout << n[2]+++**pp<<endl; //6
后置加加,先计算n[2] + **pp ;n[2]等于1,**p指向p,p又指向n[0];
所以n[2] + **pp = n[2] + n[0] = 5+1 =6;然后n[2]++,n[2] = 2;
cout << (*p1 == *p + 1) << endl; //0
p1指向n[3] , 所以*p1 = n[3] = 4,p指向n[0] ,所以*p = n[0] = 5,加1等于6
所以结果为0
cout << (&p == &p1) << endl; //0
p1指向n[3]的地址,p指向n[0]的地址,所以不相等,结果为0
cout << (int)p1 - (int)&n[0] << endl;
p1指向n[3]的地址,所以(int)p1 - (int)&n[0] = (int)&n[3] - (int)&n[0] =n[3]到n[0]的距离,等于12
cout << *p + 1 << endl;//6
p指向n[0]的地址,所以*p+1 = n[0] +1 = 6;
cout << p - n << endl;//0
p指向n[0]的地址,n也指向n[0]的地址,所以p-n = 0;
cout << *p - (*p1)++ << endl;//1
p指向n[0]的地址,p1指向n[3]的地址,++后置,所以*p-*p1 = n[0] - n[3] = 1;p1指向了n[4];
cout << **pp << endl;//5
pp指向p,p又指向n[0] ,所以**pp = n[0] = 5
cout << *p1***pp << endl;//25
pp指向p,p又指向n[0] ,所以**pp = n[0]=5,p1指向了n[4] = 5,所以结果为25;
2
int n[5] = { 1, 2, 3, 4, 5 };
int* pn[4] = { n, &n[2], n, &n[0] };
int** ppn = pn;//ppn指向pn[0]
cout << **ppn + 1 << endl;//2
ppn指向pn[0],**ppn = n[0] = 1;结果就为2;
cout << ppn - &pn[2] << endl;//-2
ppn - &pn[2] = &pn[0] - &pn[2] = -2;
cout << pn[2] - n << endl;//0
pn[2]指向n的地址,n也指向了n的地址,所以结果为0;
cout << *pn[2] + 2 << endl;//3
pn[2] = &n[0] ,所以*pn[2] + 2 = 1+ 2 =3;
cout << *pn - n << endl;
pn也指向n的地址,所以结果为0;
cout << (short*)pn - (short*)(&pn[3]) << endl;
pn指向pn[0]的地址,所以(short*)pn - (short*)(&pn[3]) = (short*)(&pn[0])- (short*)(&pn[3]) = -12;除以sizeof(short *) = -12/2 = -6;
cout << (short*)((char*)pn[1] - (char*)&n[3]) << endl;
pn[1] = &n[2] ;(short*)((char*)pn[1] - (char*)&n[3]) = (short*)((char*)&n[2] - (char*)&n[3]) = (short*)-4(转16进制) = fffffffc
char* pch = "hello world!";
cout << sizeof(pch) << endl;//4
pch代表"hello world!",任何指针类型一般长度都是4个
cout << strlen(pch) << endl;//12
"hello world!"有12个字符
cout << sizeof(*pch) << endl;//1
*pch指向第一个元素h;char型长度为1
cout << *pch + 1<< endl;
*pch指向第一个元素h;*pch + 1 = ‘h‘ +1;
cout << pch << endl;//"hello world!"
打印"hello world!"
cout << (*pch)++ << endl;//报错:常量不能++
cout << *&pch << endl;//pch//"hello world!"
打印"hello world!"
cout << (char*)(pch + 1) - pch << endl;//1
pch本身就是char*的,没有发生改变
3
char* pch[3] = { "monday", "apple", "hello" };
char** ppch = pch;
cout << *ppch << endl;
ppch指向pch[0],所以ppch = pch[0] = monday;
cout << **ppch + 1<< endl;
ppch指向pch[0],所以**ppch = ‘m‘+1 = 78;
cout << (int*)(pch - &pch[1]) << endl;
pch指向pch[0] (int*)(pch - &pch[1]) = (int*)(&pch[0] - &pch[1]) = -1(转16进制为ffffffff)
cout << pch[2] << endl;
打印hello
cout << pch[2] - *ppch << endl;
pch[2] - *ppch = &‘h‘ - &‘m‘ =16;
原文:https://www.cnblogs.com/1448560633yang/p/11280005.html