C言語講座 第4回 ポインタ.

Slides:



Advertisements
Similar presentations
第 2 章 数値の入力と変数 scanf と変数をやります 第 2 章 数値の入力と変数 1. 以下のプログラムを実行してみよう  C 言語では文の最後に「 ; 」(セミコロン)が付きます 第 2 章 数値の入力と変数 2 #include int main() { int x; x = 3; printf("x.
Advertisements

第6章 ポインタ ポインタが分からずにC言語を投げ出す人が数多くいます。 その半面、使いこなせば強力な武器となります。 しっかりと学習していきましょう C 言語 最難関文法 C 言語 最難関文法 1 第 6 章 ポインタ.
C 言語講座 第 7 回 ポインター. メモリとアドレス(ポインターの前 に) コンピュータのメモリには 1 バイトずつ 0 番地、 1 番地、 2 番地・・・というように 住所が割り当てられている この住所をアドレスという。 メモリはデータをしまうもので それを引き出すためには メモリに番号(アドレス)を振っておけばよいな.
ISD実習E 2009年6月29日 LISPシステム入門 (第5回) 関数ポインタ eval システム関数.
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
計算技術研究会 C言語講座 第3回 Loops (for文 while文).
第2章 数値の入力と変数 scanfと変数をやります.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
第5回C言語講座 ~ポインタと配列.
第6章 2重ループ&配列 2重ループと配列をやります.
構造体.
配列の扱い、探索 有効範囲と記憶域期間 第12回 [7月10日、H.15(‘03)] 今日のメニュー 1 前回の課題の復習
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
精密工学科プログラミング基礎Ⅱ 第3回資料 今回の授業で習得してほしいこと: 2次元配列の使い方 (前回の1次元配列の復習もします.)
構造体 構造体, 構造体とポインタの組み合わせ,.
C言語講座 第3回 ポインタ、配列.
プログラミング2 関数
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
Cプログラミング演習 第7回 メモリ内でのデータの配置.
プログラミング序論 2. n人のインディアン.
第10章 これはかなり大変な事項!! ~ポインタ~
プログラミング入門2 第8回 ポインタ 情報工学科 篠埜 功.
メモリの準備 メモリには、その準備の方法で2種類ある。 静的変数: コンパイル時にすでにメモリのサイズがわかっているもの。 普通の変数宣言
第7回 プログラミングⅡ 第7回
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
高度プログラミング演習 (08).
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
09: ポインタ・文字列 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
プログラミング基礎B 文字列の扱い.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
メモリとメモリアドレス, ポインタ変数,関数へのポインタ渡し
プログラミング序論演習.
プログラミング入門2 第9回 ポインタ 情報工学科 篠埜 功.
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
知能情報工学演習I 第11回( C言語第5回) 課題の回答
高度プログラミング演習 (09).
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
第13回 ポインタ 1 1.
プログラミング入門 電卓を作ろう・パートI!!.
09: ポインタ・文字列 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページを開いておく こと
地域情報学 C言語プログラミング 第4回 while文、do~while文、switch文、 2次元配列、ポインタ 2017年11月10日
第2章 printf(“変数と入力”); scanf(“%d”,&num);
ループだよ!難しいよ! 第5章 while(ループ);.
標準入出力、変数、演算子、エスケープシーケンス
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
第7章 そろそろ int 以外も使ってみよう! ~データ型 double , bool~
高度プログラミング演習 (07).
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
プログラミング1 プログラミング演習I 第2回.
プログラミング入門2 第5回 配列 変数宣言、初期化について
第2章 数値の入力と変数 scanfと変数をやります.
知能情報工学演習I 第11回(後半第5回) 課題の回答
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
C言語講座 四則演算  if ,  switch 制御文.
分岐(If-Else, Else if, Switch) ループ(While, For, Do-while)
知能情報工学演習I 第10回( C言語第4回) 課題の回答
プログラミング演習I 補講用課題
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
第1章 文字の表示と計算 printfと演算子をやります 第1章 文字の表示と計算.
プログラミング 3 ポインタ(1).
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
Presentation transcript:

C言語講座 第4回 ポインタ

変数のメモリ上のアドレスを格納するもの。 ポインタとは 変数のメモリ上のアドレスを格納するもの。 アドレスって? 【名詞】address : 住所, あて名, 所番地 メモリ上の場所のこと。

ポインタの使い方・書き方 #include <stdio.h> int main(){ } int a=3; int* pa; pa=&a; printf("aの値は %d \n",a); printf("aのアドレス(pa)は %d \n\n",pa); return 0; }

ポインタの使い方・書き方 int* ポインタ変数名 int型のポインタ変数の宣 言 &変数名 変数のアドレスを表す int型の変数aのアドレスをポインタ変数へ int* pa; ←int型のポインタ変数paを作成 pa = &a; ←paにaのアドレスを入れる int* ポインタ変数名 int型のポインタ変数の宣 言 &変数名 変数のアドレスを表す & : アドレス演算子

