1、指针的算数运算
在牛客网上看到了这样的程序,如下:
int main()
{
char ch[10] = {'a','b','c','d','e'};
int *p = (int *)ch;
p++;
cout << *p << endl;
}
那么输出结果是什么?答案: 101
为什么呢?int * p = (int *) ch; 这种强制类型转换并不会改变 ch 是char * 类型。 p++ 就是在首地址 ch 的基础上加上 sizeof (int),也就是4个字节,一个 char 型为1个字节,所以,将 ch 往后移动4个字节,也就是 e ,对应的值为 101。
下面讨论(*p)++,*p++ ,*(p++)。看下面程序:
int main()
{
int a[10] = {0,1,2,3,4,5,6,7,8,9};
int *p = a;
for (int i = 0; i < 10; i++)
{
(*p)++;
p++;
}
for (int j = 0; j < 10; j++)
{
cout << a[j] << endl;
}
}
输出结果为 1 2 3 4 5 6 7 8 9 10。(*p) ++表示向将p指向的值取出来,再+1。然后p++再往后移一位。所以最后结果是原来数组每个数字都加了1。
再看下面这个:
int main()
{
int a[10] = {0,1,2,3,4,5,6,7,8,9};
int *p = a;
for (int i = 0; i < 10; i++)
{
*p++;
// p++;
cout << *p << endl;
}
}
输出结果是1 2 3 4 5 6 7 8 9 -858993460(很大的一个值,不用管它)。这里说明一点,如果单独一行,*p++和p++没任何区别。但是如果这样改:
int main()
{
int a[10] = {0,1,2,3,4,5,6,7,8,9};
int *p = a;
for (int i = 0; i < 10; i++)
{
//*p++;
cout << *p++ << endl;
}
}
输出结果就是 0 1 2 3 4 5 6 7 8 9.这个时候,*p++和p++就有区别了。*p++表示先取值,然后再将地址 + 1。p ++仅仅表示将地址加1。
int main()
{
int a[10] = {0,1,2,3,4,5,6,7,8,9};
int *p = a;
for (int i = 0; i < 10; i++)
{
//*p++;
//cout << *p++ << endl;
cout << *(p++) << endl;
}
}
输出结果仍然是0 1 2 3 4 5 6 7 8 9 。有人就问了,, *p++ 和 *(p++)是一样的吗?!对,没错,是一样的。 * 和 ++的优先级是一样的,++表示先取值,然后再加1,对于*(p++),虽然是由括号,但(p++)表示的内容是先取p,这个时候取出来的 p 就与 * 结合了,输出以后,再 p++。和不加括号的效果是一样的。
int main()
{
char ch[100] = "abcdefghijklmn";
char *p = ch;
char **pp = &p;
p++;
pp++;
cout << *p << endl;
//cout << **pp << endl; //输出错误
//cout << sizeof(char) << endl; //输出为 1
//cout << sizeof(char *) << endl; //输出为 4
}
说明一点,