[英]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++更容易理解。 在您引入指針的那一刻,您的復雜性就達到了一個全新的水平。 當您知道不能通過按值傳遞對象來做您想做的事情時,那么是時候用new
和delete
挽起袖子了。 到那個時候,你就會掌握一些基本的語法,它看起來就不會那么神秘了。
我重寫了您的程序,將 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
。為了獲得額外的積分,請刪除 C 字符串的使用並使用std::string
代替。 您會發現這比替代方案更容易:檢查輸入字符串長度,如果太長則拋出異常。
順便說一句,我故意使用<string>
因為 C++,和strcpy (3) 因為習慣用法。 如果它沒有別有用心,那么它已過時或已棄用的傳說充其量只是一廂情願的想法。 strcpy 的數百萬次使用不會在我或你的有生之年消失。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.