我最近在学校用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 ++不会对它们进行不同的处理吗?
答案 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地址的任何值替换整个大惊小怪。希望能帮助到你。 :)