• ベストアンサー

char *name1[4] とchar name2[][4] の違いについて

noname#30727の回答

noname#30727
noname#30727
回答No.2

例えば、"abc" というのは、変数名は存在しませんが、コンパイラが自動的に作成した char 名前なし[4] = {'a','b','c','\0'} で初期化された配列を意味します。例外として char の配列を初期するときには初期化する値そのものになります。 ですから、char *name1[4] = {"abcdefghi","jkl","l","mn"};  は、 char 名前なし0[10] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', '\0' }; char 名前なし1[4] = { 'j', 'k', 'l', '\0' }; char 名前なし2[2] = { 'l', '\0' }; char 名前なし3[3] = { 'm', 'n', '\0' }; char *name1[4] = { 名前なし0, 名前なし1, 名前なし2, 名前なし3 }; というように解釈され、 同様に、char name2[][4] = {"abc","def","ghi","jkl","mno","pqr","stu","vwx"}; は、 char name2[8][4] = { { 'a', 'b', 'c', '\0' }, { 'd', 'e', 'f', '\0' }, { 'g', 'h', 'i', '\0' }, { 'j', 'k', 'l', '\0' }, { 'm', 'n', 'o', '\0' }, { 'p', 'q', 'r', '\0' }, { 's', 't', 'u', '\0' }, { 'v', 'w', 'x', '\0' } }; というように記述したのと全く同じ意味ですから、ポインタとは直接関係ありません。 どちらも、printf(name1[0]); や printf(name2[0]); のように参照できますが、データの構造は明らかに違います。 >char name2[4][]に近いと思いました。 この発想は正しいです。文字列で初期化する場合に限っては1次元目の大きさも省略できてもよさそうなものですが、まあ、決まりは決まりなのでしょう。

__sourin__
質問者

お礼

詳細な説明どうもありがとうございます。(^^) 変数が示すアドレスを見ていったらよく分かりました。 今後もご指導いただけるようよろしくお願いします。

