こんにちは、ナナです。 「ポインタ変数」はメモリの番地を管理するための変数です。番地を管理するが故に、普通の数値とは異なる演算ルールが適用されます。 特殊である理由も含めて解説していきます。 本記事では次の疑問点を解消する内容となっています。 本記事で学習できること ポインタに対する加減算の演算結果とその意味とは? ポインタに対する乗除算の演算結果とその意味とは? C言語 - Part.2:演算と変数 - のむログ. ポインタに対するsizeof演算子の適用パターンと演算結果とは? では、ポインタへの演算の特殊性を学んでいきましょう。 ポインタ変数に対する四則演算の特殊性 師匠!「ポインタ変数」って番地を覚えてるんですよね。ちょっと変わった変数ですね。変わり者のポインタ変数のことをもっと知って、仲良くなりたいのですっ。 ナナ そうだね、ポインタ変数は番地を記憶するという特殊性から、演算に対する結果が特殊なものになるんだよ。そのあたりを学んでみようね。 ポインタ変数は番地を管理するため、四則演算は特殊なルールが適用されることになります。 ポインタ変数に対する加減算の特殊ルール ポインタ変数が管理する番地に加減算(+・-)をした場合、通常の加減算とは異なる動作をします。 次のように、ポインタ変数に対するインクリメントが、どんな結果となるのかを明らかにします。 short num[2] = {0x0123, 0x4567}; short * pnum = num; // pnumの番地に1を加算 pnum++; // pnumの番地はどうなる? 注意してください。 ここで問うているのは、ポインタの参照先のメモリに対する加減算ではなく、ポインタ変数の持つ番地に対する加減算ということです。 こんなのは当然「101番地」に決まっていると考えたあなた・・・、実は違うんです。 答えは「102番地」です。不思議なことに+1したのに番地が2増えるのです。 次のポインタ変数に対する加算は、次の結果になります。皆さん規則性がわかりますか?
四則計算
四則計算とは、足し算、引き算、掛け算、割り算のことです。
(加算、減算、乗算、除算)
プログラミングでは頻繁に計算を行います。
計算の仕方は単純で、見た目にもわかりやすいですが、いくつか注意点があります。
まずは簡単なサンプルコードから。
#include 」を用いて構造体の各メンバにアクセスしています。メンバ z に関してはポインタ型ですので、最後の printf 関数では、「ポインタで指した先の構造体」のポインタのメンバにアクセスしていることになります。ちょっとややこしいですが、 (*構造体ポインタ型変数). メンバ名 により、ポインタから構造体のメンバにアクセスし、各メンバの値を取得できていることが確認できると思います。 でも、上のプログラム、 すごく書きにくいし読みにくい ですよね…。 特に構造体のメンバにポインタがあるとアクセスするのに括弧や「*」が複数あって非常に読みにくいです。この 構造体のポインタを用いた時のプログラムの書きにくさ、読みにくさを解決してくれるのが、アロー演算子「->」 なのです!! スポンサーリンク アロー演算子「->」は「*」と「. 」を一つにまとめた演算子 アロー演算子「->」とはまさに、ここまで説明してきた、ポインタから構造体のメンバへアクセスする演算子です。 使用方法は下記のように変数名とメンバ名の間に「->」を入れ込む形になります 構造体ポインタ型変数->メンバ名 実は、前のプログラムで用いた (*構造体ポインタ型変数). メンバ名とアロー演算子を用いた構造体ポインタ型変数->メンバ名は全く同じ動作 をします。 なので、今まで解説してきた「*」と「. 整数の四則演算 - C99対応のC言語入門 - Perl元気塾のC言語講座. 」による動作をアロー演算子「->」一つだけで実現することができますし、括弧の数も減らせますので、 アロー演算子を用いることでプログラムも書きやすくプログラムも直感的に読める ようになります。先ほどのプログラムをアロー演算子を用いたプログラムに書き直してみましょう。 #include pnum *= 2; 皆さんの環境でも動かしてみると明確にわかるでしょう。実はビルドエラーが発生します。 error C2296: '*=': 無効です。左オペランドには型 'short *' が指定されています。 ポインタ変数に対する乗除算は、C言語では認められていません。 pnumの番地が「100番地」だったとして、×2倍すると「200番地」になりますね。 しかし、得られた200番地にいったいなんの意味があるのでしょう・・・。 番地という数値を2倍にする意味など、存在しないのです。そのため、ポインタ変数に対する乗除算は禁止されています。 ナナ このように番地を管理するポインタへの演算は、「番地」を扱うがゆえに特殊な演算結果を生み出します。しかし、理由としては明確なものがあるのです。 ポインタ型の変数のメモリサイズ演算の特殊ルール 師匠!ふと思ったんです。メモリの番地って、どこからどこまであるんですか?ポインタって何番地から何番地まで管理できるんですか? ナナ それはね、すごく大事なことだね。変数とは割り当てられたメモリサイズによって、管理できる数の上限が決まるんだよ。つまり、ポインタ変数のメモリサイズによって管理できる番地の幅が決まるってことだね。 ポインタ変数のメモリサイズについて学びましょう。 ポインタ変数のメモリサイズは何バイト? C言語入門カリキュラム | ページ 2. まずはおさらいです。次のように変数を定義しました。 char num1;
short num2;
long num3; 変数のデータ型のサイズはchar型は1バイト、short型は2バイト、long型は4バイトでした。このサイズに従い、変数ラベルの長さが変わるのですね。 続いてポインタ変数に目を向けましょう。 ポインタ変数には番地という数値を入れるのでした。つまり、ポインタ変数のメモリサイズの大きさによって、格納できるメモリ番地の範囲が決まることになります。 では、質問です。 ポインタ変数pnumのメモリサイズは何バイトなのでしょうか? 実は、このポインタ変数のサイズは環境依存です。 とある環境では4バイトかもしれませんし、別の環境では2バイトや8バイトかもしれません。このように、ポインタ変数のメモリサイズは環境により変化します。 では、実際に皆さんの環境でポインタ変数のサイズを見てみましょう。データ型のメモリサイズを求める方法といえば「sizeof演算子」です。 sizeof演算子の詳細は『 C言語 sizeof演算子【データサイズの算出と実践的な使い道】 』の記事を読むとよいでしょう。 sizeof演算子を使ったポインタのメモリサイズの算出 次のプログラムを記述し、どんな数値が表示されるかを予想してから動かしてみてください。 #include */ printf ( "a =%d, b =%d\n", a, b); return 0;}
$ gcc increment_and_decrement_operators. c $ a a = 0, b = 0 a = 1, b = 1 a = 0, b = 0 a = 1, b = 0 a = 0, b = 0 a = - 1, b = - 1 a = 0, b = 0 a = - 1, b = 0
これらの代入文は,一般的には以下のように記述できます. インクリメント,デクリメント 一般的な記述
b = ++a;
a = a + 1;
b = a;
b = a++; b = a;
b = --a; a = a - 1;
b = a--; b = a;
a = a - 1;
一般的な記述をすると上記のように2つの文になってしまいます. そこで,インクリメント演算子とデクリメント演算子を利用することで,a[i++]やb[--j]等のように式しか記述できない部分に記述できます. ビット演算子とシフト演算子
ビット演算子とシフト演算子は,こちらの記事で深掘りしています. 【C言語】ビット演算子とシフト演算子の使い方
こういった悩みにお答えします. こういった私から学べます. 目次1 ビット演算子2 &:ビット毎のAND(論理積)3 |:ビット毎のOR(論理和)4 ^:ビット毎のXOR(排他的論理和)5 ~...
代入演算子
代入演算子は,変数に(演算結果を含む)値を代入するために利用される演算子です. 実際のコードでは,以下のように自分自身に何かの演算をするという記述がよく出てきます. この例では,1つの式の中で同じ変数が2度出てきます. また,変数名が長いと以下のようになります. current_thread [ current_cpu] = current_thread [ current_cpu] + 0x10;
こうするとキー入力も大変ですし,間違える(タイポする)可能性が高くなります. そこで,C言語では簡単に記述できる代入演算子が用意されています. 上記の文は,以下のように書くことができます. current_thread [ current_cpu] += 0x10;
これならタイプ数が減り,間違える可能性が低くなります.これが代入演算子のメリットです. 真偽 値(整数型)
真 0以外の値
偽 0
ここで注意してほしいのは,等しいかどうかを比較するときには==という記号を利用するということです. =という記号に間違えてしまう傾向にあります. ==の部分を=にしても文法的には間違いではなく,ただの代入文になります. なので,コンパイル時にエラーにならないので注意して下さい. GCC/Clangでは,if文等の条件式で==を間違えて=と書いてコンパイルした時に,以下の警告メッセージを表示します. GCC:warning: suggest parentheses around assignment used as truth value [-Wparentheses] Clang:warning: using the result of an assignment as a condition without parentheses [-Wparentheses]
日本語訳は「条件式ではカッコを付けましょう」という意味ですが,==を間違えて=と書いてしまった時に表示されるメッセージです. デバッグに有用なので覚えておきましょう. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include ピエトロ
逆ポーランド記法を用いた四則演算
投稿記事
by ピエトロ » 8年前
C言語にて逆ポーランド記法で書かれた1桁の四則演算をスタックを使用し、計算するプログラムを作成したいのですが、23+と入力すると101と返ってきたりして、うまく動きません。どなたかよろしくお願いします。
コード: #include 45 ID:BLsnlnFXd クライアント14円で売りつけたFF14さんには負けますわw いや~アクティブアカウント250万ですか 個人でも出せるんとちゃいまっか3500万w >>119 末尾Mってほんとうにキチガイなんだな 122 名無しさん必死だな 2021/07/25(日) 20:37:32. 62 ID:KOesEFfo0 末尾dがなんか言っとるな 124 名無しさん必死だな 2021/07/25(日) 21:20:55. 78 ID:J/kdB/ZD0 米のTwitterなんか人口比で1/10以下だしなぁ… >>117 コンセプト的に間違ってはいないからつまりもっと寄せろってことだな 今のグラフィックデザイナーが放つパチモン臭を取り払って原画のイメージを大切にと 126 名無しさん必死だな 2021/07/26(月) 06:17:56. 21 ID:8nrFdwaO0FOX 35周年やオリンピックでの盛り上がり見てるとやっぱドラクエブランドってとてつもないんだなって再確認できる 任天堂の主力の存在感と並べるのはドラクエくらいでしょ ゴキちゃんのアンチ活動は全くの無意味だったね 128 名無しさん必死だな 2021/07/26(月) 07:01:27. 【DQタクト】【疑問】無課金は開花の扉どこまで行けるんだろうか | ドラクエタクト攻略まとめ隊. 58 ID:p/ocJRl7aFOX >>126 日本だけな 実際、海外勢は、DQが流れた時はゲーム音楽と気付かずにスルーしてて、 その後のゲーム音楽から気付き始めとる 129 名無しさん必死だな 2021/07/26(月) 07:08:00. 54 ID:8nrFdwaO0FOX >>128 アメリカでトレンド1位になってるんだよなぁ 130 名無しさん必死だな 2021/07/26(月) 07:23:58. 98 ID:p/ocJRl7aFOX >>129 それは後からニュースを見てツイートしとるだけで、DQ自体が知られてた訳じゃないよ 131 名無しさん必死だな 2021/07/26(月) 07:30:48. 38 ID:VNxPsd+O0FOX アメリカのドラゴンクエストってこれだよ 有名なダンジョンズ&ドラゴンズのゲームの中の一つ これの曲だって言われたから外人が「え?」と思って見てただけ 認めたくない気持ちは分かるが、その説はさすがにちょっと強引過ぎるだろw 133 名無しさん必死だな 2021/07/26(月) 08:32:56. 5 発売 第15回アストルティア★ハッピーくじ 販売開始(12時~) 8月3日(火) 打ち上げ柳花火 受け取り期限(23時59分まで) 8月4日(水) おでかけラリー超さんぽ玉無料キャンペーン終了(5時59分まで) コインホッタ鉱山採掘量アップキャンペーン終了(5時59分まで) ワルぼうウィーク終了(5時59分まで) ドラクエ10ダウンロード版35%OFFセール 終了 8月7日(土) 羅刹王バラシュナ3タイムアタック 開催 開催中のイベント 幻の海トラシュカ2021 DQXショップ夏の特別セール 今週はアストルティア9周年カウントダウンが行われます。冒険者の広場で打ち上げ柳花火が配られていますね。 ブログランキング参加中です 関連記事 97: 名無しさん ID:m5xIs1I3d >>93 あのエンディングみてバーバラヒロインじゃないと思うやつガ〇ジじゃね 101: 名無しさん ID:NIYgXmoU0 >>97 別に主人公とイチャイチャしてた訳でもねえのに ただ消えただけでヒロイン面されましても 99: 名無しさん ID:j4fqomRv0 バーバラとかいう唐突にヒロインになる奴 引用元:C言語 - Part.2:演算と変数 - のむログ
C言語入門カリキュラム | ページ 2
C言語 ポインタへの演算【番地に対する演算の特殊性を解説】
【Dqタクト】【疑問】無課金は開花の扉どこまで行けるんだろうか | ドラクエタクト攻略まとめ隊
59 ID:SLjCPChJ0 >>1 世界トレンド1位だったぞ >>40 ドラクエで盛り上がってるところになんでFF14がでてこなきゃいけないんだ 気持ち悪いヤツ FF14信者さんドラクエへのコンプレックス大爆発で大暴れ トンガ3位ワロタ 外人もヌルヌルマッチョ好きねえ 47 名無しさん必死だな 2021/07/24(土) 01:22:42. 24 ID:6WUZ/Pzl0 FFって15位以下だったな ニーアやクロノより下 まあだからなんだってくらい順当なだけだが >>45 だからやってねーよ たまに覗くFFスレに沸いてるドラクエのがいいと煽ってる奴いるじゃん そいつのことだよ >>47 ファイナルファンタジーでトレンド入りだぞ マヌケ ドラクエがアメリカトレンド一位 DQ10ガーFF14ガー あのうFF14信者さん帰ってくれます?邪魔なんで 51 名無しさん必死だな 2021/07/24(土) 01:30:05. 05 ID:6WUZ/Pzl0 >>49 いや上位にきてないでしょ 日本の話だぞ? ドラクエ4「ヒロインが元気系です」ワイ「ええやん」ドラクエ5「ヒロインが元気系です」ワイ「まぁええやん」 | げぇ速. >>1 キチガイ右翼すぎやまこういち マズイだろw 明日ドラクエが世界で記録的セール数出すんだな FFやってるような朝鮮人スパイの非国民はまさかゲハにいないよな? 14はやってないよ FF11少しやっただけ 56 名無しさん必死だな 2021/07/24(土) 01:43:52. 71 ID:6WUZ/Pzl0 >>56 奥のとんがり含めて外周のシルエットを見るとキングスライムにも見えてしまう >>34 そうした方がどちらも目立てるからな ジャンプがそうやって持ち上げて成功したから猿真似を続けてんだよ >>56 若い子は知らないかもしれんが これまんこマークだよ 腐っても五輪すげえってだけじゃないの >>56 東京都のマークやで FF14はゲハではもうハード信者の垣根無く印象最悪だから理屈がどうであろうが叩かれるよ この板にもいる急に自分からネトウヨ連呼してレスした相手をネトウヨ認定する変人と 同レベルのウザさだし 恨むなら何年も執着してる馬鹿を恨め 63 名無しさん必死だな 2021/07/24(土) 12:34:59. 50 ID:je15wnDva ドラクエは8から海外で100万本売れてるぞ 「何の曲?」って言うのでトレンド入りしてるんだと思ってたわ >>34 はたから見ると不毛すぎてなw スマブラとスプラの信者が殴り合ってるようなもん いやいやどっちも楽しんでる奴いっぱいいるやろ 五輪に使われたドラクエ以上に売れてないゲームは全然浮上してこなかったのでそういう事です >>65 いやFFはコマンド捨て去ったからこれからが本当の殴り合いの時代でしょう それだけだと知名度かは分からんだろ トレンド入りすらしなかった他の空気ゲーがその証明だからな 知らなきゃそもそも名前すら出てこない 70 名無しさん必死だな 2021/07/24(土) 13:50:39.
ドラクエ4「ヒロインが元気系です」ワイ「ええやん」ドラクエ5「ヒロインが元気系です」ワイ「まぁええやん」 | げぇ速