術語目的是通過C11標準3.15節中定義:如何識別對象用C
對象數據存儲在所述執行環境中, 內容
區,其可以代表值
鑑於以下代碼:
int x;
int y[10];
struct my_struct {
int a;
int b;
};
struct my_struct z;
在上面的代碼中,x
,y
和z
是不同的對象嗎? z
的成員是相同的對象? y
的元素是相同的對象?
術語目的是通過C11標準3.15節中定義:如何識別對象用C
對象數據存儲在所述執行環境中, 內容
區,其可以代表值
鑑於以下代碼:
int x;
int y[10];
struct my_struct {
int a;
int b;
};
struct my_struct z;
在上面的代碼中,x
,y
和z
是不同的對象嗎? z
的成員是相同的對象? y
的元素是相同的對象?
在上面的代碼,
x
,y
,和z
是不同的對象?
是的,它們佔用完全獨立的存儲區域。
z
的成員是同一個對象嗎?
不,z.a
和z.b
是兩個不同的對象。可以說它們是z
的子對象,因爲它們的存儲都包含在整個存儲中,但它不是完全相同的存儲區域。該地區的規模也起着一定的作用。
y
的元素是相同的對象嗎?
不,每個元素y
是一個單獨的對象。但通過與上述相同的推理,可以認爲它們是y
的子對象。
要比較指針,他們必須指向同一個對象或一個對象。那麼,它是否比較同一對象的子對象? –
@MatheusSilva - 如果您有後續問題,請張貼另一個問題。不要評論。 – StoryTeller
C標準中術語對象的含義很簡單:一個變量分配在內存中。事實證明,它與在支持OO的語言中使用的對象的定義是相同的。
通常,對象具有某種類型(是有用的),見文本的其餘部分在3.15:
說明當參考,對象可以被解釋爲具有特定類型;見6.3.2.1。
在上面的代碼中,x,y和z是不同的對象?
是的,因爲它們是不同的變量。
z的成員是同一個對象嗎?
它們是z
對象的一部分,但同時也是不同的子對象。 a
和b
是不同的對象,但是當結構被稱爲整體時,它們是同一個對象的一部分。
圖形:
+–––+
x: | |
+–––+
+–––+
y: | | y[0]
+–––+
| | y[1]
+–––+
...
+–––+
| | y[9]
+–––+
+–––+
z: | | a
+–––+
| | b
+–––+
每個x
,y
,和z
是對象。因此,每個y[i]
,z.a
和z.b
。
1)是的。 2,3)是的,但他們也是不同的子對象。 – PSkocik
是的。不是的,因爲「x」,「y」和「z」是不同的「對象」。不是,因爲結構的成員又是獨立的對象。最後是最後一個否,因爲'y'的元素也是單獨的對象。引述的重要部分是「其內容可以代表**值**」。例如,'y [0]'和'y [1]'可以代表一個'int'值,但它們是*不同的*,因此是不同的對象。 –
爲了進一步闡明:出於別名分析的目的,您應該考慮通過它們的父對象訪問子對象作爲對父對象的訪問,因爲這就是編譯器所做的事情。 (請參閱我的問題:https://stackoverflow.com/questions/42352681/strict-aliasing-and-overlay-inheritance)。 – PSkocik