我已经获得了一套不同的Pointer to Pointer练习。每个解除引用一个指针数组。在没有编译器的情况下进行分析时,这绝对具有挑战性和混乱性。有没有人有任何系统的技巧来解决它们?
int main(void)
{
const char* s[] = { "AB", "XY", "EZ"};
const char** z = s;
z += 1;
cout << "The value of **z is: " << **z << endl;
cout << "The value of *z is: " << *z << endl;
cout << "The value of **(z-1) is: " << **(z-1)<< endl;
cout << "The value of *(z-1) is: " << *(z-1)<< endl;
cout << "The value of z[1][1] is: " << z[1][1]<< endl;
cout << "The value of *(*(z+1)+1) is: " << *(*(z+1)+1)<< endl;
return 0;
}
我在这里有另一个难题,这肯定有点短。
int foo[] = {1, 4, 9};
int bar[] = {16, 26, 36, 49};
int main(void){
int *x[2];
x[0] = bar;
x[1] = foo;
*x[1] = (*x)[1];
//What changes?
}
一段时间后我能够得到正确的结果,但我不能始终得到正确的答案。
我正在寻找类似于从右到左阅读包含“const”的函数的技巧。即。
const char **x;
“x是指向常量的char指针的指针。”
答案是: ** z是X,* z是XY,**(z-1)是A,*(z-1)是AB,z [1] [1]是Z,*(*(z + 1)+1 )是Z。
答案 0 :(得分:1)
没有技巧,只需要了解每个拼图的机制。让我们分解吧。
constructor
z += 1;
从z
开始,现在它是s[0]
。
s[1]
cout << "The value of **z is: " << **z << endl;
与**z
相同,与*s[1]
相同。这是s[1][0]
。
'X'
cout << "The value of *z is: " << *z << endl;
与*z
相同,s[1]
指针指向char*
。
XY
cout << "The value of **(z-1) is: " << **(z-1)<< endl;
与**(z-1)
相同。这是*s[0]
。
'A'
到目前为止,模式应该很明显,这是cout << "The value of *(z-1) is: " << *(z-1)<< endl;
,它是指向s[0]
的指针。
"AB"
cout << "The value of z[1][1] is: " << z[1][1]<< endl;
与z[1]
相同;由于*(z+1)
已经z
,这意味着表达式与s+1
或*(s+2)
相同。从中获取一个额外的下标将索引到s[2]
处的指针,因此s[2]
是字符串的第二个字符或s[2][1]
。
'Z'
从内侧括号开始,cout << "The value of *(*(z+1)+1) is: " << *(*(z+1)+1)<< endl;
我们已经确定*(z+1)
。将s[2]
添加到该指针将获得第二个字符,就像上一个示例中一样,并且使用1
取消引用该指针会产生字符*
。
答案 1 :(得分:0)
所以我不知道这是否是最有效的方式,但我理解的方式是[]
和*
几乎可以互换指针指针。它几乎就像一个2D阵列。只是[]
的优先级高于*。
因此,查看**z
,我们可以将其分析为z[0][0]
。对于更具挑战性的示例,我们可以将**(z-1)
分析为z[-1][0]
。最后,最具挑战性的*(*(z+1)+1)
可以分析为z[+1][+1]
。