この引数について疑問があります。
constのstruct型のNode *nodeptr?この引数は何を表しているのでしょうか?
int readonly(const struct Node *nodeptr){ struct Node *writeptr; writeptr=nodeptr; }
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
このコードだけでは、Nodeという構造体のコンスト・ポインタ・・・しか分かりませんが?
あと、・・・writeptr=nodeptr;は、エラーになりませんか?
投稿2015/11/03 21:11
総合スコア6851
0
関数の引数にconst修飾のついたポインタを渡した場合、
コンパイラに「ポインタの指す領域は、関数の中では変更されません」と教える事ができます。
それによって、コンパイラは積極的な最適化ができるようになります。
人間にも、変更されないのだから値のトレースが要らない、つまり読み飛ばす事ができるのでソースの可読性が数段上がるわけです。
ソース例にある、writeptrはconst修飾が付いていない(指し示す領域を変更できる)ので、nodeptrの宣言とは矛盾することになり代入しようとすればコンパイラは何らかのメッセージを出します。
gccではエラーです。
xxxx.cpp:xx: error: invalid conversion from ‘const Node*’ to ‘Node*’
念のため加筆しますが、キャストするとエラーが出なくなります。
writeptr=(struct Node *)nodeptr;
このキャストは非常に危険なキャストなので禁じ手です。
投稿2015/11/16 23:08
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
構造体をまだ習得されていないと見ました.C++には構造体という,クラスの特殊版があります.それは次のようになっています.
C++
1struct tag_name 2{ 3 Type1 member1; 4 Type2 member2; 5 // ... 6};
これは次のようなクラス宣言と等価です.
C++
1class class_name 2{ 3public: 4 Type1 member1; 5 Type2 member2; 6 // ... 7 8public: 9 // デフォルトコンストラクタ 10 // コピーセマンティクス 11 // ムーブセマンティクス(処理系依存) 12 // デストラクタ 13};
クラスの特殊版とかきましたので,つぎのような記法も当然行えます.
C++
1tag_name obj; 2obj.member1 = ....;
しかし,C言語ではクラスというものが備わっていません.
そのため,構造体は次のように書かないと,定義しても利用ができず,コンパイルエラーになってしまいます(新しいバージョンのC言語ではC++のように書けるかもしれません).
C
1struct tag_name obj; 2obj.member1 = ... ;
C言語では,構造体はint型や,char型といった,組み込み型の集合体という位置づけになります.
そういう集合体を自分で作るためのキーワードがstructです.classに似ていますね.
実際,メンバ関数(メソッド)が存在しないパブリッククラスと同じです.
ところで,C言語記法でのstruct tag_name .structが無駄に思えますね.
そういう時はKatoyさんの記法を用いることで,(古い)C言語でもstructを省略することができます.
typedefキーワードは大丈夫でしょうか.これは型の別名を定義します.つまりあだ名をつける機能です.
あだ名は,もともとの名前が長いときに,友人が親しみと呼びかけの楽をする意味で使われますね.
親しみという概念はありませんが,名前が長いので楽をしたい,意味のある名前をあだ名にしたい,という用途で使えます.
「DWORDってなんの型だ?クラスか?構造体か?」
と思って調べたら,実は
C
1 typedef unsigned int DWORD;
つまりただのint型だった.ということもあります.
ということで,const struct Node* nodeptr という変数宣言は,
「構造体Nodeのポインタであり,しかも(ポインタの指す)参照先を変更してはいけない変数nodeptr」
という意味になります.
ところで,constキーワードはコンパイラに,「こいつは宣言時以外に値を代入してはいけない変数」ということを教えるものですが,これを受けたコンパイラは,const変数をできるだけReadOnlyMemory(つまりROM)に格納しようとします.
関数名がreadonlyなのはそういうことが関係してますね.
投稿2015/11/04 04:06
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。