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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Q&A

解決済

3回答

2681閲覧

C言語 配列 値出力 値がおかしい

kazuyakazuya

総合スコア193

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

0グッド

0クリップ

投稿2019/09/06 13:59

C言語で配列のアドレスと値を出力させたのですが
値がおかしいです。

c

1#include <stdio.h> 2 3int main(void) { 4 int str[] = {'1','2','3,','4','5'};//宣言と初期化。 5 printf("アドレス・・・%p 数列・・・%d\n",str,str[1]);//str・str[0]のアドレスとstr[1]の値(2)が出ると予想したが・・・。 6 return 0; 7}

実行結果

c

1アドレス・・・0053F864 数字・・・50

これは何が原因なのでしょうか?
分からないので教えてください。

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

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

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

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

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

y_waiwai

2019/09/06 14:04 編集

それがどういうふうにおかしいのか説明しましょう どー見ても正しいですが。
kazuyakazuya

2019/09/06 14:05

つまり、この実行結果は正しいということですか?
y_waiwai

2019/09/06 14:06

どこが違うんでしょうか。
y_waiwai

2019/09/06 14:11

それで2を出したいならコードが間違ってます。 繰り返しますが、こんな質問を繰り返すより、もちっとCの基本を学びましょうよ
kazuyakazuya

2019/09/06 14:12

これでも参考書の 順にやっているのです・・・ いままでの質問でも 配列の認識が甘々なので配列をやっています。
thkana

2019/09/06 22:24

ちなみに参考書は何をお使いですか?
kazuyakazuya

2019/09/06 23:10

苦しんで覚えるC言語・・・です。 辞書として使っていましたが 最初から読み直しています。
thkana

2019/09/07 00:52

書籍版は持っていませんが、今回の件はWeb版だと https://9cguide.appspot.com/14-01.html の「文字コード」のあたりですかね。 本の中では読んだ順に説明済の項目だけが出てくるように構成するでしょうが、世の中のプログラムはあなたが本を順にどこまで読んだかなんてお構いなく、「C言語全部」の範囲でプログラムを書きます。その意味では、せめて入門書全部に目を通し終えてから他のプログラムに手を出すようにしたほうが良さそうに思います。 これだけの頻度で聞きまくらなきゃいけない、というのはやり方として間違っているんじゃないか、と疑念を持たざるを得ません。
kazuyakazuya

2019/09/07 01:39

ありがとうございます。 やはり一通りすべてに目を通してから 実際にプログラムを組んだほうがいいのですね。
guest

回答3

0

数列・・・50というのが理解できないということでしょうか。
str1[1]は'2'の値が格納されています。これは、文字の2なので、アスキーコードでは16進数で0x32になります。
10進数では50です。下記を参照ください。
アスキーコード表

投稿2019/09/06 14:12

tatsu99

総合スコア5424

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

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

kazuyakazuya

2019/09/06 14:15

ありがとうございます。
guest

0

printf("アドレス・・・%p 数列・・・%d\n",str,str[1]);

str[1] は文字の '2' です。 %d は数値として出力なので、'2' の文字コードが出力されるかと。
ので、出力はおかしくないです。

文字の '2' を文字として出力したければ、 printf では %c を使えばよいかと思います。

投稿2019/09/06 14:05

編集2019/09/06 14:08
unhappychoice

総合スコア1531

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

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

kazuyakazuya

2019/09/06 14:07

ありがとうございます。
guest

0

ベストアンサー

数値と文字は違います。文字はASCIIコードとしてメモリに格納されます。

str[1]は'2'は数値表記にすると0x32=50です。プログラムの出力結果は正しいです。

一度、ここにあるようなコードをソースに埋め込み、アドレス、データ、ASCII表記の関係がどうなっているかしっかり勉強したほうがいいと思います。
今回の場合なら上記関数を埋め込んでhex_dmp(str, sizeof(str));とか書いて実行してみてください。

投稿2019/09/06 14:05

編集2019/09/06 14:23
nomuken

総合スコア1627

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

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

kazuyakazuya

2019/09/06 14:07

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問