• 締切済み

ポインタの宿題が解けません。

asuncionの回答

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.1

char *p; int *q; で、仮に、これらの変数の値が p == 0x0022FF47 q == 0x0022FF40 であるならば、 printf("%x\n", *p); printf("%x\n", *q); あたりのコードを追加すると、 0x0022FF47で始まる領域や 0x0022FF40で始まる領域に 何が入っているかがわかるのではないかと思います。

関連するQ&A

  • void型へのポインタ

    というのがC言語にありますよね? このvoid型へのポインタというのは、 どのようにイメージすればいいのでしょうか? 例えばchar型へのポインタなら、 指している領域は 1バイトの領域ですよね? ではvoid型は? また malloc関数を 使って char *p; p=(char *)malloc(1000); とするとでchar型にキャストしているから、 1個1バイト分の領域が1000個用意して、 先頭アドレスをpに格納するのですよね? では、 int *q; q=(int *)malloc(1000); としたら、用意されるのは、int型にキャストしているから 1個2バイト分の領域が500個用意されるのでしょうか? お願いします。

  • char (*data)[10] のようなポインタの使い方教えてください

    char (*data)[10]; のようのポインタの使い方がよくわからないので, 詳しい方いたら,教えてください. void main (){ char (*data)[10]; data = ????;//newを使ってメモリを確保したい for (int i = 0; i < ????; i++){ for (int j = 0; j < 10; j++){ data[i][j] = 何かデータ; } } //最終的にはこんな風に使いたいと思っています. } このような感じで new を使ってメモリの領域を確保したいのですが, どうもうまくいきません. data = new char[3]; data = new char*[3]; など,いろいろ試したのですが,だめでした. 使用しているOSはwindowsXPでvisual studio 2005を使ってプログラムをコンパイルしています. わかる方いたら,よろしくお願いします.

  • コマンドライン引数 *argv[]はなぜポインタ?

    C言語初心者です。 コマンドライン引数、 int main(int argc, char *argv[]) というのを最近勉強しましたが、引数2番目がポインタになっている理由について、 どなたか教えて下さい。 そういう仕様なんだから、それに従いましょう、ということでしょうか? int main(int argc, char argv[]) では、ダメなのでしょうか? このポインタでの引数渡しについて、 なんらかの納得のいく考え方をご存知の方がいらしたら、教えて下さい。 宜しくお願い致します。

  • ポインタについて

    C言語のポインタの宣言の仕方についての質問です。お詳しい方どうかご回答よろしくお願いいたします。 (1)char *p; (2)char* p; 上記2つの宣言はどう違うのでしょうか??(同じものなのでしょうか??)メモリの確保の仕方などに違いがあるのでしょうか?? また、この両者はどのように使い分ければ良いかなどお教えください。 よろしくお願いいたします。

  • ポインタ変数とポインタのポインタ

    ポインタ変数の宣言 char *a[]; をしたとき僕の中では a[0],a[1]...という、ある文字列A,B,C...の最初のアドレスを指すポインタが、配列になっているものを宣言していると理解していました。 しかしこの次に、ポインタのポインタが出てきました。僕はこれを、 ある変数を指し示すアドレスのアドレスである、と理解しました。 この2つは1つめはいくつかのアドレスを指し示すもの、2つ目は1つのアドレスを指し示すものであるとして、僕の中で異なったものであると理解していましたが、参考書「C標準コースウェア」によると プログラムにおいて、関数でポインタ配列を受け取るときchar *p[]はchar **pとしてもよい と書かれており、またその実例として、 (9-5) #include <stdio.h> void disp (char *p[],int n){ int i; for (i= 1;i<n;i++){ printf("%s\n",p[i]); } } int main(void){ char *girl[] = {"Arica","Candy","Lisa"}; disp (girl,sizeof(girl)/sizeof(girl[0])); return 0; } というプログラムが書かれていました。 ここで一気に訳が分からなくなりました。 char *girl[] = {"Arica","Candy","Lisa"}; と宣言されているため、 girl[0]はAricaという文字列の最初のアドレスを指すポインタ、 *girl[0]はAricaという文字列を直接指し示していると解釈しています。 girlは{"Arica","Candy","Lisa"}という文字列の配列の最初のアドレスを指し示していると考えました。 sizeof(girl)を使った時に不思議なのですが、 girlはどのように配列の終わりを理解しているのでしょうか? (配列の要素数を渡していない点が不思議です。) また、 disp側が受け取ったのは*girl[]であり、いくつかのポインタの配列ですが、渡したものはgirlという要素数がないポインタ1つだけです。 そして最初の疑問が出てくるわけですが、*p[]を**pと書きかえてみると、 文字列のアドレスを示すgirlという名の1つのポインタを渡すと、pという名のポインタのポインタで受け取るというのも、よくわからなくなっています。 おそらくポインタ配列に対する理解がどこかでずれているようですが、自分でどこがわからないのかわからなくなっています。 どうかご教授ください。

  • 関数へのポインタ

    超初心者です。 C言語を使ってsin波を生成して音を鳴らそうとしているのですが・・ネットで調べてもよくワカリマセン・・ 超初心者な私でも理解できるようなサイトを教えて下さい. また、関数へのポインタも勉強しているのですが, char *(*func)(void); といったchar 型へのポインタを返す関数へのポインタというのがあったとして,関数へのポインタは理解できたのですがさらにchar 型へのポインタとなると一体これが何を指しているのかさっぱりで・・・・ ご協力お願いします.

  • 続ポインタによる関数への配列渡し

    連続での質問すみません。 林晴比古さんの「新C言語入門」で勉強している初心者です。 ポインタを勉強中で、色々な例文をポインタで書けるかどうか 試しております。 上書P199に「安全な数値入力を行うプログラム」が出ています。 これは入力時問題点を抱えるscanfに入力させるのでなくchar型に入力させ、 それをint型に変換して出力するという内容で、案内メッセージも関数内で表示することになっています。 以下そのプログラムを引用します。 #include <stdio.h> #include <stdlib.h> int getint(char msg[]); int main(void) { int n; n = getint("数値を入力してください:"); printf("入力した数値=%d\n",n); return 0; } int getint(char msg[]) { char ss[80]; printf("%s",msg); gets(ss); return atoi(ss); } (以上林晴比古氏「新C言語入門」P199より引用) これをポインタによって書き換えようとしているのですがうまくいきません。 「本引数として主文でint型のnを設定し、それを関数側のchar型のssをポインタにして 仮引数として受け取れば、最後にreturnで返さなくても、参照できるのでないか」 と思い色々試してみましたがうまくいきません。 どうもコンパイルのエラーを確認すると型が違うので駄目なようです。 なるほどそれはそうでした… それ以外の方法も色々試してみましたが、結局うまくいきませんでした。 どのようにすればポインタでは上の文章を表現できるのでしょうか。 (あるいは表現出来ないのでしょうか) お分かりの方、よろしくお願いします。

  • ポインタ

    ポインタの勉強をはじめたばかりの者なのですが、たとえば int *p などでポインタを宣言する場合には、メモリ上で変数pにはアドレスを格納するだけの領域が与えられます、このとき何バイトの領域が与えられるのでしょうか?

  • ポインタと型のサイズに関する、初歩的な質問

    ポインタと型のサイズについて、実験しています。 以下のプログラムを実行したときに、さらに下の 画面表示になるのですが、ここで疑問があります。 int型の配列を作ってそのポインタを表示しています。 i[0]のポインタ=0012FF38 i[1]のポインタ=0012FF3C 0012FF38 と 0012FF3C の間は16ビットなのに、 int型のサイズは4バイトとなってしまいます。 なぜでしょうか。 -------------プログラムここから-------------- #include <iostream> using namespace std; int main(){ int i[20]; for(int j = 0;j<20;j++){ printf("i[%d]のポインタ=%p\n",j, &i[j]); } printf("\n\nsizeof(int) = %d\n\n", sizeof(int)); return 0; } -------------プログラムここまで-------------- -------------画面出力ここから-------------- i[0]のポインタ=0012FF38 i[1]のポインタ=0012FF3C i[2]のポインタ=0012FF40 i[3]のポインタ=0012FF44 i[4]のポインタ=0012FF48 i[5]のポインタ=0012FF4C i[6]のポインタ=0012FF50 i[7]のポインタ=0012FF54 i[8]のポインタ=0012FF58 i[9]のポインタ=0012FF5C i[10]のポインタ=0012FF60 i[11]のポインタ=0012FF64 i[12]のポインタ=0012FF68 i[13]のポインタ=0012FF6C i[14]のポインタ=0012FF70 i[15]のポインタ=0012FF74 i[16]のポインタ=0012FF78 i[17]のポインタ=0012FF7C i[18]のポインタ=0012FF80 i[19]のポインタ=0012FF84 sizeof(int) = 4 -------------画面出力ここまで--------------

  • ポインタで分からないことがあります。

    つい最近C言語の勉強を始め、現在ポインタの勉強をしています。 過去の質問を検索したり、サイトを見てみましたが、一人の力では解決できませんでしたので質問させていただきます。 ポインタのプログラムで、下記のプログラムについて分からないことがありました。 ――――――――――――――――――――――――――――――――― #include <stdio.h> int main (void) { char *str = "abc"; printf ("%s %d %d\n", str, &str, &(*str)); str = "日本語"; printf ("%s %d %d\n", str, &str, &(*str)); return 0; } ――――――――――――――――――――――――――――――――― このプログラムで、「char *str = "abc";」の部分でstrには abcのアドレスが入っていると思っていたのですが、 1度目の「printf ("%s %d %d\n", str, &str, &(*str));」で、 結果が「abc 1245064 4235560」となっているのを見ると 私の見解は間違っている気がします。 「char *str = "abc";」の部分では一体なにが行われているのでしょうか? また、このプログラムをコンパイルして実行した結果が、 abc 1245064 4235560 日本語 1245064 4235574 となったのですが、なぜstrのアドレスは同じなのに、 &(*str)のアドレスは異なるのでしょうか? 質問をまとめますと、以下の2つです。 1.「char *str = "abc";」の部分では一体なにが行われているのでしょうか? 2.「abc」と「日本語」のstrのアドレスは同じなのに、&(*str)のアドレスは異なるのでしょうか? 初心者ですので言葉の足らない部分があるかもしれませんが、ご教授のほどよろしくおねがいします。