全角日本語はchar型を2つ連続で続けて出力しないといけませんよね。半角だと1バイトですむところを2バイト使っているわけですけど。半角と全角が入り混じったテキストから的確に1文字ずつ取り出すことは出来ないのでしょうか?(2バイトずつ取り出すと、半角のところで文字化けになってしまいますし、1バイトずつだと全角のところが文字ばけしますよね。)半角の時は、半角を、全角の時は全角をという風に。。。

 あと、全角の日本語を一文字として扱う型は何かないでしょうか。いつも、charの配列でchar[0],char[1]として使っているのですが。

ちなみに、windows98でBorlandのTurbo C++を使って、C言語で書いています。

なにとぞ、よろしくおねがいします。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

混在文字列の処理は確かに面倒と言えば面倒ですが、私は以下のように処理していました。

(最近、プログラムを作っていないので・・・)

 1.配列より取り出した1バイトを半角文字かどうか判断する。
   ライブラリのisascii()等を使用する。この辺りはコンパイラによる
   ところがありますので注意して下さい。

 2.1バイト文字であればそのまま出力し、そうでなければ該当の1バイト
   とその次の1バイトを出力する。

こう言った場合は、面倒ですが1バイトずつ判断して処理するしかないと思います。混在文字列の文字を1文字として扱いたいのであればUNICODEとかで扱えば可能だと思いますが、これは経験がないのであくまで参考として下さい。

上記はあくまで、表示可能な文字列のみの配列の扱いですので、制御コードとか全角でも表示できないコードとかは考慮していません。
    • good
    • 0
この回答へのお礼

やはり、1バイトずつ判断するしかないのですね。挑戦してみます。

お礼日時:2001/08/03 21:51

ShiftJISでは半角は1文字1byte、


全角は1文字2byteになっていますね。
UNICODEを使えば半角も全角もどちらも
1文字2byteで扱えますので便利ですよ。
一回お試し下さい。
それば無理なら、
やはり半角か全角かを判定してくれるマクロか何かを作成して
一文字ずつ判定していくしかないでしょうね。
    • good
    • 0
この回答へのお礼

 UNICODEってものを使ってみます。
ありがとうございました。

お礼日時:2001/08/03 21:59

ShiftJISでは漢字は2バイト文字のため、charではサイズが足りません。


WORD型やwchar_tであればサイズは足りるでしょうが、ASCII文字やいわゆる半角カナなどの1バイトで表現される文字と混合して扱うのが難しくなります。

可能であればUTF-16などの文字種(表現に使うバイト数が変化しないようなコード体系)に変換して扱えばよいと思います。
    • good
    • 0
この回答へのお礼

>可能であればUTF-16などの文字種(表現に使うバイト数が変化しないようなコード体系)に変換して扱えばよい

コード変換はどのようにするか今のところわかりませんが、がんばってみます。
ありがとうございました。

お礼日時:2001/08/03 21:57

 シフトJISですよね。


 その場合は、その文字が全角かどうかは、数値の範囲によって決まっています。
 参考URLのところに俺が以前使ったページを記載しておくので調べてみてください。
 で、読み込んだ文字が全角なら次の文字と一緒に出力するようにすればOKのはずです。

参考URL:http://www.hosibune.net/~mak/technical/kanji.shtml
    • good
    • 0
この回答へのお礼

 はい、シフトJISです。参考にさせてもらいます。
ありがとうございました。

お礼日時:2001/08/03 21:55

TurboC++であるかどうかは不明ですが、


「wchar_t」で代用できませんか?
    • good
    • 0
この回答へのお礼

wchar_tがありました。参考にさせてもらいます。
ありがとうございました。

お礼日時:2001/08/03 21:53

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q高2東大レベル模試で理1A判定とりたいです数学と英語の学習プランを立ててくださいお願いします。

現在高1の東大志望で2月にある高2東大レベル模試で理1でA判定を取りたいと思っています。数学は赤チャートはほぼ演習問題以外は完璧です。英語はまだ単語と英文解釈しかしていません。今から模試まで5ヶ月ほどあるので今から理1A判定を出せるほどのレベルにあげていきたいとおもっていますので数学と英語の勉強プランを考えてください。お願いします。ちなみに駿台模試では数学偏差値60英語62です。

今までにやった参考書は、
数学 
赤チャートI・II・A・B 2週
マスターオブ整数 1週
Z会

