簡體   English   中英

我無法理解靜態指針的用途

[英]I can't understand the purpose of a static pointer

我創建了一個具有行星三個屬性的結構。 然后,我創建了一個創建新行星的函數——它是一個更大應用程序的一部分,但它只是一個將函數參數分配給一些結構變量,然后返回結構的函數。

這實際上是我試圖更好地理解的一段代碼。 我試圖掌握指針和動態內存的概念。

#include <iostream>
#include <string.h>

using namespace std;


typedef enum {
    NEPTUNE_LIKE,
    GAS_GIANT,
    TERRESTRIAL,
    SUPER_EARTH,
    UNKNOWN
}PlanetType;

typedef struct {
    char name[30];
    PlanetType type;
    float distanceToEarth;
}Planet;

Planet createPlanet(char myname[], PlanetType mytype, double mydistance)
{
    Planet pl;
    strcpy_s(pl.name, myname);
    pl.type = mytype; 
    pl.distanceToEarth = mydistance;
    return pl;
}

char* getName(Planet* p)
{
    return p->name;
}

PlanetType getType(Planet* p)
{
    return p->type;
}

double getDistance(Planet* p)
{
    return p->distanceToEarth;
}

int main()
{
    char s[30] = "Nume";
    static Planet* pl = new Planet();
    *pl = createPlanet(s, UNKNOWN, 345);
    cout << getType(pl) << endl;
    return 0;
}

我的問題是: static Planet* pl = new Planet()的目的是什么,為什么程序沒有它就不能運行? 怎么可能有一個指向整個函數的變量pl 例如,我看到了為什么變量指向整數背后的邏輯,但我無法理解在上述情況下會發生什么。

static Planet* pl = new Planet()的目的是什么

Planet是一個結構。 new返回一個指向類型的指針; 在這里,您正在調用編譯器生成的默認Planet構造函數。 new為空的Planet分配內存,並返回指向該內存的指針。

正如評論中提到的,這里不需要static ,因為pl永遠不會返回給調用函數。

怎么可能有一個指向整個函數的變量 pl?

你認為它指向什么功能? 在 C++ 中,形式

a = f();

表示執行f並返回分配給a的值。

我試圖掌握指針和動態內存的概念。

在游戲的這個階段,我建議嘗試在沒有動態內存的情況下解決您要解決的問題。 當您使用語義時,C++容易理解。 在您引入指針的那一刻,您的復雜性就達到了一個全新的水平。 當您知道不能通過按值傳遞對象來做您想做的事情時,那么是時候用newdelete挽起袖子了。 到那個時候,你就會掌握一些基本的語法,它看起來就不會那么神秘了。

我重寫了您的程序,將 Planet 轉換為類,並將僅與 Planet 成員相關的函數作為成員函數移到類中。 我想你會同意它更簡單和更短。

#include <iostream>
#include <string>

using namespace std;

enum PlanetType {
    NEPTUNE_LIKE,
    GAS_GIANT,
    TERRESTRIAL,
    SUPER_EARTH,
    UNKNOWN
};

class Planet {
private:
    char name[30];
    PlanetType type;
    float distanceToEarth;
public:
  Planet( const char myname[], PlanetType mytype, double mydistance ) {
    strcpy(name, myname);
    type = mytype; 
    distanceToEarth = mydistance;
  }

  const char * getName() const { return name; }
  PlanetType   getType() const { return type; } 
  double getDistance() const { return distanceToEarth; }
};

int main() {
  Planet planet( "Nume", UNKNOWN, 345 );
  cout << planet.getType() << endl;
  return 0;
}

好處:

  • 沒有必要的部分,就無法建造Planet
  • “get”函數不能傳遞無效指針

為了獲得額外的積分,請刪除 C 字符串的使用並使用std::string代替。 您會發現這比替代方案更容易:檢查輸入字符串長度,如果太長則拋出異常。

順便說一句,我故意使用<string>因為 C++,和strcpy (3) 因為習慣用法。 如果它沒有別有用心,那么它已過時或已棄用的傳說充其量只是一廂情願的想法。 strcpy 的數百萬次使用不會在我或你的有生之年消失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM