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

ポインタと配列 助けてください

このQ&Aのポイント
  • ポインタと配列を使用して、一次元配列の一番目の要素以外を0にするプログラムを作成したい
  • プログラムの中でポインタを使用して、配列の要素を操作する方法がわからない
  • 助けてください

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★アドバイス ・ポインタと配列の前に if 文と printf 文を先にお勉強しましょう。あと代入文も。 ・簡単な講座。 ステップ1: a = 123; ←int 型の a 変数に 123 を代入 b = 123.456; ←double 型の b 変数に 123.456 を代入 ptr = array; ←ポインタ ptr に配列 array を代入 ステップ2: if ( 条件式 ){  条件式が『真』の処理 } else{  条件式が『偽』の処理 } ステップ3: printf( "a = %d\n", a ); ←a の値を表示 printf( "b = %f\n", b ); ←b の値を表示 printf( "ptr = %p\n", ptr ); ←ポインタ値を表示 参考文献: ・http://www9.plala.or.jp/sgwr-t/c/sec02.htmlhttp://www9.plala.or.jp/sgwr-t/c/sec06-1.htmlhttp://www9.plala.or.jp/sgwr-t/c/sec05.html ・以上。

参考URL:
http://www9.plala.or.jp/sgwr-t/index.html
bitrate
質問者

お礼