英語
単語王 3週
ビジュアル英文解釈I 3週  
Z会

持っていてしていない参考書はビジュアル英文解釈II、ネクステージ、やさしい理系数学です。

Aベストアンサー

高校1年生で駿台高2東大レベル模試は難度が高く手に余るでしょう。
また駿台模試の数学偏差値60英語62というのは駿台ハイレベ高2模試
での成績でしょうか?
もし高1模試の成績なら実力不足です。
私の長男は高1のときに駿台高2模試で数学英語とも偏差値75以上あり
ましたが、高2東大レベル模試は手に余ったと言ってました。
赤チャート完璧だと言っておられますがとってもそうは思えません。
しっかり身についておらず、うわべだけ行ったと思われます。
ネット等で難関中高一貫校の学生が高1や高2で東大A判定を
取っているような書き込みに影響されているように思われますが、
貴方の場合は実力的にみて先走り過ぎだと思います。
来年の2月ではなく、再来年の2月の高2東大レベル模試でA判定を
取るように目標を立てて勉強したほうが良いと思います。

Q副プログラム内(void mystery(char s1[],char s2[]))の動作確認文 

お忙しい中失礼します。
下記のプログラム内の動作について質問があります。宜しければご回答願います。

void mystery(char s1[],char s2[])
{
int i=0;
while(s2[i]!='\0'){ //s2[i]内に文字が入力され、エンターキーが入力されるまで{s1[i] = s2[i]; ++i;}内の動作を行う。
s1[i] = s2[i];    //s1[i] を基準にs2[i]の文字数を++iを使い、カウントする。
++i;         //++iはただs1[i] とs2[i]の文字が合致してるか確認を行う。s1[]=”Good”なら s2[]=”Good”の各文字が合致してるかどうか。
}

s1[i] = '\0';    //s1[i]にエンターキーが入力されて、void mystery(char s1[],char s2[])内のループを抜ける。
return;       //s1[i] = '\0'で'\0'が定義されているのでreturn 0;でない?
}

↑上記動作質問://より右側の文章は文章的に正しいでしょうか?
void mystery(char s1[],char s2[])内でどんな動作をしてるのかが、イマイチよく分からないのです。




↓下記のプログラム
#include <stdio.h>
#include <stdlib.h>
void mystery(char [], char[]);

int main()
{
char m1[81],m2[81];
int i;
printf("Message?");
gets(m1);
mystery(m2,m1);
puts(m2);

system("PAUSE");
return 0;
}

void mystery(char s1[],char s2[])
{
int i=0;
while(s2[i]!='\0'){
s1[i] = s2[i];
++i;
}

s1[i] = '\0';
return;
}

お忙しい中失礼します。
下記のプログラム内の動作について質問があります。宜しければご回答願います。

