首页 > 其他 > 详细

指针的运算和存储

时间:2019-08-01 09:34:39      阅读:57      评论:0      收藏:0      [点我收藏+]

指针的运算:

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!