C ++ - 有没有人有分析指向指针问题的技巧?

时间:2017-12-11 03:31:00

标签: c++ arrays pointers

我已经获得了一套不同的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。

2 个答案:

答案 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]