void mystery(char s1[],char s2[])
{
int i=0;
while(s2[i]!='\0'){ //s2[i]内に文字が入力され、エンターキーが入力されるまで{s1[i] = s2[i]; ++i;}内の動作を行う。
s1[i] = s2[i];    //s1[i] を基準にs2[i]の文字数を++iを使い、カウントする。
++i;         //++iはただs1[i] とs2[i]の文字が合致してるか確認を行う。s1[]=”Good”なら s2[]=”Good”の...続きを読む

Aベストアンサー

うーん。。。
動作の説明としては全て間違いです。

>while(s2[i]!='\0'){
s2のi番目の要素が終端文字で無い間繰り返し処理します。
#エンターキー云々は関係ありません。

>s1[i] = s2[i];
s1のi番目の要素にs2のi番目の要素をコピーしています。
#比較ではなく代入です。

>++i;
ここでのiは文字列の要素を表す要素番号に過ぎません。
#次の文字へ進むだけで、カウントなどしていません。

>s1[i] = '\0';
s2が文字列の終わりを検出したので、
ループを抜けてs1にも文字の終端を書き込んでいます。
#ここでは既にループを抜けた後です。

>return; 
関数の戻り値はvoidつまり「無し」なので
returnで評価される式も在りません。
#疑問系でコメントを書くなら書かない方が良いです。
#混乱のもとですから。。。

短くすると・・・:-p
void mystery(char *s1, const char *s2){
  while (*s1++ = *s2++);
}

うーん。。。
動作の説明としては全て間違いです。

>while(s2[i]!='\0'){
s2のi番目の要素が終端文字で無い間繰り返し処理します。
#エンターキー云々は関係ありません。

>s1[i] = s2[i];
s1のi番目の要素にs2のi番目の要素をコピーしています。
#比較ではなく代入です。

>++i;
ここでのiは文字列の要素を表す要素番号に過ぎません。
#次の文字へ進むだけで、カウントなどしていません。

>s1[i] = '\0';
s2が文字列の終わりを検出したので、
ループを抜けてs1にも文字の終端を書き込んでいま...続きを読む

Q安全保障貿易管理関連貨物の該非判定書を英語で何と呼ぶ?

表題の通りです。
外国のメーカーから輸入する商品に関して、安全保障貿易管理関連貨物に関する該非判定書の提出を要求せねばなりません。
この場合、英語でこの判定書を何と呼ぶのかご存じの方がいらっしゃいましたら、どうぞお教えください。
よろしくお願いいたします。

Aベストアンサー

こんにちは。

>安全保障貿易管理関連貨物の該非判定書

>英語でこの判定書を何と呼ぶのか

「該非判定書」は、"Parameter Sheet" のことですが、そのまま訳しても通じないと思います。日本から輸出する際に使用されるもので、特定の製品に対する、戦略物資等に関する非該当リストです。

「該非判定書」は、たぶん、説明すればこういうことかな?

Parameter Sheet, list of the technical data which is not related to any restriction subject to Export Regulation or Military End-Use Control.

ただ、輸出の問題ですから、相手側が、そういう用意があれば輸出用のドキュメントに添付すると思いますが、再輸出でもしない限りは、あまり輸入側が要求するものではありませんね。現役を離れていますので、あまり自信がありません。こういう書類は、ここ最近のことだそうですね。

参考にしたところ:
http://www.fa.omron.co.jp/support/export/
安全保障輸出管理:オムロン制御機器

こんにちは。

>安全保障貿易管理関連貨物の該非判定書

>英語でこの判定書を何と呼ぶのか

「該非判定書」は、"Parameter Sheet" のことですが、そのまま訳しても通じないと思います。日本から輸出する際に使用されるもので、特定の製品に対する、戦略物資等に関する非該当リストです。

「該非判定書」は、たぶん、説明すればこういうことかな?

Parameter Sheet, list of the technical data which is not related to any restriction subject to Export Regulation or Military End-Use Control.
...続きを読む

Qchar gyou[1024];でcharの表現範囲は-128~127間でと!gyou[1024]の

#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *fp;
char gyou[1024];
int gyousuu = 0;
if ( argc < 2 ){
printf("file mei ga nai\n");
return -1;
}
fp = fopen(argv[1], "r");
if ( fp == NULL ){
printf("fopen dekinai\n");
return -2;
}
while(fgets(gyou, sizeof(gyou), fp) != NULL){
gyousuu++;
}
fclose(fp);
printf("gyousuu=%d\n", gyousuu);
return 0;
}
 以上のプログラムは行数を計算してくれるプログラムです。
  計算結果が
  gyousuu=22 とでます。
 さて、char gyou[1024];でcharの表現範囲は-128~127間ですが、
 gyou[1024]の[1024]とは関係はありますでしょうか!?
  [1024]の意味は”要素数”と参考書に鉛筆書きがありました。
 charの表現範囲である1024は、はるかに超えているみたいですが?
  dharの表現範囲を1024が超えたとしても特に問題はなさそうです!
  このプログラムは動いていますのでは正常です。
  私の
  考え方としまして、何か誤りがありますでしょうか?
  よろしくお願いいたします。

#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *fp;
char gyou[1024];
int gyousuu = 0;
if ( argc < 2 ){
printf("file mei ga nai\n");
return -1;
}
fp = fopen(argv[1], "r");
if ( fp == NULL ){
printf("fopen dekinai\n");
return -2;
}
while(fgets(gyou, sizeof(gyou), fp) != NULL){
gyousuu++;
}
fclose(fp);
printf("gyousuu=%d\n", gyousuu);
return 0;
}
 以上のプログラムは行数を計算してくれるプログラムです。
  計算結果が
...続きを読む

Aベストアンサー

> さて、char gyou[1024];でcharの表現範囲は-128~127間ですが、
> gyou[1024]の[1024]とは関係はありますでしょうか!?
ない。
1024 のほうはただ単に領域の個数を表しているだけで、読み込もうとするファイルの 1 行のバイト数がこれを超えない限り別に 1000 でも 3327 でも構わない(ある程度以上大きくなると別の問題が出てくるが)。
ただ単に 1024 = 2^10 でプログラマにはよく見る数字、かつ、普通のテキストなら 1 行が収まりそうな長さなだけ。

Q"判定"の英語表現について

仕事でUIのデザインや実装に関するテクニカルドキュメントを英訳しています。当方は、プログラマではないため、プログラマの方に何らかのアドバイスがいただければと思いこちらに質問させていただきました。守秘義務があるので、そのものを書き込むことはできませんが、質問したいのは"判定"を表現する最も適切な英語は何かということです。

UIの実装に関する話なのですが、iPadなどのタッチ操作のデバイスにおいて、タッチされたかされないか、あるいは座標軸を基準に選択されている状態か、非選択状態かといったような説明で出てくる"判定"(当たり判定?)を、"Determination"とすべきか、"Judgement"と表現するのか悩んでいます。具体的にはドキュメントで出てくる"タッチ判定""ジェスチャ判定"をどう英訳するかなのですが、プログラマやエンジニアの方でアドバイスをいただけるとうれしいです。
よろしくお願いいたします。

Aベストアンサー

「detect」「determine」あたりですね。judge はまず使いません。
基本的には、この単語の和訳に「判定」という訳語が対応します。
違いは、

detect: ある特定の状況が新たに発生したかどうかを調べる場合。検出と訳す場合もある。
determine: いくつかある選択肢のどれに該当するかを調べる場合。

という感じなので、「タッチ判定」が、
タッチ対象はわかっていて「それをタッチしたかどうかを調べる」のならdetectで、
タッチ対象がわかっておらず「どれをタッチしたのかを調べる」ならdetermineで。

例えば、マイクロソフトの技術サイトでは、

英語ページ: To detect if a key is pressed or released
http://msdn.microsoft.com/en-us/library/bb203902%28v=xnagamestudio.40%29.aspx
日本語ページ: キーが押されたか放されたかどうかを判定するには
http://msdn.microsoft.com/ja-jp/library/bb203902%28v=xnagamestudio.40%29.aspx

英語ページ: Determining Hardware Support
http://msdn.microsoft.com/en-us/library/windows/desktop/bb219618%28v=vs.85%29.aspx
日本語ページ: ハードウェア サポートの判定
http://msdn.microsoft.com/ja-jp/library/ee417821%28v=vs.85%29.aspx

といった感じで訳されています。

「detect」「determine」あたりですね。judge はまず使いません。
基本的には、この単語の和訳に「判定」という訳語が対応します。
違いは、

detect: ある特定の状況が新たに発生したかどうかを調べる場合。検出と訳す場合もある。
determine: いくつかある選択肢のどれに該当するかを調べる場合。

という感じなので、「タッチ判定」が、
タッチ対象はわかっていて「それをタッチしたかどうかを調べる」のならdetectで、
タッチ対象がわかっておらず「どれをタッチしたのかを調べる」ならdetermineで。

例えば...続きを読む

Qchar AA[]{"全角文字"};から"全"という一字を取り出したい

 今晩は、Cの初心者です、宜しくお願いします。
 全角文字の入ったchar AA[]{"全角文字"};から"全"という文字一字を取り出す時にAA[0]とかくとエラーになります。
 どのようにしたら取り出せるのでしょう。
 ポインタを使う方法と使わない方法を教えて下さい。
 宜しくお願いします。

Aベストアンサー

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出す必要があります。

>char AA[]={'全','角'};

char AA[]="全角";
とし
>printf("%s%s\n" , AA[0],AA[1] ) ;

printf("%c%c\n" , AA[0],AA[1] ) ;
とすれば、「全」だけを表示する事が可能と思われます。

日本語を文字列で表示する為の文字コードについては
Shift-JISだけでなく、UnicodeやUTF・EUC・JISなどがあります。

もう少し詳しく記載してあるホームページはないか探してみましたが、ちょっと無理でした。

参考URL:http://marupeke296.com/CPP_charUnicodeWideChar.html

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出...続きを読む

Q該非判定は英語で何と?

該非判定のためのシートはパラメーターシート・・・?
では“該非判定”自体は英語でなんと言うのでしょうか?
できればスペルも知りたいのですが・・・。
ご存知の方お願いします!

Aベストアンサー

ご相談者様へ
ただ単に、parameter sheet
Parameterではないでしょうか?
管轄は経済産業省ですので、
安全保障貿易管理
安全保障貿易管理課へご確認すれば間違いないです。
輸出管理についての
  一般的な問い合わせ
安全保障貿易相談窓口
    TEL:03-3501-3679

個別商談に関する輸出  
  申請についての御相談
安全保障貿易審査課

参考URL:http://www.meti.go.jp/policy/anpo/index.html

Qchar c = 'a'; char h[1] = c; エラー

char型のものを char[]型に代入したいです。

char c = 'a';
char h[1] = c;

として、

h[0] は \x97
h[1] は \x00

にしたいです。
型変換の方法を教えてください。

Aベストアンサー

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数を確保します。
後半で、その中を初期化しています。
添え字は 0 からはじまるので、この場合、h[0] に c の内容が代入されます。
1個しか場所を確保していないので、 h[1] の位置のデータは内容が不定です。
文字列として h を扱いたいのであれば、 C の文字列には終端として 0 が必要ですから、
char c = 'a';
char h[2] = { c, '\0'};

のような書き方が必要になります。
これで、お望みのデータになると思います。

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数...続きを読む

Q私の英語力の判定をお願いします!

TOEIC900点以上を持ってはいます。リーディングパートは450点前後ぐらいだったかと思います。
ですが自分がその点数に見合う英語力があるとはとても思えず、仕事でも(リーディング)差し支えがありまくりで困っています。

以下はニューヨークタイムズの記事です。

ATHENS — Ever since Greece’s credit rating was downgraded last week, its new Socialist government has fought back, saying it has the mettle to tackle the soaring deficit and structural woes that have earned the country a reputation as the weak link in the euro zone.

この記事の中で私が知らない単語は以下のとおりです。
・credit rating
・downgraded
・fought back
・mettle to tackle
・soaring
・deficit
・woes
・earned(←これは知っているけれど、この記事の中ではいまいちニュアンスがわからない)
・weak link

いかがでしょうか?
TOEIC900点以上ホルダーなのにこの単語の知らなさはありえないですか・・?
この点数所持者であれば、このくらいの記事はスラスラ読める方が大半なのでしょうか?

派遣社員としてTOEICの点数を評価されて以上のようなニュースの翻訳を頼まれることがあるのですが、ぜんぜんわからなくて・・。

TOEIC900点以上を持ってはいます。リーディングパートは450点前後ぐらいだったかと思います。
ですが自分がその点数に見合う英語力があるとはとても思えず、仕事でも(リーディング)差し支えがありまくりで困っています。

以下はニューヨークタイムズの記事です。

ATHENS — Ever since Greece’s credit rating was downgraded last week, its new Socialist government has fought back, saying it has the mettle to tackle the soaring deficit and structural woes that have earned the country a ...続きを読む

Aベストアンサー

TOEICもあくまで一つの指標ですよね。英検もTOEICも、それ専門に勉強し続けると高い点がとれる可能性はあると思います。逆に言うと、「実力以上の」点が出てしまう可能性があると、私は思っています。それに、「書き問題」ではないので、たまたま高い点が出てしまうこともあるでしょうね。

質問者さんと同じように、900点前後の点数を持っている後輩の女の子(定期的に受験しているとのこと)がいたのですが、英文レターを書かせてみると、ありゃりゃ、な感じでした。私は860点でしたが、ビジネスに使う英語を含め、総合力は彼女より上かも、と思った次第です。

まぁ、上記のような問題は、日頃ニュースなどを英文で(もちろん日本語でも)読んでいるかどうかなどで、単語の認識度は変わるのでしょうが・・・

確かに、900持っています!と言われたら、このくらいはだいたい読める人かな、と思ってしまうかも。

★★★

人を面接した経験も何度かあるのですが、英語関係の資格を持っている人はだいたい英検とTOEICと両方持っていることが多いので、採用・不採用には両方を考慮します。TOEICに関してはプラスマイナス50で考えてみたり。

いずれにせよ、せっかくその点数で雇ってもらったわけですし、一念発起して頑張ってみてはどうですか?たとえ900が実力以上の点数だったとしても、ある程度の実力はきっとお持ちでしょうし、そこから力を伸ばしていくことはそれほど難しいことではないはずです。

わたしは今NHKのニュース(web上で、英語のニュースを放送しています)を1日に3本聴いて、わからない単語は調べるようにしています。アメリカのイラクへの駐留とか、今だとCOP15の話題とか、知らない単語も結構出てくるので、勉強になります。意味がどうしてもわかりにくい時は、対応する日本語のニュース記事を探すこともできますしね。

がんばれぇ^ ^/

TOEICもあくまで一つの指標ですよね。英検もTOEICも、それ専門に勉強し続けると高い点がとれる可能性はあると思います。逆に言うと、「実力以上の」点が出てしまう可能性があると、私は思っています。それに、「書き問題」ではないので、たまたま高い点が出てしまうこともあるでしょうね。

質問者さんと同じように、900点前後の点数を持っている後輩の女の子(定期的に受験しているとのこと)がいたのですが、英文レターを書かせてみると、ありゃりゃ、な感じでした。私は860点でしたが、ビジネスに使う英語...続きを読む

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

C言語のことで質問があります。

char *name1[4]は
char *name1[4] = {"abcdefghi","jkl","l","mn"};
と宣言でき,ポインタを4つ確保した形となりました。

char name2[][4]は
char name2[][4] = {"abc","def","ghi","jkl","mno","pqr","stu","vwx"};
と4文字以内の文字列を初期化した数だけ確保した形となりました。

この結果からchar *name1[4]の意味は,char name2[][4]ではなくchar name2[4][]に近いと思いました。
しかし,char name2[4][]ではポインタを4つ確保した事にはならないみたいでコンパイルが通りません。
*name1[4]では4つのポインタを確保できるのに~と思ってしまいます。

ポインタと配列は別物と考えるべきなのでしょうか?
訳の分からない質問かもしれませんが,
何卒ご指導いただくようよろしくお願いします。

Aベストアンサー

ポインタと配列の違いというのは、変数と定数の違いのようなものです。

話を簡単にするために、一次元配列から考えましょう。

char *p1; と定義した時のp1は、いうまでもなくポインタで、
これは変数です。p1は任意の文字列を指すことができます。
char a1[4]; と配列の形で定義した場合のa1については、
a1[0]やa1[1]等を、通常のchar型の変数と全く同じように扱うことが
できます。しかし、a1自体は、例えば a1 = p1; のように値を代入する
ことができません。(逆の p1 = a1; は可能。)つまり、この場合のa1は、
変数ではなく、定数のようなものなのです。

複合的なケースについて見てみましょう。
char **q1; ポインタへのポインタ
 q1,*q1,**q1,q1[0],*q1[0],q1[0][0] のいずれも変数として
 扱うことができます。(値を代入することが文法的に許されます。
 ただし、実行時にはアクセス違反になる場合もあります。)
char q2[4][4]; 二次元配列
 q2,q2[0]は変数として扱うことができません。q2[0][0]のように
 して、初めて変数として扱えるようになります。
char *q3[4]; ポインタの配列
 q3は変数として扱うことができませんが、q3[0],*q3[0],q3[0][0]
 はいずれも変数として扱うことができます。
 なお、この定義は char *(q3[4]); とした場合と全く同じ意味です。
char (*q4)[4]; 配列へのポインタ
 q4,(*q4)[0],q4[0][0]はいずれも変数として扱うことができます。
 しかし、*q4,q4[0]は変数として扱うことができません。

char *name1[4]; と char name2[4][]; は確かに似ています。しかし
違うところもあります。それは、name1[0] が変数として扱えるのに
対し、name2[0] には値を代入できないという点です。(データの
具体的な構造については、inthefloiさんが書いておられる通りです。
> char name2[4][]ではポインタを4つ確保した事にはならないみたい
というのも、全くその通りで、配列の定義では、ポインタ変数の領域
を確保する余地はないのです。

ポインタと配列の違いというのは、変数と定数の違いのようなものです。

話を簡単にするために、一次元配列から考えましょう。

char *p1; と定義した時のp1は、いうまでもなくポインタで、
これは変数です。p1は任意の文字列を指すことができます。
char a1[4]; と配列の形で定義した場合のa1については、
a1[0]やa1[1]等を、通常のchar型の変数と全く同じように扱うことが
できます。しかし、a1自体は、例えば a1 = p1; のように値を代入する
ことができません。(逆の p1 = a1; は可能。)つまり...続きを読む


人気Q&Aランキング

おすすめ情報