web-dev-qa-db-ja.com

ポインタを返す関数

C++ noobはこちら。私が読んでいるC++の本で見つけた構成について非常に基本的な質問があります。

// class declaration
class CStr {
  char sData[256];
 public:
  char* get(void);
};

// implementation of the function
char* CStr::get(void) {
  return sData;
}

したがって、Cstr::get関数は明らかに文字ポインタを返すことを意図していますが、関数は値(return sData)。 C++は、返されたオブジェクトのアドレスを返すことを知っていますか?私の推測では、関数の定義はreturn &sData

3
tchakravarty

CおよびC++の場合、配列はポインターに分解されます。関数の値として配列を返すことはできません。ポインタのみを返すことができます。配列を返すことは、配列の最初の要素のアドレスを返すことと同じです。

return &sData[0];
10
Bill Door

C++は、返されたオブジェクトのアドレスを返すことを知っていますか?

この場合、はい。 配列の名前は、配列の最初の要素への定数ポインターです。そうするとき

char* CStr::get(void) {
    return sData;
}

が実行されると、配列の最初の要素へのポインタが返されます。したがって、呼び出し元は配列を参照してトラバーサルを実行できます。次のコードを実行します。 「hello、world」という出力が表示されます。

#include <iostream>
#include <string>

class CStr {
    char sData[256];
public:
    CStr(std::string str);
    char* get(void);
};

CStr::CStr(std::string str) {
    if (str.length() >= 256) {
        sData[0] = '\n';
        return;
    }

    str.append("\n");
    str.copy(sData, str.length());
}

char* CStr::get(void) {
    return sData;
}

int main() {
    CStr msg("hello, world");
    char* str = msg.get();

    while (*str != '\n')
        std::cout << *str++;

    return 0;
}
2
theD