• ベストアンサー

ポインタと配列

初歩的な質問なんですが、 #include <stdio.h> #include <string.h> main() { char ss[10]; char *p; strcpy(ss,"ABCDE"); p=ss; while(*p){ *p=*p+1; ++p; } printf("ss=%s\n",ss); } で実行結果が ss=BCDEF になります。 while(*p){ *p=*p+1; ++p; } の部分がどうしても理解できません。 参考書にも、解説が載ってなくて困っています。 ご教授宜しくお願いします。

noname#100914
noname#100914

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

  • ベストアンサー
  • gould09
  • ベストアンサー率33% (196/589)
回答No.1

こんにちは ポイントだけ説明します。 while(*p){ ←最初はssの先頭の"A"が入っていれ"E"まで繰り返します。 *p=*p+1; ←最初は"A"の文字コードに1を足したので"B"になります。以下同様 ++p; ←文字の処理するポインタを1更新する為、次の文字を扱うようになります }

その他の回答 (3)

  • nakashi
  • ベストアンサー率51% (21/41)
回答No.4

while(*p){ *p=*p+1; ++p; } は下記と処理内容は等価です for (long lLoop = 0;;) {  if (p[lLoop] == 0) break;  p[lLoop] = p[lLoop+1];  lLoop++; }

  • brogie
  • ベストアンサー率33% (131/392)
回答No.3

