Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
基礎情報処理演習(11)ポインタ
Search
自然言語処理研究室
November 28, 2013
Programming
0
7.5k
基礎情報処理演習(11)ポインタ
自然言語処理研究室
November 28, 2013
Tweet
Share
More Decks by 自然言語処理研究室
See All by 自然言語処理研究室
データサイエンス14_システム.pdf
jnlp
0
330
データサイエンス13_解析.pdf
jnlp
0
370
データサイエンス12_分類.pdf
jnlp
0
290
データサイエンス11_前処理.pdf
jnlp
0
400
Recurrent neural network based language model
jnlp
0
100
自然言語処理研究室 研究概要(2012年)
jnlp
0
98
自然言語処理研究室 研究概要(2013年)
jnlp
0
67
自然言語処理研究室 研究概要(2014年)
jnlp
0
62
自然言語処理研究室 研究概要(2015年)
jnlp
0
110
Other Decks in Programming
See All in Programming
document.write再考
brn
5
2.5k
TCAの Shared Stateって どういう仕組みになってんの?
yimajo
0
330
受託開発でGitLab CI を活用していく
xiombatsg
1
130
マイ隙間家具OSSたちのご紹介
karupanerura
2
160
LPIXEL×CADDi_kaerururu
kaerururu
3
300
コミュニティに参加したことで起きた変化
ohmori_yusuke
3
130
オブジェクト指向コードレビューの新しいアプローチ
akkie76
3
1.6k
TCA魔法学入門🪄
dazy
0
280
生成 AI の中身を覗いてみよう〜基礎から医療現場での応用まで〜
soh9834
2
770
Go1.22からの疑似乱数生成器について/go-122-pseudo-random-generator
convto
1
160
導入から5年が経って見えた Datadog APM 運用の課題
bgpat
2
540
Ruby製社内ツールのGo移行
bgpat
2
270
Featured
See All Featured
Git: the NoSQL Database
bkeepers
PRO
421
63k
Done Done
chrislema
178
15k
jQuery: Nuts, Bolts and Bling
dougneiner
57
7.1k
10 Git Anti Patterns You Should be Aware of
lemiorhan
644
57k
GitHub's CSS Performance
jonrohan
1023
450k
YesSQL, Process and Tooling at Scale
rocio
160
13k
Fantastic passwords and where to find them - at NoRuKo
philnash
35
2.4k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
67
38k
Debugging Ruby Performance
tmm1
68
11k
The Invisible Customer
myddelton
114
12k
The Illustrated Children's Guide to Kubernetes
chrisshort
28
46k
From Idea to $5000 a Month in 5 Months
shpigford
376
45k
Transcript
基礎情報処理演習 (11) ポインタ 山本和英 長岡技術科学大学 1
ポインタ 変数の住所を入れる変数 アドレス演算子 &x 変数 x の場所 間接演算子 *p ポインタ
p の指す変数の値 ・ アドレスとは「番地」=変数を記憶している場所のこと。 ・ ポインタとはアドレスを記憶した変数のこと。 ・ どこも指さないNULLポインタというものもある。 ・ 配列はポインタを使って書くことができる。 ・ 関数を使う時は、値を渡す方法とアドレスを渡す方法がある。 ポインタまとめ 2
int k = 3; k (int) 3 3
int k = 3; int *p; k (int) 3 p
ポインタ p を作る。 ここの int は、 ポインタが指す変数が int 型という意味。 4
int k = 3; int *p; p = &k; k
(int) 3 p ポインタ p に 編集 k の住所を代入する 5
int k = 3; int *p; p = &k; printf
(“%d”, *p); k (int) 3 p ポインタ p が指す変数(k) の値(*)、つまり3が表示される。 6
ポインタの作成 int* s; または int *s; ・ ここの int とは、 s
の指す先が int という意味で、ポインタ s が int という意味ではない。 ・ s の指す変数が double なら、 double *s; となる。 アドレスの代入 s = &t; ・ 変数t の住所(アドレス)を s に入れる。 ・ これによって、s を使って t を 操作できる。 ポインタの使い方 *s = 6; ・ ポインタ s が指す変数 t の値を 6 にする。つまり t = 6; と書くのと 同じ。よって、*s は t の別名と 考えてもよい。 7
配列名はポインタである int w[5]; w は w[0]を指す ポインタである。 配列はポインタ風にも書ける w[2] =
3; *(w+2) = 3; と書いても同じ 関数に配列を渡す goto_sub(&w[0]); goto_sub(w); と書いても同じ。 goto_sub(&w); ではないことに注意! 8
ポインタはいつ使うのか? いろいろありますが、授業では二つ紹介します。 1. 関数に配列を渡したい時 ポインタ一つで配列を渡せるので楽 2. 関数から二つ以上の値を受け取りたい時 受け取りたい変数のポインタを関数に渡せば 関数内でいじれるので便利 9
void function (int n1, int n2, int sum, int diff){
sum = n1 + n2; diff = n1 - n2; } void main(void){ ... a = 10; b = 5; function(a, b, wa, sa); } 動かないプログラム 10 sum と diff は 正しく計算できるが wa と sa には 反映されない
void function (int n1, int n2, int *sum, int *diff){
*sum = n1 + n2; *diff = n1 - n2; } void main(void){ ... a = 10; b = 5; function(a, b, &wa, &sa); } 改良版 11 Wa と sa のアドレスを 関数に渡すことで 変数の値が変更される
void set_number(int *vc, int no, int val){ int i; for
(i = 0; i< no; i++){ *(vc+i) = val; } } main(){ int ary[5]; set_number(ary, 5, 0); } 配列 ary のポインタと 二つの数字を渡す 関数に配列のポインタを渡す例 配列の初期化をする関数 vc[0]~vc[no-1]に val を代入 12 set_number(&ary[0], 5, 0); と書いてもよい vc[i] = val; と書いてもよい
おまけ: そう言えば... scanf_s (“%d”, &k); scanf_s で値を入力する際、&kのように変数名の 前に&をつけていたのは、 scanf_s 関数にkのアドレスを渡していたから
です。こうしないとscanf_s関数の中で変数kの値を 操作(scanf_sの場合は数値を代入)できないため、 k ではなく&kとする必要がありました。 13