プロが教えるわが家の防犯対策術!

C言語のポインタは使わなくてもC言語は書けたりするのでしょうか?

メモリの参照の仕方が違うだけな気がします。

色々ご意見いただけたら助かります

A 回答 (6件)

ポインタを理解してないと自作関数どころか標準関数すら使えなくなるよね



例えばC言語に限らずPythonですら配列には参照渡しや値渡しといったポインタに近い物があるんですよ
    • good
    • 1
この回答へのお礼

直接、配列や変数の値を渡してはダメなのでしょうか?

お礼日時:2019/07/26 10:23

>直接、配列や変数の値を渡してはダメなのでしょうか?



数値だと簡単で解りにくいから
まず文字列を扱う標準関数を使ってみたり、自分で文字列を操作する関数を作ってみてごらん
    • good
    • 1

大体はなんとかできますね。


ただ、ポインタを使ったほうがスマートになります。

例えば、関数に配列を渡そうとしたら、
kannsuu(a[0],a[1],a[2]);
と、要素が数個なら良いですが、数十個超えると現実的ではなくなります。
そうするとグローバル変数を使えばいいですが、今度は変数の寿命が無駄に長くなり、読みにくいソースコードになります。

また、関数で戻り値を複数個返したいときもポインタを使えば引数で返すことができますが、ポインタを使わないとやはりグローバル変数を使うこととなり、読みにくい上に移植性が悪くなります。
    • good
    • 1
この回答へのお礼

ありがとうございました。
少しずつポインタを使ってみます。

お礼日時:2019/07/26 16:38

「C言語が書ける」という日本語の意味が理解できないですが....



さておき規格上関数を呼び出すためには「関数へのポインタ」が必須なので, 「ポインタを使わない」とすると理屈的には
関数が呼び出せない
とすらいえるな.

もちろん関数を呼び出さなきゃいいので
int main()
{
}
くらいのプログラムなら書けるが, 逆にいえば
これくらいしか書けない
んだけど, それでいい?

これとは別件だけど関数に配列を渡すと自動的にポインタになっちゃうから, 「ポインタを使わない」とするとこれもダメだよ.
    • good
    • 0

配列要素のアクセス


a[3]
は立派なポインタを使ったアクセスだけど
分かってます?

Cだと配列出てきたらポインタは避けられない、
というか、ポインタと配列の区別は殆ど無い。

また、ポインタが陽に出てこないpythonのような
言語でも間接参照の概念は有用です。
#pythonのような言語では、実は変数はほぼ全部ポインタだったりします。
    • good
    • 0

要するに、実際には使われているかどうかは置いといて、


「*」と「&」を使わずに書けるかという話でしょうか?
少なくとも、宣言に「*」を書かない場合は、出来ることはかなり限られるんじゃないかなと思います。
ポインタを引数にする標準関数やシステムコールは、書き方をかなり工夫しないといけないっぽいです。

意外なことに、scanf()も書けますね、配列の宣言の仕方は置いといたとして。
#include <stdio.h>

main()
{
int a[1];
scanf("%d", a);
printf("%d\n", a[0]);
}

ちなみに、上記だと、scanf()のすべての引数とprintf()の第1引数はすべてポインタ、
printf()の第2引数はポインタから値を取っています。

>メモリの参照の仕方が違うだけな気がします。

メモリの参照の仕方が違うのではなく、ソースコード上の表記が違うだけです。
たとえば、次の2つのプログラムは、まったく同じアセンブリコードが生成されます

プログラム1:
main()
{
char a[10];
a[1] = 1;
}

プログラム2:
main()
{
char a[10];
*(a + 1) = 1;
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!