teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

5

表現修正。

2021/02/07 13:00

投稿

hidezzz
hidezzz

スコア1248

answer CHANGED
@@ -43,7 +43,7 @@
43
43
 
44
44
  変数を配列として宣言することとと、ポインタ変数を宣言することでは確保されるデータ構造が違います。
45
45
 
46
- 配列として宣言する場合、その配列変数を格納するのに必要な領域が確保されアドレスが確定するので、アドレスを与える必要が無く、逆にアドレスを変更したいと思っても変更することは出来ません。
46
+ 配列として宣言する場合、なにもしなくてもその配列変数を格納するのに必要な領域が確保されアドレスが確定するので、アドレスを与える必要が無く、逆にアドレスを変更したいと思っても変更することは出来ません。
47
47
 
48
48
  ポインタ変数ならば、初期化をしないとアドレスが不定なのであらかじめ有効な領域のアドレスを与えてあげる必要があります。
49
49
 

4

コメントを受けて追記した(配列はポインタ変数とは違うので初期化はいらない)

2021/02/07 13:00

投稿

hidezzz
hidezzz

スコア1248

answer CHANGED
@@ -30,4 +30,21 @@
30
30
  こちらも変数ppsのアクセスです。charポインタのポインタ型にデータサイズ1要素分(今どきのPCだと8バイト)ポインタを後ろにずらすという操作です。
31
31
  ```c
32
32
  pps++;
33
- ```
33
+ ```
34
+
35
+ #※コメントを受けて追記
36
+
37
+ > なぜ、ポインタの配列のsがアドレスを持っているのかわかりません。
38
+ > int t[3]
39
+ > s = &t
40
+ > こんな感じでアドレスを入力しなくても大丈夫なのでしょうか?
41
+
42
+ 配列にアドレスを与えることは出来ません。
43
+
44
+ 変数を配列として宣言することとと、ポインタ変数を宣言することでは確保されるデータ構造が違います。
45
+
46
+ 配列として宣言する場合、その配列変数を格納するのに必要な領域が確保されアドレスが確定するので、アドレスを与える必要が無く、逆にアドレスを変更したいと思っても変更することは出来ません。
47
+
48
+ ポインタ変数ならば、初期化をしないとアドレスが不定なのであらかじめ有効な領域のアドレスを与えてあげる必要があります。
49
+
50
+ Cの場合、ポインタと配列は同じような演算が行えることもあり両者を混同してしまいがちかもしれませんが、明確に違うデータ構造であることを理解して区別することが必要です。

3

ポインタをずらす操作として「1を足す」が誤解を受ける表現なので修正した。

2021/02/07 12:57

投稿

hidezzz
hidezzz

スコア1248

answer CHANGED
@@ -27,7 +27,7 @@
27
27
  printf("%s\n",*pps);
28
28
  ```
29
29
 
30
- こちらも変数ppsのアクセスです。charポインタのポインタ型の変数値に1を足してポインタを後ろにずらすという操作です。
30
+ こちらも変数ppsのアクセスです。charポインタのポインタ型にデータサイズ1要素分(今どきのPCだと8バイト)ポインタを後ろにずらすという操作です。
31
31
  ```c
32
32
  pps++;
33
33
  ```

2

配列の宣言と使用の両方で使う[]の区別についても言及した。

2021/02/07 11:10

投稿

hidezzz
hidezzz

スコア1248

answer CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  変数宣言に付く「*」は変数の型がポインタであることを示す宣言の一部です。
4
4
  変数を使うときに付く「*」はポインタ変数からその実体を取り出す演算子です。
5
+ (ついでにいうと配列の宣言に付く[]と、配列変数の個別要素アクセス時に付く配列アクセス演算子[]も区別して理解する必要があります。)
5
6
 
6
7
  以下は変数宣言です。上記は「*s」とか「*s[3]」という変数の宣言ととらえるのではなく、sという変数の宣言でその型がポインタ型変数の要素数3の配列であることを宣言しています。
7
8
 

1

表現修正。

2021/02/07 11:02

投稿

hidezzz
hidezzz

スコア1248

answer CHANGED
@@ -1,4 +1,4 @@
1
- 個別の質問に答えるというよりも、複数ある「*」を混同してていることがコードの理解の妨げになっていると思われるのでそこを指摘したいと思います。
1
+ 個別の質問に答えるというよりも、複数ある「*」を混同してとらえていることがコードの理解の妨げになっていると思われるのでそこを指摘したいと思います。
2
2
 
3
3
  変数宣言に付く「*」は変数の型がポインタであることを示す宣言の一部です。
4
4
  変数を使うときに付く「*」はポインタ変数からその実体を取り出す演算子です。