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

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

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

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

ポインタ

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

Q&A

解決済

1回答

1482閲覧

C言語のポインタについて

youhey1234

総合スコア14

C

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

ポインタ

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

0グッド

1クリップ

投稿2015/01/05 16:16

私は現在専門学生として学校に通っているのですが、
その学校で、

ポインタを使用した関数の用例を複数作成せよ。

なお用例は具体的な目的があり、かつ実行結果の吟味を含む解説を添えること。

と言う課題を頂きました。

はっきり言って何がなんだかよくわかりません。
まず、ポインタを使用した具体的な用例が何を指すのかわかりません。
(ただ単に入力した文字の入れ替えをするだけの関数は具体的ではないような。。。)
その次に個人的に疑問なのがポインタを使用する場面です。
どこでポインタを使用して、なんでポインタを使用すると便利、楽ができるのか。

初歩的な質問だとは思いますが、
皆様の知恵をお貸しください。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ポインタというのは、メモリ上に確保された領域を指しているアドレスを格納する変数です。
よって、ポインタの中身には変数の実体が入っているのではなく、変数の実体があるメモリ上の場所が入っていることになります。
そして、関数の引数にポインタを指定すると何ができるのかというと、関数の外にある変数の中身を書き換えることができるようになります。

この【関数の外にある変数の中身を書き換えることができるようになる】というのは、非常に便利な仕様です。

例えば、とある変数の中身の値を2倍の数値に書き換える関数を作りたいとします。
ポインタを使わず以下のように書いても、Double( )関数の中でしか変数valは生存できないので実際に表示される値は変わらず1のままです。

lang

1#include <stdio.h> 2 3void Double( int val ) 4{ 5 val *= 2; 6 7 printf( "val : %d\n", val ); 8} 9 10int main( ) 11{ 12 int a = 1; 13 14 printf( "a : %d\n", a ); 15 16 Double( a ); 17 18 printf( "a : %d\n", a ); 19 20 return 0; 21}

■実行結果
a : 1
val : 2
a : 1

しかし、ポインタを使って以下のように書くと表示される値は2になります。

lang

1#include <stdio.h> 2 3void Double( int* val ) 4{ 5 *val *= 2; 6 7 printf( "val : %d\n", val ); 8} 9 10int main( ) 11{ 12 int a = 1; 13 14 printf( "a : %d\n", a ); 15 16 Double( &a ); 17 18 printf( "a : %d\n", a ); 19 20 return 0; 21}

■実行結果
a : 1
val : 2
a : 2

また、ポインタはほかにも特性(※)を持っていて、配列を渡すことも可能です。
(※)正確には同じ特性なのですが、わかりやすいかなと思ったので別の特性として扱っています。

lang

1#include<stdio.h> 2 3void SetVal( int* Array ) 4{ 5 Array[ 0 ] = 1; 6 Array[ 1 ] = 2; 7 Array[ 2 ] = 3; 8} 9 10int main( ) 11{ 12 int Array[ 3 ] = { 0 }; 13 14 printf( "Array[ 0 ] : %d\n", Array[ 0 ] ); 15 printf( "Array[ 1 ] : %d\n", Array[ 1 ] ); 16 printf( "Array[ 2 ] : %d\n\n", Array[ 2 ] ); 17 18 SetVal( Array ); 19 20 printf( "Array[ 0 ] : %d\n", Array[ 0 ] ); 21 printf( "Array[ 1 ] : %d\n", Array[ 1 ] ); 22 printf( "Array[ 2 ] : %d\n\n", Array[ 2 ] ); 23 24 return 0; 25}

■実行結果
Array[ 0 ] : 0
Array[ 1 ] : 0
Array[ 2 ] : 0

Array[ 0 ] : 1
Array[ 1 ] : 2
Array[ 2 ] : 3

プログラムが大きくなっていくにつれて、自然とプログラムの中身を細かく分けていくことになると思います。
いくつかの変数をまとめて扱うようにしたり、とある関数の中のとある処理がほかの関数でも使いたくなった時に新しい関数として使うようになった時。
そんな時、ポインタはとても役に立ちます!
長文失礼しました。
勉強頑張ってください!

投稿2015/01/05 18:46

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

youhey1234

2015/01/06 05:57

大変わかりやすかったです!!! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問