今晩は!gould09さんが回答されていますが、もう少し、詳しく見てみましょう! 参考のURLのアスキーコード表を見ますと、 文字Aのアスキーコードは16進で0x41です。 文字Bのアスキーコードは16進で0x42です。 ・・・・・ p=ss; でポインターpは配列ss[0]を指します。 その内容はAです。コードは0x41です。 *p=*p+1; この文の説明です。 右辺の*p+1は、ポインターの内容Aの値(*p==0x41)に1を加えます。 従って、右辺の内容はB(0x42)となり、 その値を*pに代入しますから、*pはB(0x42)となります。 その値を表示していますから、 ssの先頭はBとなっています。 (ss=BCDEF) ++p;はポインターを一つ進めますので、ss[1]を指します。 while(*p){はポインターの内容がNULLになるまで繰り返します。 C言語は、このポインターが理解できれば、また先が見えてきます。 頑張りましょう!!

参考URL:
http://www02.so-net.ne.jp/~hat/imail/img/asciitbl.gif
  • selenity
  • ベストアンサー率41% (324/772)
回答No.2

*p=*p+1; は分解すると、演算子の優先順位より、 *p = (*p) + 1; となります。 この時点で左辺の*pは&ss[0]を指しています。つまり代入先の場所です。 次に、右辺の「(*p)+1」はgould09さんの説明の通り、'A'に1をたす作業、 つまり、0x41 + 0x01 = 0x42 'B'となるわけです。

関連するQ&A

  • 配列について

    初歩的な質問ですいませんが、質問よろしくお願いします。 ◎1----------------------------- #include<stdio.h> int main(void) { char ss[10]="AB"; printf("ss=%s\n",ss); return 0; } ------------------------------------ ◎2-------------------------------- #include<stdio.h> int main(void) { char ss[10]; ss[0]='A'; ss[1]='B'; ss[2]=0; printf("ss=%s\n",ss); return 0; } ----------------------------------- ◎3------------------------------- #include<stdio.h> #include<string.h> int main(void) { char ss[10]; strcpy(ss,"AB"); printf("ss=%s\n",ss); return 0; } ----------------------------------- ◎4------------------------------- #include<stdio.h> int main(void) { char ss[10]; ss="AB"; printf("ss=%s\n",ss); return 0; } ---------------------------------- 以上4つのプログラムで、◎2と◎3は正常に動くと理解できたのですが、何故、◎1は正常に動き、◎4は「'const char [3]' から 'char [10]' に変換できません。」といったようなエラーが出てしまうか分かりません。 教えていただければ嬉しいです。

  • 配列やポインタに文字列を設定することについて

    ◎1------------------------- #include<stdio.h> int main(void) { char ss[80]; scanf("%s",ss); printf("%s\n",ss); return 0; } ---------------------------- ◎2--------------------------- #include<stdio.h> int main(void) { char *ss="abcde"; printf("%s\n",ss); return 0; } ------------------------- ◎3---------------------- #include<stdio.h> int main(void) { char *ss; ss="abcde"; printf("%s\n",ss); return 0; } ------------------------- 以上3つプログラムで疑問をいだいたのですが、 まず◎1で、これは例えば、 cahr ss[80]="abc"; のように配列ssに文字列"abc"そのものを入れているのか、 char *ss="xyz"; のようにまず"xyz"という文字列をメモリ上のどこかに設定し、その先頭番地をssに代入しているのか、どちらの考えでいいのかわかりません。 次に、◎2、3ではどちらも正常に実行できたのですが、特に◎3で「ss="abcde";」と記述していますが、ssにはアドレスを代入するという認識かあるのですが、文字列定数を代入しても問題ないのか?という疑問があります。 教えていただけたら嬉しいです。

  • 配列とポインタについて

    C言語を独学で始めたばかりの者です。 ポインタのところまでいきましたが、以下のプログラムを配列で書き替えようと思ったのですが、test4ができません。test1から3 までは配列を使って書けました。 #include <stdio.h> main() { char s[10]; char *p; strcpy(s, "ABCDE"); p=s; printf("------test1\n"); printf("s=%s p=%s\n", s, p); printf("------test2\n"); putchar(*p); putchar(*(p+1)); putchar(*(p+2)); putchar('\n'); printf("------test3\n"); *p='m'; *(p+1)='n'; printf("s=%s\n", s); printf("------test4\n"); while(*p) { *p=*p+1; ++p; } printf("s=%s\n", s); } この最後のtest4を配列で書くとどうなるのでしょうか。質問文が長くて申し訳ないのですが、お願いいたします。

  • ポインタについて

    今初めてポインタというものを勉強しております。 よろしくお願いします。 ◎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も同じような事だとは思いますが違いを教えていただけると嬉しいです。 よろしくお願いします。

  • ポインタと配列

    次のソースで、結果表示でポインタを使いたいのですが、うまくいきません。1件しか表示されないのです。 ポインタの扱いがおかしいのだと思いますが、どうしたらよいでしょうか? #include <stdio.h> #include <string.h> int search(char key[256],FILE *fp,char *result[256][256]); main(void) { FILE *fp; int rep,n,i; char x[256],key[256],*result[256][256]; printf("検索キーワードを入力してください。\n" "キーワード>"); gets(key); if((fp=fopen("personal.txt","r"))==NULL) { printf("ファイルをオープンできません\n"); exit(1); } printf("=====検索結果=====\n"); n=search(key,fp,result); for(i=0;i<n;i++) { printf("%s\n",result[i]); } printf("検索結果:%d件です。\n",n); fclose(fp); } int search(char key[256],FILE *fp,char *result[256][256]) { int n=0; char *p,word[256],*name; while((p=fgets(word,256,fp))!=NULL) { if(strstr(word,key)!=NULL) { name=strtok(p," "); strcpy(result[n],name); n++; } } return n; } 実行すると、下の警告がでます。 illegal pointer combination(param)

  • char型ポインタ

    よくプログラムで charポインタだけ指定して、 #include<stdio.h> int main(){ char* p; p = "abcdef"; printf("%s",p); return 0; } のようにしているのをみかけますが、 メモリーを確保していなくても問題ないのでしょうか? char* p; p = (char*)malloc(7); strcpy(p,"abcdef"); としたのと同じでしょうか?

  • ポインタ配列について

    下のプログラムは、ポインタ変数の配列のプログラムです。 このプログラムを、月の順番を入れ替えて出力するプログラムに変更するにはどのようにすれば良いか分かる方いましたら、是非教えてください。例えば、JANUARYとMARCHを入れ替えて出力するプログラムなどです。 #include<stdio.h> void main() { char *p[] = {"JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE", "JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER"}; int i,j; *p[0]=*p[2]; *p[0]=*p[2]; for(i = 0;i < 12; ++i){ printf("%2d 月:%s\n",i+1,p[i]); } for(i = 0;i < 12; ++i){ j = -1; do{ ++j; printf("%4x ",p[i]+j); } while (*(p[i]+j) != '\0'); printf("\n"); j = -1; do{ ++j; printf(" %c ",*(p[i]+j)); }while (*(p[i]+j) != '\0'); printf("\n"); } }

  • 構造体宣言したポインタ変数に値を代入するには?

    strcpy(p -> key ,name);と打ってp -> key に入力した名前を格納したいのですがうまくいきません。 ほかにもp -> key = nameなども試してみましたがコンパイルエラーが出現してダメでした。 うまく格納できるやり方があれば教えてください。よろしくお願いします。 #include<stdio.h> #include<string.h> #define WORD_LENGTH 50 /* 文字列の最大長 */ typedef struct cell{ char key[WORD_LENGTH]; struct cell *next; /* 次のセルへのポインタ */ } CELL; void main(void) { char name[WORD_LENGTH]; CELL *p; printf("名前入力\n"); scanf("%s\n", name); strcpy(p -> key ,name); printf("%s\n", p -> key); }

  • ptrcpy関数 コピーする領域の確保について

    prcrpyを使い、コピーする領域の確保をわざと少なめにしたプログラムを 下のようにかいたのですが、エラーが出ません。 どうしてでしょうか? #include <stdio.h> #include <string.h> main() { char s[5] = "Hello"; printf("%s\n",s); strcpy(s,"Good bye") ; printf("%s\n",s); }

  • ポインタにによる値の表現と文字列の表現について

    ◎1------------------------------ #include<stdio.h> int main(void) { char *pt="ABC"; printf("pt=%s\n",pt); char dt[10]="ABCDE"; char *pp; pp=dt; printf("pp=%s\n",pp); return 0; } -------------------------------------- ◎2---------------------------------- #include<stdio.h> int main(void) { char *pt="ABC"; printf("*pt=%s\n",*pt); char dt[10]="ABCDE"; char *pp; pp=dt; printf("*pp=%s\n",*pp); return 0; } ----------------------------------- ◎3--------------------------------------- #include<stdio.h> int main(void) { int ary[5]={111,222,333,444,-1}; int* pt=ary; while(1){ printf("%d ",*pt); ++pt; if(*pt==-1){ break; } } puts(""); return 0; } ----------------------------------------------- 以上3つのプログラムで、◎1はprintfで「*」が付いてなく、正常に実行出来ました。 ◎2はprintfで「*」が付いてなく、エラーは出ませんが、文字列が表示されませんでした。 ◎3は文字列ではなく値ですが、printfで「*」が付いていて正常に実行できます。 これは、値の場合は「*pt」とすることで、ptのアドレスに値を代入しているという事で、「printf("%d ",*pt);」で実行できたということですかね? 文字列の場合は、先頭のアドレスを渡すだけなので、「printf("pt=%s\n",pt);」のようにしてアドレスを参照しないとダメであるということですか? ◎2で「printf("*pt=%s\n",*pt);」としてしまうと、何が起きてしまうのかわかりません。 以上、教えていただけると嬉しいです。