C言語の勉強始めた初心者だけどポインタが全くわからない

1 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:00:00.737 ID:KOvy4Yk30NIKU
ポインタはその値が格納されてるアドレスを示すっていうのは分かった

じゃあC言語で
char *test と
char *test[100]と
char test[100] の違いってなに?
それからtestを使うとき
*testってやるときとtestでやるときと&testでやるときって何が違うの?

2 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:00:40.144 ID:swz2lvI40NIKU
アナルだよ
3 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:00:41.108 ID:zB9B97TD0NIKU
取り敢えず何か作れよ
そしたらわかる
5 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:01:20.501 ID:KOvy4Yk30NIKU
>>3
まずこの辺わからないから作れない
4 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:01:14.222 ID:9CEQRTS/pNIKU
ゴミしかいないからvipで聞いても無駄だぞ
6 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:01:29.952 ID:KOvy4Yk30NIKU
>>4
そんなことない!きっといる!
7 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:02:08.351 ID:alo9iYxwaNIKU
c言語マイスターが来ました

なんで今更cなの?

11 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:03:06.905 ID:KOvy4Yk30NIKU
>>7
>>10
cやりたいんだ大学で習ったし
>>8
>>9
うう
8 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:02:12.988 ID:5Nu20k5n0NIKU
>>1
C言語ポインタ完全制覇って本に
なんでこんなことになったのか
って経緯が全部書いてるけど…

まぁちょっと難しいかな、まだね

9 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:02:14.311 ID:w/BIGyP9dNIKU
一昨年までは理解してたけどもう忘れた
10 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:02:34.977 ID:Q4dGfq8l0NIKU
なんでいまさらC言語を
12 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:03:54.804 ID:8wAA8p9c0NIKU
char *test testに1個アドレス値が入る。それはchar型の変数を指し示すもの
char *test[100] アドレス値の入る配列を100個分用意した
char test[100] char型の値が入る配列100個分用意した
*test testが指し示すアドレスにあるchar型の値
test 指し示すアドレス
&test testという変数のアドレス
17 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:06:13.377 ID:KOvy4Yk30NIKU
>>12
完全に理解したありがとう
13 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:04:29.534 ID:gcjLiMlc0NIKU
1番上はchar型のポインタ変数の宣言
真ん中はchar型のポインタ変数を格納できる配列
1番下はchar型変数を格納できる配列
14 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:04:54.709 ID:Le9hqBya0NIKU
*は変数のアドレス値
&はポインタ型の変数の中身を参照できる
20 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:07:15.779 ID:Le9hqBya0NIKU
>>14
あれこれ逆だったわ
15 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:04:58.444 ID:LmGxHb7L0NIKU
配列とポインタって何が違うの?
16 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:05:48.023 ID:5Nu20k5n0NIKU
>>15
ポインタじゃわかりにくいから
配列って表記にしましょうってだけだよ
19 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:06:55.972 ID:LmGxHb7L0NIKU
>>16
じゃた*charとchar[100]は全く同じ?
18 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:06:55.171 ID:RNaSEpfc0NIKU
ポインタはインデックス
21 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:07:18.134 ID:8wAA8p9c0NIKU
配列は値が入る領域を複数確保したもの
ポインタはその配列のうちどこかを指し示すもの
24 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:09:23.622 ID:LmGxHb7L0NIKU
>>21
ポインタを定義して[]でアクセスするのと配列を定義して[]でアクセスするのってなんか変わるの?
29 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:12:41.201 ID:8wAA8p9c0NIKU
>>24
ポインタ自体は一つの変数でアドレスを指し示すもの
それを配列のように表現ができる
配列の[10]と指定した場合はその位置における値をアクセスできる
配列[i]とポインタ[i]は似て非なるもの
結果的に同じようなことができるがポインタを使った場合はもっと広範囲の応用が利く
35 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:18:09.159 ID:LmGxHb7L0NIKU
>>29
多次元配列として使うとき以外に具体的に配列とポインタだとどんな違いが出る?
37 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:20:07.582 ID:8wAA8p9c0NIKU
>>35
関数の引数または戻り値でポインタを使うと表現が簡単になる
これで配列のアドレスを関数に簡単に渡すことができる
38 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:23:00.840 ID:LmGxHb7L0NIKU
>>37
配列のままでもポインタとして使えないの?
40 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:27:39.375 ID:8wAA8p9c0NIKU
>>38
配列のまま関数の引数にするとそれらはすべてスタックに積まれるので膨大な領域を必要とする
だからポインタ変数を使ってアドレスだけ渡す
42 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:28:23.723 ID:LmGxHb7L0NIKU
>>40
配列を渡す時って参照渡しじゃないの?
45 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:29:29.921 ID:8wAA8p9c0NIKU
>>42
配列名でもアドレス渡しになる
ポインタ変数と同じ
配列そのものを渡そうとするととんでもないことになる
47 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:30:17.060 ID:LmGxHb7L0NIKU
>>45
それなら配列でもポインタでも同じじゃないのか?
何が違うのかわからん
48 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:32:05.132 ID:8wAA8p9c0NIKU
>>47
いくつか同じような配列があってそれらを条件によって使い分ける場合
配列の先頭値をポインタ変数に入れてやる
そうすれば短いコードで済むようになる
50 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:33:21.665 ID:LmGxHb7L0NIKU
>>48
その入れる変数は配列の変数でも動作は変わらない?
54 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:38:20.354 ID:lnKq+5SV0NIKU
>>47
配列でないとできないことはないのでは?
ポインタがないとできないことは色々あるけど