printf文の中はわかったのですが、while文のところのないを書けばいのかわかりません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 助けてください ポインタと配列

    #include <stdio.h> int main(void) { int a[5] = {1, 2, 3, 4, 0}; int i, *ptr; ptr = &a[0]; while (*ptr!= 0){ if(*ptr!=0) *ptr=0; } for (i = 0; i < 5; i++) printf("a[%d]=%2d &a[%d]=%p\n",i,a[i],i,ptr); // 配列aの値とアドレスを表示せよ putchar('\n'); ptr = &a[0]; for (i = 0; i < 5; i++){ printf("ptr値 =%d ptrアドレス =%p \n",*ptr,ptr); ; } // ポインタptr を使用して、修正後の配列aの値とアドレスを表示せよ printf("\n"); return (0); } /* 処理結果 a[0]= 0 &a[0]=0013FF3C a[1]= 2 &a[1]=0013FF3C a[2]= 3 &a[2]=0013FF3C a[3]= 4 &a[3]=0013FF3C a[4]= 0 &a[4]=0013FF3C ptr値 =0 ptrアドレス =0013FF3C ptr値 =0 ptrアドレス =0013FF3C ptr値 =0 ptrアドレス =0013FF3C ptr値 =0 ptrアドレス =0013FF3C ptr値 =0 ptrアドレス =0013FF3C 続行するには何かキーを押してください . . .*/ 一次元配列a[]の一番目の要素以外を0にするプログラムを作成せよ。 ただし、最後の要素は0とする。 上記の問題文とこの結果は合致しているでしょうか?

  • 配列について(C言語)

    配列の要素において一番目の要素以外を0にするプログラムを以下のように作成したのですが(while文を*b != 0という条件で作りたい)、while文内のところが間違っているためだと思われるのですが、うまく実行されません(実行しても何も表示されない)。どのようにしたらいいのでしょうか。または、何かが抜けている、ほかの部分が間違っている等もあるためにうまく実行されないということなのでしょうか。 #include <stdio.h> int main(void) { int a[5] = {5, 78, 2, 9, 0}; int i, *b; b = &a[0]; while (*b != 0){ if(*!=a[0]) *ptr=0; else *ptr=a[0]; } for (i = 0; i < 5; i++){ printf("ptr値 =%d ptrアドレス =%p \n", *ptr, ptr); } printf("\n"); return (0); }

  • ポインタと配列について教えてください。

    #include <stdio.h> int main(void) { int i; int vc[5] = {10,20,30,40,50}; int *ptr = &vc[0]; for(i = 0; i < 5; i++) printf("vc[%d] = %d ptr[%d] = %d *(ptr + &d) = %d\n", i, vc[i], i, ptr[i], i, *(ptr + 1)); return(0); } というプログラムで実行結果は vc[0]=10 ptr[0]=10 *(ptr +0 )=10 vc[1]=20 ptr[1]=20 *(ptr +1 )=20 vc[2]=30 ptr[2]=30 *(ptr +2 )=30 vc[3]=40 ptr[3]=40 *(ptr +3 )=40 vc[4]=50 ptr[4]=50 *(ptr +4 )=50 となるのですが、なぜこうなるのか分かりません。 int *ptr = &vc[0]; の行では、vc[0]のアドレスを *ptrに代入するという意味ではないのでしょうか?

  • for文

    以下のプログラムのforの条件文がなぜこれで動くのかよくわからないので 教えていただけないでしょうか? #include<stdio.h> int main(void) { int i; char str[] = "ABC"; char *ptr = "123"; for(i=0;str[i];i++) putchar(str[i]); putchar('\n'); for(i=0;ptr[i];i++) putchar(ptr[i]); putchar('\n'); printf("str = \"%s\"\n",str); printf("ptr = \"%s\"\n",ptr); return(0); }

  • ポインタ配列

    配列をポインタでとって、配列要素を足していこうと思ったのですが、 #include <stdio.h> int main (void) { int p[11]={11,23,43,66,54,67,51,88,22,43,-1}; int *e=p; int x=0; int i=0; while( *e!=-1 ) { x + = ( * (e+i) ); i++; } printf("%d\n",x); return 0; } x = ( * ( e+i ) ); ↑この部分がなぜだめなのか理解できません どなたか教えてくださるとありがたいです

  • ポインタ配列の動的確保

    ポインタの配列の動的確保について教えてください。 入力した数値をポインタ配列に入れるプログラムです。 下記のように書いてみました。(見づらくてごめんなさい) #include<stdio.h> #include<stdlib.h> #define kensu 3 main() { char abc[kensu+1]={'A','B','C','\0'}; char *ptr[kensu]; int i; printf("3つの整数を入力して下さい。\n"); for(i=0;i<kensu;i++){ ptr[i]=(char*)malloc(sizeof(char)*10); if(ptr[i]==NULL){ printf("メモリの取得に失敗しました"); exit(1); } printf("整数%c:",abc[i]); fgets(ptr[i],10,stdin); if(ptr[i][strlen(ptr[i])-1]=='\n') ptr[i][strlen(ptr[i])-1]='\0'; } for(i=0;i<kensu;i++) free(ptr[i]); } ちゃんと動いているようです。 しかし、ポインタ配列の動的確保をネットで調べてみると、ポインタのポインタ(?)を使って、下記のように2度mallocしています。 #include <stdio.h> #include <stdlib.h> #define N 3 int main(void) { char** arr; int i,j; arr = (char**)malloc(N * sizeof(char*)); /* ポインタ配列を確保 */ /* 配列の要素それぞれにつき、メモリ領域を確保 */ for(i=0;i<N;i++) arr[i] = (char*)malloc(N * sizeof(char));   ・・・ ポインタの配列を宣言して、配列の各要素に動的確保するのと ポインタのポインタを宣言し、ポインタ配列を動的確保して、再度配列の要素に動的確保するのとでは、何か違いがあるのでしょうか? ポインタのポインタを宣言し、ポインタ配列を確保する必要性が良く分かっていないのです。 ネット等で調べて見たのですが、理解力がないのかよく分かりませんでした。 どうか教えてください。

  • ポインタと二次元配列

    二次元配列a[ ][ ]の第1行の要素以後を0にするプログラムで動きます。 疑問なんですが、4行目のa[ ][4]は、なぜ[ ]のように空欄になっているんでしょうか。 また、8行目のpa=a[1];は、なぜpa=a[0];ではだめなんでしょうか。第1行は先頭行で0行目を意味しているのではないでしょうか。 #include <stdio.h> void main(void) /*ポインタと二次元配列*/ { static int a[ ][4]={{1,2,3,0}, {4,5,6,0}, {7,8,9,-999}}; int j,k,*pa; pa=a[1]; while(*pa!=-999){ *pa=0; pa++; } for(j=0;j<3;j++){ for(k=0;k<4;k++) printf("%5d",a[j][k]); printf("\n"); } }

  • すいません 下の修正版です。

    #include <stdio.h> int main(void) { int a[5] = {1, 2, 3, 4, 0}; int i, *ptr; ptr = &a[0]; while (*ptr!= 0){ if(*ptr!=0) *ptr=0; } for (i = 0; i < 5; i++) printf("a[%d]=%2d &a[%d]=%p\n",i,a[i],i,ptr); // 配列aの値とアドレスを表示せよ putchar('\n'); ptr = &a[0]; for (i = 0; i < 5; i++){ printf("ptr値 =%d ptrアドレス =%p \n",*ptr,ptr); *ptr=a[0]; } // ポインタptr を使用して、修正後の配列aの値とアドレスを表示せよ printf("\n"); return (0); } /* 処理結果 a[0]= 0 &a[0]=0013FF3C a[1]= 2 &a[1]=0013FF3C a[2]= 3 &a[2]=0013FF3C a[3]= 4 &a[3]=0013FF3C a[4]= 0 &a[4]=0013FF3C ptr値 =0 ptrアドレス =0013FF3C ptr値 =0 ptrアドレス =0013FF3C ptr値 =0 ptrアドレス =0013FF3C ptr値 =0 ptrアドレス =0013FF3C ptr値 =0 ptrアドレス =0013FF3C 続行するには何かキーを押してください . . .*/ 一次元配列a[]の一番目の要素以外を0にするプログラムを作成せよ。 ただし、最後の要素は0とする。 上記の問題文とこの結果は合致しているでしょうか?

  • できているとは、思うのですが。ポインタの配列を

    コンパイラではちゃんと動いてます。 1 2 3 0 1 2 3 という具合です。 気になるのは、printarrayの部分が正しいのか、ちょっと悩んでいます 問題としては main関数では0の値を読み込むまで最大99(MAX-1)個の値を配列 xに読み込んでいる。引数のポインタからの値を、値が0になるまで すべて1行に1つづつ画面に出力する関数printarray()を作成し、 プログラムを完成せよ。 引数はアドレスとして受け取る事。(配列としてでなく) フォーマットは、 "%d¥n" とする。(余計な出力はしない事。) (0は出力しない。) main内部を変更してはならない。 以下がソースです。 ご指摘よろしくお願いします。 #include <stdio.h> #define MAX 5 void printarray(int *); int main() { int x[MAX], i; int *p; x[MAX-1] = 0; for (i = 0, p = x; i < MAX-1; ++i, ++p) { scanf("%d", p); if (*p == 0) { break; } } printarray(x); return 0; } void printarray(int *a) { int i,*p; for(i = 0, p = a; i < MAX-1; ++i,++p) { if(*p == 0){ // continue; break; }else{ printf("%d\n", *(a+i)); } } }

  • ポインタ配列で、、。

    #include <stdio.h> #define NUM 3 main (void) { char *c = {"cup"}; char *cc[NUM], a0 = 'L', a1 = 'A', a2 = 'P'; char *ccc[NUM] = {"hat","bat","cat"}; int i; cc[0] = &a0; cc[2] = &a1; cc[2] = &a2; printf("c -----> %s\n", c); for(i = 0; i < NUM; i++) { printf(" cc[%d] -> %c\n", i, *cc[i]); } for(i = 0; i < NUM; i++) { printf("ccc[%d] -> %s\n", i, ccc[i]); } for(i = 0; i < 3; i++) { printf("ccc[0][%d] --> %c\n", i, ccc[0][i]); } } /* わたしの実行結果です c -----> cup cc[0] -> L Press any key to continue */ これはどういうことをしているプログラムなのでしょうか?どうかお願いします。

このQ&Aのポイント
  • ルータを変えたら印刷はできるがスキャンができなくなった。
  • Windows11で接続されており、無線LAN経由で接続されています。
  • 関連するソフト・アプリや電話回線の種類については記載がありません。
回答を見る

専門家に質問してみよう