• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ポインタいついて教えてください)

ポインタについての要約

noname#25358の回答

noname#25358
noname#25358
回答No.3

 あ。下のソースは駄目です。希にプログラムがハングアップします。  変数というのは値を入れた「箱」であり、ポインタは「その箱がどこにあるか」を書いたメモです。  ところが、宣言したばかりのポインタにはどんな値が入っているか分かりません。  そのポインタ変数に値を入れると、「どんな値か分からない」値がアドレスとして使用され、それが偶然にもシステム領域のど真ん中だった場合、こんな簡単なプログラムがシステムメモリを破壊して場合によってはフリーズします。  上のソースは「ポインタ(メモ)にアドレスを書き込む」という動作をしているので問題ありませんが、下は「どこだかよく分からないアドレスに値を書き込む」という動作なので大変危険です。  ちなみにポインタの概念は、C言語を勉強する人が必ず通り壁ですので、すぐには理解できなくても不思議はありません(^_^;  上記の説明で分からないところがあったら補足してください。

noname#142904
質問者

お礼

deagleさん、レスありがとうございます。 とても解りやすかったです。

関連するQ&A

  • ポインタ定義は必要なんですか?

    #include <stdio.h> int main( void ) { int x; int *p; p = &x; printf("Address = %p\t\n", p ); return 0; } を #include <stdio.h> int main( void ) { int x; int p;←ここを上とはかえた p = &x; printf("Address = %p\t\n", p ); return 0; } にしたところコンパイル時に p = &x に関して 移植性のないポインタ変換と表記されますが 結果は同じだったのでポインタ定義というのは結局必要なんですか? 移植性のないポインタ変換とはなんなんですか? よければ詳しく教えてください

  • ポインタについて

    今初めてポインタというものを勉強しております。 よろしくお願いします。 ◎1---------------------------------- #include<stdio.h> int main(void) { int mydt=1234; int *pt; pt=&mydt; printf("*pt=%d\n",*pt); printf("&mydt=%p\n",&mydt); return 0; } --------------------------------------- ◎1のようにmydtのアドレスをポインタptに代入すれば、このプログラムは正常に動きました。 ◎2----------------------------------- #include<stdio.h> int main(void) { int mydt=1234; int *pt=&mydt; printf("*pt=%d\n",*pt); printf("&mydt=%p\n",&mydt); return 0; } ---------------------------------------- ◎2で「int *pt=&mydt;」があまりどういう意味かはわかりませんが、これも正常に動きました。 ◎3------------------------------------ #include<stdio.h> int main(void) { int mydt=1234; int *pt; *pt=&mydt printf("*pt=%d\n",*pt); printf("&mydt=%p\n",&mydt); return 0; } -------------------------------------- ◎3のように◎2と違って「*pt=&mydt」の代入を後から行うと、「'=' : 'int *__w64 ' から 'int' に変換できません。」といったようなエラーが起きてしまいます。 ◎1と◎2の違い、後何故◎3はダメなのかがわかりません。 教えていただけると嬉しいです。 後補足として、配列とポインタについてですが、 ◎4------------------------------ char ss[10]="ABCDE"; char *ssp=ss; --------------------------------- ◎5---------------------------- char ss[10]="ABCDE"; char *ssp; ssp=ss; -------------------------------- ◎4と◎5も同じような事だとは思いますが違いを教えていただけると嬉しいです。 よろしくお願いします。

  • 関数とポインタについて

    #include <stdio.h> void test(int *p); int main() { int i; test(&i); printf("%d",i); return 0; } void test( int *p) { static int k; k = 10; p = &k; } このようなプログラムを作って、void test()のkの値をmain関数で受け取りたいのですが、どのようにすればよいのかわかりません。 どなたか教えていただけませんか?

  • C言語のポインタ

    あまり意識せずにポインタを使っているせいか,次のプログラムではまってしまいました. #include<stdio.h> #include<stdlib.h> int main(void) {  int *p, q;  p = (int *)malloc(sizeof(int));  q = (int *)malloc(sizeof(int));  *p = 2;  printf("%d\n", *p);  return 0; } コンパイルエラーで実行ファイルが出力されません. このプログラムで変数qはなぜポインタじゃないのでしょうか? 次にtypedefでptr_intという型を定義したプログラムは, 上のようなエラーが出力されず,期待とおりの結果になりました. #include<stdio.h> #include<stdlib.h> typedef int* ptr_int; int main(void) {  ptr_int p, q;  p = (int *)malloc(sizeof(int));  q = (int *)malloc(sizeof(int));  *p = 2;  *q = 3;  printf("%d\n", *p);  printf("%d\n", *q); return 0; } typedefすることでなぜエラーを回避することができるのでしょうか? よろしくおねがいします.

  • C++ ポインタ初級

    C++で、自作関数内でメインの数字をインクリメントします。 自作関数はVOIV型でやりたいんです。 #include <stdio.h> void plus( int * ); main( ){  int a = 1;  int *&p = &a;  plus( p );  printf( "%d" , *p ); } void plus( int *i ){  ( *i )++; } int型の変数を2つ宣言したけど、1つでやる方法はないですか? #include <stdio.h> void plus( int * ); main( ){  int a = 1;  plus( &a ); // aのアドレスを渡して、  printf( "%d" , a ); } void plus( int *i ){ // アドレスの値を  ( i )++; // インクリメントしたつもりだけど } 結果は1のままでした。

  • ポインタ

    #include<stdio.h> int main() { char *p; p="ポインタ"; printf(p); return 0; } なぜ p="ポインタ"; とできるのですか? 普通は  int *i, j; i=&j; *i=100; こんな感じでやるのでは?

  • C 関数とポインタ

    ポインタと関数がよく分かりません。 (日本語がおかしくてすみません(^_^;)) たとえば↓のようなプログラムで、 #include <stdio.h> void increase(int *i); int main(void) { int x = 3; increase(&x); printf("%d\n", x); return 0; } void increase(int *i) { (*i)++; } 結果は4になりますが、increase(&x)が&xとなっていて、 関数はvoid increase(int *i)でint *iになっているのですが、 これはvoid increase(int *i)はint型の「ポインタ」なので、 increase(&x)も&xと「アドレス」を渡さなければいけないということですか?? そして、void increase(int *i)内では、アドレス&xの指す値をインクリメント、という考えで良いのでしょうか?

  • CでいうポインタみたいなことをJAVAでも・・・

    Cでいうポインタを使ったプログラム #include <stdio.h> void nibai (int *a , int *b) {   *a *= 2;   *b *= 2; } int main(void) {   int a=3 , b=5;   nibai(&a,&b);   printf("a=%d b=%d\n",a,b);   return 0; } nibai関数はint型のアドレスを貰ってそのアドレスが指す値を書き換えているためmain関数に戻った際に値が変化している。 このようなことをJAVAでやりたいんですけど方法が見当たりません。 グローバルで共有するしか方法はないのでしょうか? CかつJAVAを知っている方限定の質問になってしまいますが よろしくお願いします。

    • ベストアンサー
    • Java
  • ポインタについて

    ポインタについてですが、下記のプログラムで、 data = array;  で、array[0] のアドレスを代入してますよね? for文で、all+= data[i];では、 どんな計算がおこなわれていますか? dataにarray[0]のアドレスが代入されているので、アドレスの足し算が行われているんですか?(よく解らないのですが。) 教えてください。 #include <stdio.h> int main(void) { int *data; int i, all = 0, array[10] =15,78,98,15,98,85,17,35,42,15; data = array; for (i = 0;i < 10;i++) { all+= data[i]; } printf("%d\n",all/ 10); return 0; }

  • ポインタについて(初心者です)

    おはようございます。「独習C」を使って独学している者です。わかったような、わからないような、そんな感じでポインタの所まできたのですが、文字列定数とポインタのところで分からないところがあります。 #include <stdio.h> int main(void) { char *p; p = "ひとつ ふたつ みっつ"; printf(p); return 0; } #include <stdio.h> int main(void) { char *p; printf("文字列を入力して下さい:"); gets(p); return 0; } 上のような二つのプログラムが出てきたのですが、下の方はメモリが設定されていないので正しくないと書かれていました。しかし上のプログラムでもメモリは設定されていないように思うのですが違うのでしょうか?メモリを設定するというのは、 char ch; p = &ch; ということだと思うのですが、上のプログラムではこのような文が無くても正常に動きます。この二つのプログラムは何か違いがあるのでしょうか?そもそも根本的に考え方が間違っているのでしょうか?なにぶん初心者な者で見当違いの質問だったら申し訳有りません。よろしくお願いします。