-1
#include<cstdio>
#include<iostream>
#include<cstring>

using namespace std;

void f(char **x)
{
    (*x)++;
    **x = 'a';
}    

int main()
{
    char str[]="hello";
    f(&str);
    cout << str << endl;
    return 0;
}

このプログラムでコンパイル エラーが発生する理由を教えてください。g++ コンパイラを使用しています

Error :temp1.cpp:16:8: error: cannot convert ‘char (*)[6]’ to ‘char**’ for 
       argument ‘1’ to ‘void f(char**)’
4

4 に答える 4

3

配列は暗黙的にポインターに変換できますが、それは暗黙の「同等のポインター」がすでに存在することを意味するわけではありません。

f(&str);あなたはそれが暗黙的にそのポインタへのポインタとそのポインタへのポインタの両方を作成するstr ことを望んでいます。

この小さな(機能する)変更は、この点を示しています。

int main()
{
    char str[]="hello";
    char *pstr = str;        // Now the pointer extists...
    f(&pstr);                // ...and can have an address
    cout << str << endl;
    return 0;
}
于 2012-10-14T15:13:48.593 に答える
0

定数charのポインターを関数に渡しますが、関数ではポインターのポインターとして受け取ります。それは問題。問題がどこにあるかを以下にコメントしました。 [トピックから外れていますが、注意:配列とポインターは異なる概念です。]

#include<cstdio>
#include<iostream>
#include<cstring>

using namespace std;

void f(char **x)  //**x is pointer of pointer
{
    (*x)++;
    **x = 'a';
}    

int main()
{
    char str[]="hello";
    f(&str); //You are passing pointer of constant char.
    cout << str << endl;
    return 0;
}
于 2012-10-14T15:13:12.927 に答える
0

fどちらも同じ値に評価されるため&str、関数で深刻な問題に遭遇することに&str[0]なります...他のポスターが指摘したように、これらの操作は異なるタイプを指しますが、実際のポインター r-value は同じになります。したがって、ポインターfを二重逆参照しようとすると、型の違いをマッサージしてコンパイルでエラーが発生するようにするためにキャストのようなことを試みたとしても、セグメンテーション違反が発生します。これは、ポインターからポインターを取得していないためです...同じポインター値に評価されるという事実は、二重逆参照が実際に値をポインター値として使用しようとすることを意味しますが、これは機能しません。char**x&str&str[0]charstr[0]

于 2012-10-14T15:15:30.040 に答える
0

あなたの問題は、配列をポインターとして扱っていないのに、そうではないことです。配列はポインターに崩壊しますが、この場合はそうではありません。あなたが渡しているのchar (*)[6]は、char **. それらは明らかに同じではありません。

パラメーターを次のように変更しますchar (*x)[6](または、サイズ パラメーターを含むテンプレートを使用します)。

template <std::size_t N>
void f(char (*x)[N])

中に入ると、x が指している対象をインクリメントしようとします。配列をインクリメントすることはできないため、代わりに実際のポインターを使用してください。

char *p = *x;
p++;
*p = 'a';

まとめて(見本

template <std::size_t N>
void f(char(*x)[N])
{
    if (N < 2) //so we don't run out of bounds
        return;

    char *p = *x;
    p++;
    *p = 'a';
}  
于 2012-10-14T15:18:55.883 に答える