Docs/ポインタの話
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*ポインタの話 [#uac73578]
#contents
**はじめに [#f1d1bee8]
***これは何? [#jb29ad08]
C言語ではポインタの話を避けて通れません.
ちうわけでちょこっと説明してみました.
すべての文責は[[高橋>takataka]]にあります.
計算機アーキテクチャ的にはええかげんな説明になってますの...
2022-06-06 追記: ''表示の仕組みのせいで一部のコードのイン...
***更新履歴 [#g8d43502]
-2004-05-05 HTML版作成
-2009-06-04 wiki化
**関数を使うときにポインタが必要になるのはなんで? [#n30b...
いきなりですが,以下の二つのプログラムの実行結果の違いと...
違いがわかる人は,「printf()には&はいらんのにscanf()には...
***プログラム例その一 [#func1]
[[このプログラムのふるまいをみる>Docs/ポインタの話/func1]]
#pre{{
1 void hoge(int x, int y);
2
3 int main()
4 {
5 int a, b;
6
7 a = 7; b = 3;
8 hoge(a, b);
9 printf("%d %d\n", a, b);
10 }
11
12 void hoge(int x, int y)
13 {
14 y = x + y;
15 printf("%d %d\n", x, y);
16 }
}}
***プログラム例その二 [#func2]
[[このプログラムのふるまいをみる>Docs/ポインタの話/func2]]
#pre{{
1 void hoge(int x, int *y);
2
3 int main()
4 {
5 int a, b;
6
7 a = 7; b = 3;
8 hoge(a, &b);
9 printf("%d %d\n", a, b);
10 }
11
12 void hoge(int x, int *y)
13 {
14 *y = x + *y;
15 printf("%d %d\n", x, *y);
16 }
}}
**なんで配列の受け渡しんときはポインタ使わん(ように見え...
関数への値の受け渡しでのポインタの使い方がわかってくると...
配列を使った例として以下のソースを考えましょう.
● プログラム例 fuga1.c
#pre{{
1 void fuga(int x[], int n);
2
3 int main()
4 {
5 int a[10];
6 int n = 3, i;
7
8 for(i = 0; i < n; i++){
9 a[i] = 2*i + 1;
10 printf("%d %d\n", i, a[i]);
11 }
12 printf("-----\n");
13
14 fuga(a, n);
15
16 for(i = 0; i < n; i++){
17 printf("%d %d\n", i, a[i]);
18 }
19 }
20
21 void fuga(int x[], int n)
22 {
23 int i;
24
25 for(i = 0; i < n; i++) x[i] *= 3;
26 }
}}
このプログラムを実行すると,以下のような結果が得られます.
#pre{{
0 1
1 3
2 5
-----
0 3
1 9
2 15
}}
関数fuga()によって配列aの中身が変更されていることがわかり...
実は,
-配列のデータはメモリ中で番地が連続する場所に置かれる
-配列というのは人間がわかりやすいように用意された書き方で...
-配列として宣言された変数の名前の部分は,その配列の先頭要...
例えば int hoge[10]と宣言された配列変数では,hoge は hoge...
ということがみそになっています.
以下のソースを例にしてこれを説明してみます.これは上記の...
● プログラム例 fuga2.c
#pre{{
1 void fuga(int x[], int n);
2
3 main()
4 {
5 int a[8];
6 int n = 3, i;
7
8 for(i = 0; i < n; i++){
--> 9 *(a + i) = 2*i + 1;
--> 10 printf("%d %d\n", i, *(a + i));
11 }
12 printf("-----\n");
13
14 fuga(a, n);
15
16 for(i = 0; i < n; i++){
17 printf("%d %d\n", i, a[i]);
18 }
19 }
20
21 void fuga(int x[], int n)
22 {
23 int i;
24
25 for(i = 0; i < n; i++) x[i] *= 3;
26 }
}}
この例の5,9,10行目を説明すると,
+5行目の配列の宣言で,メモリ中にint型のデータ八つ分の場所...
+a が配列の先頭番地(この場合 0x1000)を表すので,a + i ...
+したがって *(a + i) は a + i 番地の中身,すなわち「配列...
ということになっています(注:二項演算子 + よりポインタの...
C言語のコンパイラは,a[i] というソースを見たら *(a + i) ...
以上のことから,配列データを普通に関数と受け渡しすると関...
● プログラム例 fuga3.c
#pre{{
1 void fuga(int x[], int n);
2
3 main()
4 {
5 int a[10];
6 int n = 3, i;
7
8 for(i = 0; i < n; i++){
9 *(a + i) = 2*i + 1;
10 printf("%d %d\n", i, *(a + i));
11 }
12 printf("-----\n");
13
14 fuga(a, n);
15
16 for(i = 0; i < n; i++){
17 printf("%d %d\n", i, a[i]);
18 }
19 }
20
--> 21 void fuga(int *x, int n)
22 {
23 int i;
24
--> 25 for(i = 0; i < n; i++) *(x + i) *= 3;
--> 26 //for(i = 0; i < n; i++) x[i] *= 3;
27 }
}}
1. 関数の宣言(1行目と21行目)で int x[] と書いても in...
2. 25行目と26行目も同じこと
**演習問題 [#j61442a1]
工事中.[[HTML版>https://www-tlab.math.ryukoku.ac.jp/~tak...
***Q1 初心者 [#z4097e0e]
以下の表を埋めましょう.
,,宣言の仕方,変数値(注),アドレスの参照
,int型の普通の変数 x, int x;, x,
,int型変数へのポインタ変数 y,,,
注: ポインタ変数の場合には,「ポインタ変数の指す先の変数...
***Q2 初級 [#oeda8528]
+以下のその一とその二について,周りの適当な人をつかまえて...
--[[その一>https://www-tlab.math.ryukoku.ac.jp/~takataka/...
--[[その二>https://www-tlab.math.ryukoku.ac.jp/~takataka/...
+printf() では普通 & はつけないのに scanf() ではつける理...
#pre{{
int x;
scanf("%d", &x);
printf("%d", x);
}}
***Q3 中級 [#mb344e61]
● 関数とポインタ篇
+以下のプログラムの「ほげほげ」の部分はどう書けばよいか
+完成したプログラムを実行したときの結果
を答えなさい.
#pre{{
#include <stdio.h>
void Hoge(int x, int *y)
{
ほげほげ: 「xの値」と「yが指す変数値」をかけたものを...
}
int main()
{
int a, b;
for(a = 0; a < 10; a++){
b = a + 1;
ほげほげ: 関数Hoge()を呼び出す.引数は,aとbのアドレ...
printf("%d %d\n", a, b);
}
return 0;
}
}}
● 配列とポインタ篇
以下のプログラムを実行したときの結果を答えなさい.
#pre{{
#include <stdio.h>
int main()
{
int x[10], *p, *q, i;
for(i = 0; i < 10; i++) x[i] = i;
p = x; q = &x[1];
for(i = 0; i < 5; i++){
printf("%d %d %d\n", i, *p, *(q + 2 * i));
p = p + 2;
}
return 0;
}
}}
***Q4 まにあ [#cf22b452]
以下のプログラムを実行したときの結果を答えなさい.
#pre{{
#include <stdio.h>
void Print3(int *a)
{
printf("%d %d %d\n", *a, *(a + 1), *a + 5);
}
int main()
{
int x[10], *p, i;
for(i = 0; i < 10; i++) x[i] = i;
p = &x[6];
Print3(x);
Print3(&x[5]);
Print3(++p);
return 0;
}
}}
終了行:
*ポインタの話 [#uac73578]
#contents
**はじめに [#f1d1bee8]
***これは何? [#jb29ad08]
C言語ではポインタの話を避けて通れません.
ちうわけでちょこっと説明してみました.
すべての文責は[[高橋>takataka]]にあります.
計算機アーキテクチャ的にはええかげんな説明になってますの...
2022-06-06 追記: ''表示の仕組みのせいで一部のコードのイン...
***更新履歴 [#g8d43502]
-2004-05-05 HTML版作成
-2009-06-04 wiki化
**関数を使うときにポインタが必要になるのはなんで? [#n30b...
いきなりですが,以下の二つのプログラムの実行結果の違いと...
違いがわかる人は,「printf()には&はいらんのにscanf()には...
***プログラム例その一 [#func1]
[[このプログラムのふるまいをみる>Docs/ポインタの話/func1]]
#pre{{
1 void hoge(int x, int y);
2
3 int main()
4 {
5 int a, b;
6
7 a = 7; b = 3;
8 hoge(a, b);
9 printf("%d %d\n", a, b);
10 }
11
12 void hoge(int x, int y)
13 {
14 y = x + y;
15 printf("%d %d\n", x, y);
16 }
}}
***プログラム例その二 [#func2]
[[このプログラムのふるまいをみる>Docs/ポインタの話/func2]]
#pre{{
1 void hoge(int x, int *y);
2
3 int main()
4 {
5 int a, b;
6
7 a = 7; b = 3;
8 hoge(a, &b);
9 printf("%d %d\n", a, b);
10 }
11
12 void hoge(int x, int *y)
13 {
14 *y = x + *y;
15 printf("%d %d\n", x, *y);
16 }
}}
**なんで配列の受け渡しんときはポインタ使わん(ように見え...
関数への値の受け渡しでのポインタの使い方がわかってくると...
配列を使った例として以下のソースを考えましょう.
● プログラム例 fuga1.c
#pre{{
1 void fuga(int x[], int n);
2
3 int main()
4 {
5 int a[10];
6 int n = 3, i;
7
8 for(i = 0; i < n; i++){
9 a[i] = 2*i + 1;
10 printf("%d %d\n", i, a[i]);
11 }
12 printf("-----\n");
13
14 fuga(a, n);
15
16 for(i = 0; i < n; i++){
17 printf("%d %d\n", i, a[i]);
18 }
19 }
20
21 void fuga(int x[], int n)
22 {
23 int i;
24
25 for(i = 0; i < n; i++) x[i] *= 3;
26 }
}}
このプログラムを実行すると,以下のような結果が得られます.
#pre{{
0 1
1 3
2 5
-----
0 3
1 9
2 15
}}
関数fuga()によって配列aの中身が変更されていることがわかり...
実は,
-配列のデータはメモリ中で番地が連続する場所に置かれる
-配列というのは人間がわかりやすいように用意された書き方で...
-配列として宣言された変数の名前の部分は,その配列の先頭要...
例えば int hoge[10]と宣言された配列変数では,hoge は hoge...
ということがみそになっています.
以下のソースを例にしてこれを説明してみます.これは上記の...
● プログラム例 fuga2.c
#pre{{
1 void fuga(int x[], int n);
2
3 main()
4 {
5 int a[8];
6 int n = 3, i;
7
8 for(i = 0; i < n; i++){
--> 9 *(a + i) = 2*i + 1;
--> 10 printf("%d %d\n", i, *(a + i));
11 }
12 printf("-----\n");
13
14 fuga(a, n);
15
16 for(i = 0; i < n; i++){
17 printf("%d %d\n", i, a[i]);
18 }
19 }
20
21 void fuga(int x[], int n)
22 {
23 int i;
24
25 for(i = 0; i < n; i++) x[i] *= 3;
26 }
}}
この例の5,9,10行目を説明すると,
+5行目の配列の宣言で,メモリ中にint型のデータ八つ分の場所...
+a が配列の先頭番地(この場合 0x1000)を表すので,a + i ...
+したがって *(a + i) は a + i 番地の中身,すなわち「配列...
ということになっています(注:二項演算子 + よりポインタの...
C言語のコンパイラは,a[i] というソースを見たら *(a + i) ...
以上のことから,配列データを普通に関数と受け渡しすると関...
● プログラム例 fuga3.c
#pre{{
1 void fuga(int x[], int n);
2
3 main()
4 {
5 int a[10];
6 int n = 3, i;
7
8 for(i = 0; i < n; i++){
9 *(a + i) = 2*i + 1;
10 printf("%d %d\n", i, *(a + i));
11 }
12 printf("-----\n");
13
14 fuga(a, n);
15
16 for(i = 0; i < n; i++){
17 printf("%d %d\n", i, a[i]);
18 }
19 }
20
--> 21 void fuga(int *x, int n)
22 {
23 int i;
24
--> 25 for(i = 0; i < n; i++) *(x + i) *= 3;
--> 26 //for(i = 0; i < n; i++) x[i] *= 3;
27 }
}}
1. 関数の宣言(1行目と21行目)で int x[] と書いても in...
2. 25行目と26行目も同じこと
**演習問題 [#j61442a1]
工事中.[[HTML版>https://www-tlab.math.ryukoku.ac.jp/~tak...
***Q1 初心者 [#z4097e0e]
以下の表を埋めましょう.
,,宣言の仕方,変数値(注),アドレスの参照
,int型の普通の変数 x, int x;, x,
,int型変数へのポインタ変数 y,,,
注: ポインタ変数の場合には,「ポインタ変数の指す先の変数...
***Q2 初級 [#oeda8528]
+以下のその一とその二について,周りの適当な人をつかまえて...
--[[その一>https://www-tlab.math.ryukoku.ac.jp/~takataka/...
--[[その二>https://www-tlab.math.ryukoku.ac.jp/~takataka/...
+printf() では普通 & はつけないのに scanf() ではつける理...
#pre{{
int x;
scanf("%d", &x);
printf("%d", x);
}}
***Q3 中級 [#mb344e61]
● 関数とポインタ篇
+以下のプログラムの「ほげほげ」の部分はどう書けばよいか
+完成したプログラムを実行したときの結果
を答えなさい.
#pre{{
#include <stdio.h>
void Hoge(int x, int *y)
{
ほげほげ: 「xの値」と「yが指す変数値」をかけたものを...
}
int main()
{
int a, b;
for(a = 0; a < 10; a++){
b = a + 1;
ほげほげ: 関数Hoge()を呼び出す.引数は,aとbのアドレ...
printf("%d %d\n", a, b);
}
return 0;
}
}}
● 配列とポインタ篇
以下のプログラムを実行したときの結果を答えなさい.
#pre{{
#include <stdio.h>
int main()
{
int x[10], *p, *q, i;
for(i = 0; i < 10; i++) x[i] = i;
p = x; q = &x[1];
for(i = 0; i < 5; i++){
printf("%d %d %d\n", i, *p, *(q + 2 * i));
p = p + 2;
}
return 0;
}
}}
***Q4 まにあ [#cf22b452]
以下のプログラムを実行したときの結果を答えなさい.
#pre{{
#include <stdio.h>
void Print3(int *a)
{
printf("%d %d %d\n", *a, *(a + 1), *a + 5);
}
int main()
{
int x[10], *p, i;
for(i = 0; i < 10; i++) x[i] = i;
p = &x[6];
Print3(x);
Print3(&x[5]);
Print3(++p);
return 0;
}
}}
ページ名: