#include<stdio.h>
typedef struct xyz{
int x;
double y;
short z;
}XYZ,*P_XYZ;
main(){
XYZ a;
P_XYZ p;//(XYZ*p;
p=&a;
}
このプログラムの意味がわかりません。
どなたか教えていただけないでしょうか?
何の出力もありませんから、実行することに何の意味もありません。
プログラムの意味としては、基本的にεπιστημηに同意です。
ソースコードの意味(?)しては、次のような感じだと思います。
(1)構造体を定義
(2)typedefでその構造体に別名をつる
(3)構造体(用)の変数を宣言
(4)構造体へのポインタ(用)のポインタ変数を宣言
(5)上記(3)宣言された変数のアドレスを、上記(4)で宣言された変数に代入
#すいません。宣言と定義の使い方にいまいち自信がありません。
#ちょっと調べてのですが・・・間違っているようなら、識者の方々、フォローをお願いしま
す。
以下のコードと同義です。
struct xyz{
int x;
double y;
short z;
};
typedef struct xyz XYZ;
typedef struct xyz* P_XYZ;
/* …なので、 */
main(){
XYZ a; /* struct xyz a; と同じ */
P_XYZ p;/* struct xyz* p; と同じ */
p=&a; /* aのポインタをpに代入 */
}
3),4) 各変数の確保は宣言ではありません。(宣言同様の効果も内包してますが)
宣言(Declarations)と呼ばれるのは以下に列挙されてるものです。
ISO/IEC14882:2003 3.1 Declarations and definitions
定義を伴わない宣言は、基本的に名前を引き込む以上の効果を持ちません。
# extern 宣言とか using 宣言とか typedef 宣言とか
# 関数(プロトタイプ)宣言とか前方宣言とか.....
> 3),4) 各変数の確保は宣言ではありません。(宣言同様の効果も内包してますが)
Cにおいて,識別子の定義は宣言です。
at ISO/IEC 9899:1999 6.7 Declarations / Paragraph 5
> A definition of an identifier is a declaration for that identifier that:
> ―for an object, causes storage to be reserved for that object;
> ―for a function, includes the function body;
> ―for an enumeration constant or typedef name, is the (only) declaration of
the identifier.
このあたり,CとC++で主従関係が逆転しています。
> Cにおいて,識別子の定義は宣言です。
Cはそうだったんですか、知りませんでした(一緒だと思ってました)。御指摘感謝です。
# 言われてみれば昔Cを学びだした頃は規格書なんてチェックした記憶がない....orz
多分、typedefの使い方とか、ポインタ変数と実変数の関係とかを単に示したかっただけでは
ないかと思うのですけれど。
おそらくそれ以上の意味は無いと思います。
茶々を入れたい訳ではありませんが
C言語の入門書をお読みになれば、大体分かる程度の内容かと思います
OSやコンパイラに依存しない入門書で十分理解可能なものではないでしょうか