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

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

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

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

3回答

2643閲覧

構造体のポインタがわからない

JhonDoe

総合スコア36

C

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

0クリップ

投稿2015/10/17 07:01

c

1#include <stdio.h> 2#include<stdlib.h> 3struct name { 4 int a; 5 float b; 6 char c[30]; 7}; 8int main(){ 9 struct name *ptr; 10 int i,n; 11 printf("Enter n: "); 12 scanf("%d",&n); 13 ptr=(struct name*)malloc(n*sizeof(struct name)); 14/* Above statement allocates the memory for n structures with pointer ptr pointing to base address */ 15 for(i=0;i<n;++i){ 16 printf("Enter string, integer and floating number respectively:\n"); 17 scanf("%s%d%f",&(ptr+i)->c,&(ptr+i)->a,&(ptr+i)->b); 18 } 19 printf("Displaying Infromation:\n"); 20 for(i=0;i<n;++i) 21 printf("%s\t%d\t%.2f\n",(ptr+i)->c,(ptr+i)->a,(ptr+i)->b); 22 return 0; 23}

ptr=(struct name*)malloc(nsizeof(struct name));
sizeof以外、すべてわかりません・・・何をしているんですか?
name
後ろにある「*」って、ポインタですか?
あと、(n*sizeof(struct name)って掛け算ですか?

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

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

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

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

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

guest

回答3

0

ベストアンサー

printf("Enter n: ");
scanf("%d",&n);

で、画面から「n」の値を入力して、その後、

ptr = (struct name*)malloc(n * sizeof(struct name));

の処理をしていますね。

まず、malloc()はメモリ領域を動的に確保する関数で、
引数に確保したいメモリのサイズを指定し、
実行するとそのエリアの先頭アドレスが返ってきます。

上記では、「構造体 name の n 個分」を指定していますね。
※ n は画面から入力した値

それを、「構造体 name のポインタ」型にキャストして変数 ptr に代入しています。

なぜわざわざポインタをキャストしているかというと、

ptr で構造体 name の1つ目の要素(ptr[0])
ptr + 1 で構造体 name の2つ目の要素(ptr[1])
ptr + 2 で構造体 name の3つ目の要素(ptr[2])
...

とアクセスできるからです。
実際、その下のfor文では ptr+i でアクセスしていますね。

ご質問の回答は、

ptr=(struct name*)malloc(n*sizeof(struct name));
sizeof以外、すべてわかりません・・・何をしているんですか?

上記のとおりです。

name* 後ろにある「*」って、ポインタですか?

YES

あと、(n*sizeof(struct name)って掛け算ですか?

YES

ご質問とは関係ないですが、
malloc()で確保したメモリはfree()で解放したほうがいいですよ。(^^;

投稿2015/10/17 07:57

編集2015/10/17 08:00
haraken

総合スコア70

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

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

0

malloc()はプログラム実行中に動的に指定したサイズ分の領域を確保します(引数は確保するサイズになります)。順に説明しましょう

name* 後ろにある「*」って、ポインタですか?

そうですねポインタになります。mallocは確保した領域の先頭アドレスを戻り値として返します。型は汎用型である(void *)型。ポインタ変数ptrの型がstruct name型のポインタ変数であるため、この型にキャストしています。

あと、(n*sizeof(struct name)って掛け算ですか?

これは掛け算です。struct name型のサイズをn個分確保しています(nは直前のscanfで入力された値になりますね)。つまりここでは、入力された値の個数分、struct name型の領域を確保していることになります。

投稿2015/10/17 07:13

archiver

総合スコア1557

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

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

0

ptr=(struct name*)malloc(n*sizeof(struct name));
sizeof以外、すべてわかりません・・・何をしているんですか?

struct name ptr[n];
をこの場で作成していると考えると良いかもしれません。
普通に配列を宣言する場合、配列の個数を分かっている必要がありますが、
ここでは事前に分かっていなくても配列を用意できています。

name* 後ろにある「*」って、ポインタですか?

ポインタの*です。

あと、(n*sizeof(struct name)って掛け算ですか?

こっちはかけ算です。struct name型の変数をn個用意しています。

投稿2015/10/17 07:11

MIURA_Yasuyuki

総合スコア306

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問