配列でないとできないこと何かあるか?

56 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:39:22.798 ID:lnKq+5SV0NIKU
>>47
書き忘れた

配列のほうがコードが理解しやすいから
それが配列のメリット

22 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:07:24.447 ID:KgofFiav0NIKU
ポインタが理解できない奴はイマジネーション力が足りない
AVばっか見てないで妄想オ●ニーもすべき
23 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:08:16.166 ID:YZ6S5mwUdNIKU
ポインタは住所
参照はワームホール
25 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:10:20.551 ID:z0aMFUjsrNIKU
ポインタはメモリアドレスから直接アクセスする手段
26 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:10:23.576 ID:5Nu20k5n0NIKU
なんか本当に忘れちゃったな
勉強って意味あんのかな
もう一度テキスト見れば思い出すんだろうけど
30 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:12:54.728 ID:Le9hqBya0NIKU
>>26
忘れてもテキスト見ればすぐ思い出せるだろ
長期記憶って簡単に忘却できるものじゃないし勉強は意味あるよ
27 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:11:20.423 ID:gcjLiMlc0NIKU
ポインタ分かればtest[100]は100[test]って書いても問題ないってのも理解できる
28 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:12:35.523 ID:5Nu20k5n0NIKU
>>27
それ知ったときは結構衝撃だよね
34 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:16:54.515 ID:cm7m8J30aNIKU
>>27
IOCCCへの道か
36 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:18:41.279 ID:774xgUSIaNIKU
>>34
あれまだやってんの?
大体defineとfor地獄のイメージなんだけど
49 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:32:57.965 ID:lnKq+5SV0NIKU
>>27
え?こんなの通るのか?
ポインタ理解してても、これがエラーにならないのは納得できんが
31 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:13:40.217 ID:774xgUSIaNIKU
これが分かれば構造体に関数のポインタぶち込んだ時どうなるのかもわかるぞ
素直にクラス使えよって話だがC言語縛りなら致し方ない
33 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:15:57.464 ID:gcjLiMlc0NIKU
まあ最近のコンパイラは誘導変数削除っていう配列をポインタで置き換える最適化を勝手にやってくれるからあんまり気にしなくても良いんだけどね
ポインタ使うと実際のアドレス計算をちょっと楽にできて速くなるよってお話
39 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:26:18.301 ID:LmGxHb7L0NIKU
よくわからないんだが配列の方が多次元配列のアクセス記法が使えて上位互換なの?
41 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:28:20.958 ID:5Nu20k5n0NIKU
>>39
いや
ダブルポインタ使えばいいだけ
43 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:29:14.001 ID:LmGxHb7L0NIKU
>>41
シングル?ポインタと1次元配列、ダブルポインタと2次元配列ってなんか違うの?
46 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:30:07.013 ID:5Nu20k5n0NIKU
>>43
一緒なんだけど
ダブルポインタを使ったほうが頭の体操になっていい
思考が立体的になる
44 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:29:22.668 ID:774xgUSIaNIKU
もはやアセンブリの領域に行ってない?
詳しく内部の動き説明したらそうならざるを得ないけどさ
51 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:33:34.932 ID:Mju+tDo10NIKU
> typeof(10[d])
'undefined'
> typeof(d)
'object'

通んないぞ

52 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:36:13.995 ID:LmGxHb7L0NIKU
char a[]、char *aって定義してあるときにaって書いたときに得られるものはどっちも同じ?
55 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:38:58.917 ID:8wAA8p9c0NIKU
>>52
同じ
57 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:41:12.463 ID:b2G/lmlSMNIKU
ポインタはポインタであってアドレスではない
60 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:42:26.399 ID:8wAA8p9c0NIKU
>>57
組み込みの場合ほとんどアドレスになるけど
61 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:44:13.053 ID:b2G/lmlSMNIKU
>>60
処理系によっては結果的にそうなるとしてもC言語の話なら別物なので
例え話にしてもかえって混乱させる原因になってると思う
59 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:42:25.752 ID:Mju+tDo10NIKU
ワイは中卒で頭悪いからビルトインモジュールやイテレータ使うのに配列あったほうが良い。
Cと違ってガベージコレクタがあるし(すまんな^^)
62 名前:一般よりも上級の名無しさん 投稿日時:2020/10/29(木) 17:44:15.225 ID:gcjLiMlc0NIKU
int a[100];
for (int i = 0; i < 100; i++) a[i] = i;
printf(“%d\n”, 15[a]);

で書いてコンパイルしてみ
ちゃんと通るし15って出力されるよ

コメント一覧

タイトルとURLをコピーしました