質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

6回答

1802閲覧

長い引数

reotantan

総合スコア295

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2015/11/03 19:27

この引数について疑問があります。
constのstruct型のNode *nodeptr?この引数は何を表しているのでしょうか?

int readonly(const struct Node *nodeptr){ struct Node *writeptr; writeptr=nodeptr; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

このコードだけでは、Nodeという構造体のコンスト・ポインタ・・・しか分かりませんが?
あと、・・・writeptr=nodeptr;は、エラーになりませんか?

投稿2015/11/03 21:11

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

回答ではありませんが、記述を短くする方法があります。

c++

1typedef struct Node { 2 int data; 3 struct Node* next; 4} Node_t;

のように定義しておけば、 struct Node は Node_t と記述することができるようになります。

投稿2015/11/03 22:19

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

参照先が読み取り専用である(const)
タグ名がNodeである構造体の(struct Node)
ポインタ*nodeptr

です。

投稿2015/11/04 00:19

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

お使いの処理系がわかりませんが、気の利いた統合環境であれば Node の定義位置を検索できるんじゃないかと思います。

ソース環境のどこかに Node が定義されていると思いますので、その内容を確認されると良いと思います。

投稿2015/11/03 23:23

T.Kanno

総合スコア915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問