指针的存储大小
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
char a[]={0,1,2,3,4,5,6,7,8,9};
char *p=a;
printf("p=%p\n",p);
printf("p+1=%p\n",p+1);
int b[]={0,1,2,3,4,5,6,7,8,9};
int *q=b;
printf("q=%p\n",q);
printf("q+1=%p\n",q+1);
return 0;
}
运行结果
char占一个字节,所以p到p+1地址移动一位
int占四个字节,所以p到p+1地址移动四位
p到p+1移动的是一个p指向的sizeof(“p指向的类型”)
指针运算
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
char a[]={0,1,2,3,4,5,6,7,8,9};
char *p=&a[0];
char *p1=&a[5];
printf("p=%p\n",p);
printf("p1=%p\n",p1);
printf("p1-p=%d\n",p1-p);
int b[]={0,1,2,3,4,5,6,7,8,9};
int *q=b;
int *q1=&b[6];
printf("q=%p\n",q);
printf("q1=%p\n",q1);
printf("q1-q=%d\n",q1-q);
return 0;
}
运行结果:
根据q1和q地址16进制下地址的值做相减,可得10进制下24,但最后输出的是6
实际上指针地址相减后还会除以sizeof(“指向类型”)
指针的运算优先级
指针运算优先级比“+”高,所以要用*(p+1)
但是指针的运算优先级比“++”小
代码示例:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
int a[]={10,1,2,3,4,5,6,7,8,9};
int *p;
p=&a[0];
printf("address p=%p\n",p);
printf("p[0]=%d\n",*p++);
printf("address p=%p\n",p);
/*
int b[]={0,1,2,3,4,5,6,7,8,9};
int *q=b;
int *q1=&b[6];
printf("q=%p\n",q);
printf("q1=%p\n",q1);
printf("q1-q=%d\n",q1-q);
*/
return 0;
}
可以发现,指针已经向后移动了一个sizeof(),“++”运算比指针高
之所以元素值还是第一个元素是因为“++”在p的后面,它要运行完了再++
如下就是先++
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
int a[]={10,1,2,3,4,5,6,7,8,9};
int *p;
p=&a[0];
printf("address p=%p\n",p);
printf("p[0]=%d\n",*++p);
printf("address p=%p\n",p);
/*
int b[]={0,1,2,3,4,5,6,7,8,9};
int *q=b;
int *q1=&b[6];
printf("q=%p\n",q);
printf("q1=%p\n",q1);
printf("q1-q=%d\n",q1-q);
*/
return 0;
}
运行结果:
如果是“+”,那指针的运算优先级更高,如下
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
int a[]={10,1,2,3,4,5,6,7,8,9};
int *p;
p=&a[0];
printf("address p=%p\n",p);
printf("p[0]=%d\n",*p+1);// *先运算
printf("address p=%p\n",p);
/*
int b[]={0,1,2,3,4,5,6,7,8,9};
int *q=b;
int *q1=&b[6];
printf("q=%p\n",q);
printf("q1=%p\n",q1);
printf("q1-q=%d\n",q1-q);
*/
return 0;
}
如上就是*先运算,先取出值再+1