scanfについて 今まで使ってきたscanf関数でも・・・ とりあえずつけてきたこの&はaのアドレスを渡していた int a; scanf(“%d” ,&a ); とりあえずつけてきたこの&はaのアドレスを渡していた scanf関数は “アドレスが示す場所” を入力された値に 書き換える

*の使い方 printf("paが指しているものの中身は %d \n",*pa); さっき書いたプログラムに を付け足してください ここで出てくる *pa はpaの指す場所の中身を見ています ここでは中身は3でした

*の使い方 ・・・ a pa メモリ ↓aのアドレスを持っている paの中に入っている アドレス先(a)を見る printf("paが指しているものの中身は %d \n",*pa); ・・・ a pa

*の使い方 次に *pa = 7; printf("paが指しているものの中身は %d \n\n“, a); を追加すると

*の使い方 つまり、 *ポインタ変数 ポインタ変数の先の中身を表す ポインタ変数を使うことで間接的に値を変えることができ る! *ポインタ変数 ポインタ変数の先の中身を表す ポインタ変数を使うことで間接的に値を変えることができ る! この機能はC言語においてとても重要なのでマスターし ておきましょう 1年後期のC++でも出てきます

なぜポインタを使うのか aの値を変えたいのであれば直接変えればいいので は?と思うかもしれません 確かに今までのような使い方では直接書き換えれば事 足りてしまいます 必要になる時というのは関数へ“アドレス渡し”する時で す

ポインタと関数 //日付を変えるプログラム set_day(month, date); #include <stdio.h> return 0; void set_day(int m, int d); } int main(){ void set_day(int m, int d){ int month=1; printf("日付をセットします\n"); int date=1; m=5; d=27; printf("%d月%d日\n",month,date);

ポインタと関数 結果 変わらず・・・ なぜか  関数には変数の中身しか渡っていないから  (ここでは1という数字のみ) ではどうするか

ポインタと関数 //日付を変えるプログラムそのに set_day(&month, &date); //赤字のところが変化した場所 #include <stdio.h> return 0; void set_day(int* m, int* d); } int main(){ void set_day(int* m, int* d){ int month=1; printf("日付をセットします\n"); int date=1; *m=5; *d=27; printf("%d月%d日\n",month,date);

ポインタと関数 結果 変わった! 今度は関数の引数をアドレスに変えたので関数内で変 更することができた

ポインタと関数 void set_day(int* m, int* d) set_day(&month, &date); ↑関数の宣言部 引数がポインタ変数になっている つまり、アドレスを受け取る set_day(&month, &date); ↑main文内の関数呼び出し文 &変数名 で変数のアドレスを表している つまり、変数のアドレスを送っている

ポインタまとめ int* ポインタ変数名 int型のポインタ変数の宣言 &変数名 変数のアドレスを表す &変数名 変数のアドレスを表す *ポインタ変数名 ポインタ変数の先の中身を表す 直接いじることのできないところ(関数とか)では、ポ インタを使うことで扱うことができる ポインタを使うことでより動作の軽いプログラムを作るこ とができる

演習問題1 int型変数 a, bをscanf関数を用いて入力し、自 作関数swap()を作成して値a、bを交換して表 示せよ。

演習問題1 解答例 #include<stdio.h> void swap(int *x,int *y){ int tmp; 演習問題1 解答例 #include<stdio.h> void swap(int *x,int *y){ int tmp; printf(“入れ替えま す!”); tmp=*x; *x=*y; *y=tmp; } int main(void){ int a,b; printf(“a=”); scanf_s(“%d”,&a); printf(“b=”); scanf_s(“%d”,&b); printf(“a=%d,b=%d\n”,a,b); swap(&a,&b); return 0; }

演習問題1 実行結果

演習問題2 1から任意の数までを出力し、3の倍数ならFizz, 5の倍数 ならBuzzと出力するようなプログラムを書け for文とwhile文の両方でかけるとなお良い ポインタは今回関係無いです

演習問題2 解答例(for文 ver ) #include <stdio.h> printf("%d",i); if(0==i%3) int main(){ printf("Fizz"); int i,n; if(0==i%5) printf("Buzz"); printf("整数を入力してくだ さい>"); printf("\n"); } scanf("%d",&n); return 0; for(i=1;i<=n;i++){ if(0!=i%3 && 0!=i%5)

演習問題2 解答例(while文 ver ) #include <stdio.h> printf("%d",i); if(0==i%3) int main(){ printf("Fizz"); int n,i=1; if(0==i%5) printf("Buzz"); printf("整数を入力してくだ さい>"); printf("\n"); i++; scanf("%d",&n); } return 0; while(0<i && i<=n){ if(0!=i%3 && 0!=i%5)

演習問題2 実行結果

お疲れ様でした~