• ベストアンサー

初心者で申し訳ありませんが

nomusicnolifeの回答

回答No.2

*pはポインタpの指す先の変数を表します。 ポインタとはデータのある「場所」のことです。 p自体は場所なのですが、*を前につけることでその場所にある値を意味します。 ポインタに関しては、プログラミング自体にあまり詳しくないようであるなら、ここで変に学ぶより本などで体系的に理解した方がいいと思います。

関連するQ&A

  • C++のクラス内のchar *strについて

    初歩的な質問で申し訳ありませんが、いまC++を勉強していてわからないところがあったので質問させていただきます。以前C言語を少ししていたのでアスタリスクがポインタのことを指しているというのはわかるのですがC++でクラスを扱うとなったときなぜクラス内でconst char *strと変数の前にアスタリスクがつくのかがわかりません。ためしにアスタリスクを外してコンパイルすると4つくらいエラーが出てきて読み取り専用メンバへの代入とかchar* から char への不正(?)な変換とか出てくるのですが肝心のアスタリスクをつける意味が結局わかりませんでした。なので誰か教えてください。

  • 初心者です

    char c[] = "XXX";と書くと配列cは書き換え可能なのに対して、 char* p = "XXX";と書くと*pの指す先が書き換え不可なのは 何故なのでしょうか? そういうものだから、以外でお願いします。

  • C言語の超初心者です。質問があります。

    C言語の勉強中の超初心者です。 PICマイコンのAD変換のプログラムの中に下記の表記があります。 ある本に書いてあるものですが、全く意味がわかりません。 どなたか解説をお願いします。 static char ANString[8] ・ ・ 途中を省略 ・ ltoa(*((WORD*)(&ADRESL)),ANString); プログラムのコメントには「ASCIIに変換」とあり、アスキー文字に変換することは何となくわかりますが、 ltoa(*((WORD*)(&ADRESL)),ANString); の意味がわかりません。 よろしければ小学生でも理解できるよう、下記のようにくだいてご説明をお願いします。 ltoa(* のアスタリスクの意味 ((WORD*) の意味(アスタリスクの意味) (&ADRESL)) の意味 ,ANString); の意味 ネットで調べましたが、表記が個々に違っていて理解できません。 このような質問の内容でよいのか判断もつきませんが、ヨロシクお願いします。

  • 配列変数のアドレス

    C言語で、配列を宣言した場合、 char a[] = "hoge"; 変数aは初期化された配列の先頭番地を指しているのですが、この時、 変数aの中身も変数aのアドレス(&a)ともに上記の配列の先頭番地になっているようなのですが、 これによって、配列の変数aは読み取り専用で、書き換えられないということにしていると思っていいのでしょうか? ちなみに、 char *p = "fuga"; とした場合は、pと&pのアドレスは異なって、pの中身は書き換えられます。

  • C++コードの読み方について

    お世話になっております。以下のC++コードの意味が分からず苦戦しております。 皆さまのお知恵を拝借いたしたく、宜しくお願いいたします。 VarA* Param_p() { return m_parentParam_p->Param_p(); } これはParam_p()という配列が呼ばれたら、m_parentParam_pの値をParam_p()という配列に入れなさいという意味でしょうか? ->の意味がよく分からないのと、VarA*とアスタリスクが出ている意味が分かりません。アスタリスクがポインタであるのは分かったのですが、なぜここで、必要になるのかが分かりません。 上記の件、出せる情報が少なくこれだけでは難しいのかもしれませんが、教えていただけるとたすかります。 宜しくお願いいたします。

  • C言語のポインタのことで

    int num=15; int *p=# char h= 'A'; char *p=&h; って、数字や一文字の時は変数を用意しなくてはならないのに、 char *z="K"; ←ダブルクォーテーションで囲むと1文字もOK printf("%c\n",*z); とか、 char *name="名前"; printf("%s\n",*name); とかの場合、変数を用意しなくてもできますよね。 文字はどこか別の場所に保管されているのでしょうか?

  • C言語、配列とポインタとアスタリスクの関係

    ちょっと行き詰まっています。 苦しんで覚えるCで勉強しているのですが、まさに苦しんでいます。 http://9cguide.appspot.com/19-01.html #include <stdio.h> #include <stdlib.h> int main() { int i; int *heap; heap = (int *)malloc(sizeof(int) * 10); if (heap == NULL) exit(0); for (i = 0;i < 10;i++) { heap[i] = i; } printf("%d\n",heap[5]); free(heap); return 0; } int *heap; ここで int ポインタを宣言しています。 heap = (int *)malloc(sizeof(int) * 10); ここでヒープを確保しています。(int *) のキャストも sizeof(int) も理解できました。 for (i = 0;i < 10;i++) { heap[i] = i; } まず1点目の疑問はここです。 変数 heap は「ポインタ変数」です。それでいて配列です。 ポインタ変数は、プログラムの文中で通常の変数として使うときには「*heap」のように先頭にアスタリスクを付けなければならかなったと記憶しています。 アスタリスクなしの「heap」はアドレス格納用の変数ではないでしょうか。 printf("%d\n",heap[5]); そして、その疑問をよそに、この命令が成り立っているようです。 画面上に出される結果は「5」であり、変数「heap」がただの配列として機能しているように見えます。 この printf 次のように書き換えると、エラーが出てコンパイルできませんでした。 書き換え実験1 printf("%p\n",*heap[5]); アスタリスクを付けて、通常の変数として扱い、受ける方も「%d」から「%p」に書き換えてアドレスを表示してみようと思ったのですが、 「「pointer」を付け忘れています。」というエラーが表示されました。 書き換え実験2 printf("%p\n",heap[5]); 受ける方を「%d」からポインタを受ける「%p」にしましたが、変数の方はアスタリスクなしです。 すると、結果はアドレス「00000005」が返ってきました。 (変数にアスタがないのになぜ?) 書き換え実験3 printf("%d\n",*heap[5]); これはもうめちゃくちゃですが、一応やってみました。コンパイルエラーで、 「「pointer」を付け忘れています。」というエラーが表示されました。 つまり、こういうことです。 0:printf("%d\n",heap[5]); //5 1:printf("%p\n",*heap[5]); //エラー 2:printf("%p\n",heap[5]); //00000005 3:printf("%d\n",*heap[5]);//エラー この結果から推測するに、アスタリスクはそもそも付けるとエラーになり、アドレスを表すか、そのアドレスに格納された値を表すかを切り替えるには、単にその変数を受ける「%d」や「%p」を変えるだけ、ということになるのだと思います。 mallocで返ってくるのは、ポインタ変数(の配列)だと思うので、変数のモードを切り替えるためにアスタリスクが必要なのだと思っていましたが、どこかで重大な勘違いをしているようです。 この件について、どなたか教えていただけないでしょうか。

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

    おはようございます。「独習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; ということだと思うのですが、上のプログラムではこのような文が無くても正常に動きます。この二つのプログラムは何か違いがあるのでしょうか?そもそも根本的に考え方が間違っているのでしょうか?なにぶん初心者な者で見当違いの質問だったら申し訳有りません。よろしくお願いします。

  • charの操作について

    お世話になります、フジと申します。 今回皆様にお聞きしたいことはchar型変数の操作についてなのですが、次のプログラムのようにchar型に代入した整数を16進数用に変換させ、最後に同じchar型の変数に代入したいと考えています。 int a,b,c; char data = 48; //dataに10進数48を代入 c = (int)data; //ここでcは48になる a = c/16;          //16進数用に変換 b = c%16; c = 10*a + b;        //ここでcは30になる このint型変数c(30)をchar型変数dataに代入するにはどうしたらいいでしょうか? char buf[5]; sprintf(buf,"%d",c); にすればchar型の配列に代入することは出来ますが、これだとcの値30がbuf[0]=3,buf[1]=0となってしまい、目的の操作が達成できません。 よい方法をしっている方がいましたら、宜しくお願い致します。

  • 初心者です。教えてください、お願いします。

    「キーボードから2つの文字を入力し、それぞれ変数h,iに格納する。変数h,iをh,iの順、i,hの順に表示するプログラムを作成せよ。」という課題なのですがうまくできません。どこが間違っているか教えてもらえないでしょうか? #include<stdio.h> int main(void) { char h,i; printf("1つ目の文字を入力してください。\n"); scanf("%c",&h); printf("2つ目の文字を入力してください。\n"); scanf("%c",&i); printf("%c %c\n",h,i); printf("%c %c\n",i,h); return 0; } 実行結果が1文字めを入力すると2文字目の入力にならずに終了してしまいます。 ***実行結果*** 1つ目の文字を入力してください。 a 2つ目の文字を入力してください。 a a ********** おねがいします。