C言語なのですが、
例えば、次のように実験してみました。
char * rec_fld[12];
int x,y;
char tt[11];
※rec_fld[1]には”私は完全な素人”
という文字が入っていると思ってください。
x = sizeof( rec_fld[1] );
strcpy( tt, rec_fld[1] );
y = sizeof( tt );
すると、xは4とかいう数字が格納されていて、
yには11という数字が格納されていました。
ttが11なのは分かりやすいのですが、
なんで、xは、文字数の14とかにならないのでしょうか?
sizeofの中の書き方が違うのでしょうか?
あと、char *で配列宣言するのと、charで宣言するのとは
何が違うのでしょうか?
どなたか、教えて下さいませ。
No.2ベストアンサー
- 回答日時:
sizeof は「文字数」なんて高尚なものを理解しません.
rec_fld[1] の型は char *. だから sizeof(rec_fld[1]) の値は sizeof(char *) と同じで (あなたの環境の場合) 4.
一方 tt の型は char[11] だから sizeof(tt) の値は sizeof(char[11]) と同じで 11.
taco様の大変少ない言葉の中に私の必要なすべてが入っていました!!
なるほどーそーなのか、サイズなんですね;D
ありがとうございました!
No.3
- 回答日時:
>char * rec_fld[12];
これは「どっかの文字列を指している、アドレスが12個並んでいる配列」です。
>※rec_fld[1]には”私は完全な素人”
>という文字が入っていると思ってください。
rec_fld[1]には、上記のような文字は入れられません。
”私は完全な素人”という文字列が「どこか」にあって、rec_fld[1]には「その『どこか』を指すアドレス」が入っています。
>x = sizeof( rec_fld[1] );
「その『どこか』を指すアドレス」が何バイトなのかをxに入れるから、xは「アドレスを表現するのに必要なバイト数」になります。
32ビットCPUで、アドレス空間が32ビットなら、アドレスは4バイトで表わせるので「sizeof(どっかのアドレス)」は4です。
rec_fld[1]は「char *」です。なので「sizeof(rec_fld[1])」は「sizeof(char *)」と同じ値になります。
>あと、char *で配列宣言するのと、charで宣言するのとは何が違うのでしょうか?
char c;
char *p;
の違いは判ってますか?
「c」は「文字」を1文字だけ入れられます。「p」は「どっかにある文字のアドレス」を入れられます。
上記の違いが判ってるなら
char ac[10];
char *ap[10];
の違いも判りますね?
これは「上記のc、pが10個セットで並んでるだけ」です。
つまり「acは文字が10個」「apはアドレスが10個」です。
chie様、分かりやすくご説明ありがとうございます!
一昨日、この問題で4、5時間も時間を消費してしまいました…
char ac[10];と、char *ap[10];の違い分かりました!!
ありがとうございます!
No.1
- 回答日時:
「*」を付けるのはポインタ宣言と呼ばれるものです。
「*」を付ける事によって、アドレス(パソコンの番地)を格納するものとして宣言されています。ポインタはC言語の難関なので理解が難しいかと思います。変に覚えられても困るので、参考に分かりやすそうなサイトを…
http://www9.plala.or.jp/sgwr-t/c/sec10.html
ここで、注目したいのはrec_fld[12]がポインタとして宣言されている事です。
つまりrec_fldはパソコンのアドレスを格納するための変数になっているわけです。普通パソコンのアドレスを格納するためには32bit=4バイト必要です。(64bitパソコンなら8バイト)
sizeof(rec_fld[1])というのはアドレスを格納するための変数1個分のサイズという意味になるので=4バイトとなります。
moonさん、勝手に短縮形で呼ばせていただきますが、
ありがとうございます!
参考のURL驚くほど分かりやすかったです。
加えて、本日、ポインタの参考書買って来ました;D
勉強します…
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語 int temp = 0; if(isdigit(arr[i])){ temp=arr[i] 2 2022/03/27 01:44
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列内の数字削除
-
SetWindowTextについて。
-
構造体が戻り値の関数について...
-
WM_CHAR or WM_KEYDOWN の「wPa...
-
C言語のintとcharの違いってな...
-
C言語にて構造体のメンバがNULL...
-
new charとnew char[N]の違いは?
-
文字列str内の全ての数字を...
-
C言語において、以下の条件で...
-
strcat関数を自作したいです
-
ポインタを使用 [数字列を数値...
-
DWORDとcharの変換
-
文字列の途中から途中までを抽出
-
C言語で文字列をかえす正しい書...
-
文字の代入とコピーについて
-
小数点入りの文字列をfloat型に...
-
callocについて
-
'\\0'とはなんですか?
-
p = (char **)*p の意味
-
C言語を用いた環境変数の作成/...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
小数点入りの文字列をfloat型に...
-
C言語のプログラムについてです
-
strcat関数を自作したいです
-
fstream型オブジェクトを関数の...
-
new charとnew char[N]の違いは?
-
DWORDとcharの変換
-
文字列の途中から途中までを抽出
-
char 文字列型 の表現範囲が-12...
-
const char* s1とただのchar s1...
-
wsprintf( ポインタ , "%d" , "...
-
c言語でポインタ変数を用いた配...
-
char型にint型の数値を代入する。
-
C言語で文字列をかえす正しい書...
-
C++17で、unsigned char * 配列...
-
共用体について
-
エクセルのMID関数は、C言語では?
おすすめ情報