関連するQ&A

  • CSVファイルの任意の列をダブルクォーテーションで囲みたいのですが・・・。

    CSVファイルの任意の列をダブルクォーテーションで囲みたいのですが・・・。 例えば  abc,def,ghi,jkl  mno,pqr,stu,vwx     ↓  abc,"def",ghi,"jkl"  mno,"pqr",stu,"vwx" というように、2番目と4番目の列の文字列をダブルクォーテーションで囲む、といった具合にです。 調べてみるとVBAを使用する方法はあるようですが、EXCELやその他のフリーソフト等を使用して処理する方法はありませんでしょうか。 よろしくお願いいたします。

  • テキストデータ(文字)のブロック移動

    説明しにくいのですが 例えば、下のような データがあるとします。 データ1 001 002 003 004 005 006 007 008 データ2 ABC DEF GHI JKL MNO PQR STU VWX この二つのデータを 001ABC 002DEF 003GHI 004JKL 005MNO 006PQR 007STU 008VWX のように、横にひっつける事は メモ帳では容易にできませんが メモ帳程度で(上がっててもあまり メモリやリソースを食わない もので、機能もごてごてしていなくて でも一太郎のように、ブロックで囲み 移動、複写、など簡単に行える フリーソフトなどないでしょうか? エクセルの機能を使って、ひっつけたり しているのですが、なにぶん面倒で、 ワードでも無理みたいな感じですし しかも、メモリをたくさん使うし 一太郎は入ってないですし、入れたくもないし・・・ ワードでも無理みたいな感じですし そのままTXTとして保存できないし・・・・ 心当たりをご存じの方おねがいします。

  • バッチでfor文で文字列の中身を繰り返したい

    バッチで、for文で、半角スペースやタブ以外で区切られた文字列から、区切り文字毎に 取り出したいのですが、最初の1回しか取り出せません。最後まで繰り返しが行われませ ん。 バッチでは、そもそも、半角スペースやタブ以外では、文字列の中身を繰り返すことは できないのでしょうか。 それとも、他に良い方法があります。 やっていることは、 例えば、 for文で、スラッシュ「/」で区切られた文字列からスラッシュ毎に取り出そうとしている のですが、最初の1回目しか表示されず、最後まで繰り返しが行われません。 以下、色々と試したのですが..... set str=abc/def/ghi/jkl/mno/pqr/stu/vwx/yz for %%a in (%str%) do echo %%a の場合は、 1行そのまま表示されます。(あたりまえです。) for "delims=/" %%a in (%str%) do echo %%a for "delims=/" %%a in ('echo %str%') do echo %%a の場合は、 「"delims=/" の使い方が誤っています。」となります。 for /f "delims=/" %%a in ('echo %str%') do echo %%a の場合は、 最初の1回目の「abc」しか表示されず、そこで処理が終わり、残りが表示されない。 期待している結果は、 これを、 abc def ghi jkl mno pqr stu vwx yz と表示させたい。 set str=abc def ghi jkl mno pqr stu vwx yz for %%a in (%str%) do echo %%a の場合は、 abc def ghi jkl mno pqr stu vwx yz と表示されます。 バッチでは、そもそも、半角スペースやタブ以外では、文字列の中身を繰り返すことは できないのでしょうか。 できる場合、その方法を教えてください。また、他に良い方法がありましたら、教えて下さい。

  • 加工バッチ

    加工バッチの件で質問させて頂きます。 テキストログファイルの文字列をバッチで加工したい。 テキストファイルの文字列にはコロン(:)、スペース( )、 セミコロン(;)を区切り文字として使用していますが、 それをバッチで全てスペースで区切りしたいのですが可能でしょうか。 例えば ABC DEF GHI JKL: MNO;PQR;STU;VWXYZ バッチ起動後--------> ABC DEF GHI JKL MNO PQR STU VWXYZ よろしくお願いします。

  • エクセルで,スペースのある文字列を列ごとに分けるには?

    例えば abc def ghi jkl mno pqr という文章があったとします。 それを |abc|def|ghi| ------------- |jkl|mno|pqr| みたく,スペースのあるところで区切るにはどのようにすればよいでしょうか。教えてください。

  • 【PHP】phpで毎日ランダムで変わる処理

    こんばんは。 タイトル通り、PHPで24時間毎(毎日)変わる文面を作れないかと思い記述しているのですが 入り口で足が止まったので質問させて頂きました。 仕様としては 外部のテキストファイル(カンマ区切り)を読み込み配列として代入。 その中から日替わりランダムで表示したいと考えています。 実験として下記の内容を記述してみた所・・・ [test.txt内容]計2行 abd,def,ghi,jkl mno,pqr,stu,vwx <?php $file_name = file_get_contents("./test.txt"); $list = explode(",","$file_name"); ?> HTMLで出力してみた所、カンマ区切りで変数には代入出来ているみたいなのですが <?= $list[0] ?><br> <?= $list[1] ?><br> <?= $list[2] ?><br> <?= $list[3] ?><br> <?= $list[4] ?><br>・・・ の形になります。 改行毎に、 $list[0][0] = abd; $list[0][1] = def; $list[0][2] = ghi; $list[0][3] = jkl; $list[1][1] = mno; $list[1][2] = pqr; $list[1][2] = stu; $list[1][3] = vwx; の様に代入したいのですがどの様な記述を行えば宜しいでしょうか。 頭が固く、とても低レベルな質問かと思いますが 何卒、よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 秀丸の検索・置換の正規表現の最短一致の挙動が変です

    秀丸の検索または置換の正規表現の 最短一致での挙動ですが、 /abc/def/ghi/jkl/mno/pqr/st/uvw.xyz の先頭にカーソルを置いた状態で、 (質問1) 正規表現のチェックボックスをチェックして /.*$ で検索すると /abc/def/ghi/jkl/mno/pqr/st/uvw.xyz が検索されると思うのですが 実際には /def/ghi/jkl/mno/pqr/st/uvw.xyz が検索されてしまいます。 なぜでしょうか。 (/abc/.*$とするとカーソルがある /abc/def/ghi/jkl/mno/pqr/st/uvw.xyz ではなく次の行以降の /abc/def/ghi/jkl/mno/pqr/st/uvw.xyz が検索されてしまいます?) (質問2) 正規表現のチェックボックスをチェックして /.*?$ で検索すると最短一致となるため /uvw.xyz が検索されると思うのですが 実際には /def/ghi/jkl/mno/pqr/st/uvw.xyz が検索されてしまいます。 なぜでしょうか。 (なお、/[^/]*$では/uvw.xyzが検索されます)

  • perlかベクターなどのフリーウェアでこれはできますか?

    1.txt abc def ghi jkl mno pqr stu 2.txt mno abc 123 900 456 def stu qqq プログラム 1.txtと2.txtを比べて、1.txtに無い文字を3.txtへ書き出す。 3.txt 123 456 900 qqq Excelなら分割して何度かソートとIFを使えば解決できなくも無いのですが、今回は、行数が100万行を超えているため現実問題として無理です。 そこで、perlで行いたいのですがどのようにすればできますか? 良い方法が思いつきません。。。 どなたか、教えていただけないでしょうか? もしくは、これを解決するためのフリーウェアなどあればとても、助かります。 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • エクセル セルの並べ換え方法について教えて下さい

    縦 A列とB列に入力してある内容を縦一列にまとめて上下二段にする方法、 どなたか教えて下さい! A列   B列 abc def ghi jkl    mno pqr これを A列 abc def ghi jkl mno pqr という様にしたいのです。   

  • 一括置換をしたい

    ワード2003を使っています。 あるテキストデータの 「ABC」という文字列を「DEF」に置換したいんです。 同様に、 「GHI」を「JKL」に、 「MNO」を「PQR」に置換したいんです。 このように3つの文字列をボタンひとつで置換するにはどのようにすれば良いでしょうか? よろしくお願い致します。