c ++中*(arr + 1)+1和(*(arr + 1))+ 1之间有什么区别?

时间:2016-01-31 09:56:58

标签: c++ pointers

我最近在学校用C ++学习2D阵列,我也研究了指针。但这让我很困惑。

#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
    system("cls");
    char arr[][6]={"Name1","Name2"};
    cout<<*(arr+1)+1<<endl;
    cout<<(*(arr+1))+1<<endl;
    system("pause");
}

我得到的输出是:

ame2
ame2

我被告知*运算符的优先级低于+运算符。那么为什么*(arr+1)+1(*(arr+1))+1给出相同的输出? C ++不会对它们进行不同的处理吗?

2 个答案:

答案 0 :(得分:3)

不,指针取消引用运算符的优先级高于加法运算符,因此*(arr+1)+1(*(arr+1))+1是相同的。

答案 1 :(得分:1)

好吧,我的很多朋友也问我相同(或类似)的问题。所以这就是我要解决的问题。我没有将'*'称为解除引用运算符,而是将其称为“地址值”运算符。

写入数组的名称为我们提供了数组的基址。所以写*(arr+1)+1 实际上地址的值(arr + 1)+ 1 让我们假设arr是一个整数数组,从位置1000开始。也就是说我们的等式解析为地址(1000 + 1)+ 1

的值

现在请记住,递增指针与递增整数不同。为什么?

int i=1000;
i++; //i will now be 1000 + 1
int *p=&i; //p points to 1000
p++; //p now points to 1000 + sizeof(int) ie 1000 + 4 = 1004

回到原来的位置。 地址(1000 + 1)+ 1 的值现在解析为地址(1004)+ 1 处的值,进一步解析为地址1008处的

尝试在(*(arr + 1))+ 1上执行相同操作,我们得到(地址(1000 + 1)+1处的值),其解析为(地址处的值) (1004)+1)进一步解析为(地址(1008)处的值),这与我们之前的结果类似。现在你可以简单地用1008地址的任何值替换整个大惊小怪。希望能帮助到你。 :)