• 締切済み

2次元配列とポインタ

char str1[][6]={"one","two","three","four","five"}; char *pt1; pt1 = str1; //(1) 上記の記述では(1)で型エラーが発生します。 ここを pt1 = *str1; //(2) と変更するとOKになるのですが、 (1)にすれば配列名だけでstr1先頭のアドレスがポインタpt1にセット されると思うのですが、なぜダメなのでしょうか?

みんなの回答

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

>上記の記述では(1)で型エラーが発生します。 そりゃそうですね。 pt1の型はchar * str1の型はchar (*)[6] で、異なりますから。

02160315
質問者

お礼

ありがとうございます。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

どうして pt1 = str1; //(1) をしたいのかを明示しましょう str1 と 右辺に記述した場合 char[5][6]と解釈されるので char*とは互換がありません 無理やりやるなら pt1 = (char*)str1; といった具合でしょうか ・・・ *str1 と右辺に記述すると str1[0]の中身つまり char[6]になるので char*の変換も可能です

02160315
質問者

お礼

ありがとうございます。

関連するQ&A

  • C言語の型と配列

    char* str[10]={"a","b"}; char* str2="c"; としたときにstr=str2とすると 型が合わないといったエラーが出ます。 でもstrって結局はポインタの配列の先頭要素のアドレスですよね。 ポインタにポインタを入れているので通るのかなと思ったんですけど、 配列で宣言するとポインタにも型がつくのでしょうか? この例だと strは char * を10個持つ配列をさすポインタ  で、 str2はchar *をさすポインタ みたいなかんじです。 質問の意味がわかりにくいですが、ご指摘をいただければ補足しますので よろしくお願いします。

  • 配列とポインタ

    配列とポインタの違いを教えて下さい。 後 char str[100]; と const char *strはどこが違いますか?

  • ポインタ配列

    "one","two","three","four","five","six","seven","eight","nine","ten" のポインタ配列の文字列を、ASCIIコード順に並べ変えようと思ったのですが、 もうどこが間違っているかさえわからないぐらいになってしまいました。 まだまだはじめたばかりなもので、わからないことだらけなんで、 できるだけわかりやすい説明おねがいします。 関数の引数に問題があるのじゃないかと思ったのですが、 何かいいアドバイスありましたら、お願いします。 #include <stdio.h> /* 関数のプロトタイプ宣言 */ int strmp(char *,char *); void cpy(char *,char *); int main (void) { /* ポインタ配列の定義 */ char *x[10]={"oneee","twooo","three","fourr","fivee","sixxx","seven","eight","ninee","tennn"}; /* ポインタのポインタの定義 */ char **pp=x; char k[100]; char *p=k; int i,t,a,b,c,d; a=0; /* ポインタ配列を自作関数を使って、ASCIIコードの大きいほうからに並び替える */ for(i=0;i<9;i++) { for(t=1;t<10;t++) { a=strmp(*(pp+i),*(pp+t)); if(a<0) { cpy(p,*(pp+i) ); cpy(*(pp+i),*(pp+t) ); cpy(*(pp+t),p); } } } for(i=0;i<10;i++) { printf("%s ,",x[i]); } printf("\n"); return 0; } /* 文字の比較をする関数 */ int strmp(char *x,char *y) { int i; for(i=0;*(x+i)==*(y+i);i++) { if( *(x+i)=='\0') { return 0; } } return *(x+i)-*(y+i); } /* 文字をコピーする関数 */ void cpy(char *a,char *b) { int i; for(i=0;*(b+i)!='\0';i++) { *(a+i)=*(b+i); } *(a+i)='\0'; }

  • javaの簡略for文の2次元配列

    javaで以下のような簡略化されたfor文を使ったプログラムがあったとします String[] strs = new String[3]; strs[0] = "one"; strs[1] = "two"; strs[2] = "three"; for (String str : strs) { System.out.println(str); } 出力 one two three この簡略化されたfor文は2次元以上の配列にも対応しますか? 出来るのなら、どう書けばいいでしょうか?

  • 配列とポインタの関係

    配列とポインタについてです。 char *p_str="HAPPY";と char p_str[10]={'H','A','P','P','Y'}; は同じことでしょうか?

  • 二次元配列の分割

    よろしくお願いします。 $hoge = array( "one" => array("abc" => "100", "def" => "200", "ghi" => "300"), "two" => array("abc" => "110", "def" => "210", "ghi" => "310"), "three" => array("abc" => "120", "def" => "220", "ghi" => "320") "four" => array("abc" => "130", "def" => "230", "ghi" => "330") ); というような配列があったとき、 abcが110以下のときと、110より大きい場合で分割した配列を 用意したいと考えてます。 具体的には、 $hoge1 = array( "one" => array("abc" => "100", "def" => "200", "ghi" => "300"), "two" => array("abc" => "110", "def" => "210", "ghi" => "310"), ); と $hoge2 = array( "three" => array("abc" => "120", "def" => "220", "ghi" => "320") "four" => array("abc" => "130", "def" => "230", "ghi" => "330") ); に分割したいと考えています。 どのように記述すればよいのでしょうか?

    • ベストアンサー
    • PHP
  • 構造体とポインタ配列

    現在C言語の勉強をしております。 環境はwindowsXP、コンパイラはVC6.0です。 構造体と、ポインタの配列についてなのですが、 以下のような構造体が宣言されている時に、リスト構造にデータがいくつか入っているとします。 // 構造体 typedef struct address { unsigned char names[NAME_SIZE+1]; /* 名前 */ char tels[TEL_SIZE + 1]; /* 電話番号 */ struct address *prev; /* 前へのポインタ */ struct address *next; /* 次へのポインタ */ }Address, *a_pt; そのリスト構造を先頭要素か順番にポインタ配列に格納するには以下の方法ではおかしいでしょうか? /* ポインタ配列を用意する */ Address *array[MAX_COUNT]; /* top_ptは先頭のポインタです */ pt = top_pt; /* データがなくなるまで配列へ格納する */ while(pt != NULL){ array[count++] = pt; pt = pt->next; } /* 配列の最後はNULLとする */ array[count] = NULL; また、配列の中身を確認する方法としては、 printf("配列の中身:%s\n", array[0]->names); では、アドレスが表示されてしまうのかな・・と思ったら、accessViolationで落ちてしまいました・・・。 中身はどうしたらデバッグ出来ますでしょうか? そもそも、以下の2つは何か違いはありますか? Address *ptA[100]; a_pt ptB[100]; 皆さん、どうかよろしくお願いいたします。 理解不能な場合はご指摘ください。

  • 二次元配列による文字列の配列の受渡しについての質問です。

    二次元配列による文字列の配列の受渡しについての質問です。 #include <stdio.h> void print_pname(char str[][5], int n) { int i, j; for (i = 0; i < n; i++) { printf("str[%d] = \"", i); for (j = 0; str[i][j] != '\0'; j++) putchar(str[i][j]); printf("\"\n"); } } int main(void) { char ary[][5] = {"Lisp", "C", "Ada"}; print_pname(ary, sizeof(ary) / sizeof(ary[0])); return 0; } 上のプログラム中の関数print_pnameの引数char str[][5]についてですが char (*str)[5](配列のポインタ)と変更した場合にwarningが多数発生します。 これはどうしてでしょうか? また、上のプログラムを配列のポインタを使って変更することは可能でしょうか? 以上、よろしくお願いします。

  • C言語のポインタと配列について

    下のコードについて2つ質問があります。 (1) char *p; p = str; ならわかるのですが、なぜ型が違う char *p = str; のような代入がOKなのでしょうか。文字列をコピーするときの   *p = *str; と比較して、とても違和感があります。  str は引数で受けた文字列の先頭アドレス。 (2)   char *str;   str = " 1 23 4 5"; と   char str[] = " 1 23 4 5"; との違いがよくわかりません。 #include <stdio.h> #include <ctype.h> void TrimSpace(char *str) {   char *p = str;        // (1)型が違うのになぜこんな代入をするのか?      while (*str != '\0') {     if ( !isspace(*str) ) {       *p = *str;      // この代入は自然       p++;     }     str++;   }   *p = '\0'; } int main(void) {      //char *str;   //str = " 1 23 4 5";     (2)これでは空白を詰めた後の文字列が表示されないのはなぜか?      char str[] = " 1 23 4 5"; //これで OK   printf("空白を詰める前:\"%s\"\n", str);   TrimSpace(str);   printf("空白を詰めた後:\"%s\"\n", str);   return 0; }

  • ポインタ配列

    ポインタ配列によるひとつのプログラムを組もうと思っています。 で、以下のようなプログラムを作ってみました。 1:#include<stdio.h> 2:#define NUM 5 3:main(void){ 4: char *str[NUM]; 5: int i; 6: for(i=0;i<NUM;i++){ 7: printf("string --->"); 8: scanf("%s",str[i]); 9: } 10: for(i=0;i<NUM;i++){ 11: printf("str[%d] --> %c\n",i,str[i]); 12: } 13:} これなのですが、8行目のscanf文でコンパイルエラーではなく、実行エラーが出ます。どのようにすれば動くようになるのでしょうか? 入力する文字は、9文字以下を想定しています。

専門家に質問してみよう