アドレス - みる会図書館


検索対象: すぐわかるC/C++
21件見つかりました。

1. すぐわかるC/C++

プ . プ 2 , 大インタ ポインタを使うには , 他の変数同様に宣言が必要です . 宣言の仕方は , ほとんど普通の変数と同じですが , 変数名 ( ポインタ名 ) の前にアスタリスク * を付けます . この * は , 乗算を意味する演算子ではな ノ 0 ノ いので注意してください . 型 * ポインタ名 ; 土れし * po 土 n し x; char *pc : ・代入 そのホインタが記憶する変数の型を指定する ーポインタ point_x を宣 point-x は int 型変数のアドレスを記憶できる ・・ポインタ pc を宣言 pc は cha 「型変数のアドレスを記憶できる ポインタは , 他の変数のアドレスを記憶するので , 記憶したい変数の前に & を付けて代入します . ここで注意しなければならないのは , 変数のアドレ スを代入するときは , ポインタに * を付けないということです . pd = &d ・参照 ・・ポインタ pd に変数 d のアドレスを記憶 ポインタに * を付けないで式の中で使うと , 記憶している変数のアドレス を取り出すことができます . printf("%uYn", pd); 、、ポインタ pd が記憶している変数のアドレス が出力される この場合 , 変数 d のアドレスが出力される

2. すぐわかるC/C++

ノ 00 プ C& C + + ス門 実行例 & f &d &c 6 5 5 2 2 65522 65518 6 5 516 6 5 515 上の実行例の場合 , 各変数は次のようにメモリに割り当てられています . &s[O] と s のアドレスが同じ です . つまり配列の場合 , 0 番 目の要素のアドレス (&s[0]) と 変数名 (s) は , どちらも配列の 先頭アドレスを意味します . 1.5.2 節で s に 0 ] ではなく s と して使うと説明したのはこのた めです . printf の %s で文字列を 表示するときは , 文字配列の先 頭アドレスを渡さなければなら ないのです . s に 0 ] では , 20 番 目の値だけを渡すことになって しまいます . また , s [ 20 ] という 要素は存在しないので , 不定の 値を渡すことになってしまいま す . もちろん , サンプルプログ ラム 23 も s の代りに &s[0] と書 くことができます . 65515 65516 65517 65518 65519 65520 65521 65522 65523 65524 1 ハイト 2 ノヾイト 4 ノヾイト s [ 21 3 ノヾイト 7.123 ホインタ こからいよいよポインタの話になります . ポインタは , 変数の一種です . 他の変数と異なる点は , 数や文字といった データを記憶するのではなく , 変数のアドレスを記憶するということです . っ まり , 前節で説明した変数のアドレスをしまっておくための変数をポインタと いいます .

3. すぐわかるC/C++

ノの 65522 65525 65524 65523 1.124 値菠し ポインタ pd は d の先頭アドレス 100 を記憶 変数 d は 65524 を記憶 7. プ 2 ホインタ ポインタに * を付ける と , アドレスを代入した は d のアドレス ) . アドレスを示します (pd けないと代入した変数の の 100 を示す ) . * を付 示します (*pd は d の値 変数に記憶してある値を ところで , ポインタに変数のアドレスを記憶させても , あまり役に立ちそう もない気がしますが , 実は大変便利な使い道があるのです . 次に , ポインタ が活躍する場面を 1 つ紹介します . いま , 2 つの int 型変数の値を大きい順に並べる関数 change を作りたいと します . change は次のように使用します . 10 0 : nl 2 0 0 : れ 2 change ()l ′ n2 房 ・・ nl と n2 の値が交換される このようにして呼び出すと , n2 > nl なので , nl = 200 , n2 = 100 のように値 が交換されます . また次のような場合は , 最初から n1>n2 なので値は交換されません . nl 512 ー 2 5 6 ー Ⅱ 2 change ()l ー 02 房 いままでの知識から , ・ nl と n2 の値は交換されない この関数 change を作ると次のようになります .

4. すぐわかるC/C++

プ . プ 2 ポインタ .99 うに識別されます . この図では , 変数 x が 6 番地と 7 番 地の 2 バイト分のメモリを使用してい ます . ある変数が複数のメモリを使う とき , その先頭番地がその変数のアド レスになります . ですからこの場合 , 変数 x のアドレスは 6 番地になります . プログラムの中で変数 x のアドレス を知るにはどうしたらよいでしよう ? 変数名の前にアドレス演算子 & を 付けると , その変数の値ではなく , 変 数の先頭番地を意味するようになりま す . この番地を printf の %u で出力さ せることができます . ス レ 」トー 0 ・ 1- つ」っ ) 4- 広 ) ( 0 「 / 8 ア 1 つ 1 ・プ ) メモリは 1 ノヾイトの 大きさをもつ X 。 X 変数 X * 厳密にいうとでアドレスを %u て出力できるのは , nearifi インタ ( たとえはタイ二一モテルま たはスモールモテルでコンノヾイルした場合 ) です (Turbo C + + や Quick C, MS-C なとの場合 ) . 次のプログラムは , 各変数のアドレスを出力させています . サンプルプログラム 46 #include く s し d 土 0 . h > main() char s [ 3 ] : floa し 土 n d : char C : printf("&s[O] printf( ・ printf("&f printf ("&d printf ( return 0; %u Y n " %u Y n " %u Y n ” %u Y n ”

5. すぐわかるC/C++

708 プ C & C + + ス門 ・文字列の引数 いま引数として文字列を受け取りたい関数があるとします . func(char *s) func(char s[]) のいずれかの書き方をします . その場合 , 次 文字列変数は , 文字配列で表現されました . ですから文字列引数としては chars[10] のような書き方をするように見えます . しかし , 実際は , ( 1 ) のよ うに受け取る配列の大きさを書きません . というのは , C では配列データそのものを引数にすることができないからで す . 引数として使えるのは , 配列の先頭アドレスだけです . ということは , ポインタを使うということです . たとえば char name [ ] "Computer" のような配列があった場合 , これを引数にするには次のようにします . fn (name) : 配列名だけを書くと , その配列の先頭要素のアドレスになることを思い出 してください . 文字列定数を直接指定する場合は , どうでしよう ? func ( "Computer" ) 冫 この場合もポインタが渡されます . というのは , 文字列を " " で囲んだ文字 列定数は , 実際はその先頭アドレスとして処理されるからです . このように配列や文字列は , ポインタとして引数が渡されます . ですからそれ を受け取る関数の方も ( 1 ) または ( 2 ) のような書き方をします . ( 1 ) も ( 2 ) も同じ意味になりますが , 本書では②の書式を使って説明していきます . ・文字列の戻り値 また , 関数が戻り値として文字列を返す場合も , 次のようにポインタを使 って関数を宣言します . char * func ( 引数の並び )

6. すぐわかるC/C++

70 / main() 土 n し n1 2 0 0 : 10 0 ′ n2 printf("nl, n2 の最初の値 change ( &nl ′ &n2 ) : printf ( " change 実行後の値 宅 d ′ %dYn" %dYn" nl ′ nl ′ れプ 2 ポインタ n2 房 n2 ) : return 0 ー 実行例 nl ′ n2 の最初の値 change 実行後の値 10 0 ′ 2 0 0 ′ 2 0 0 10 0 今度はうまく入れ代わりました . か , もう一度確認してみましよう . ではなぜ , ポインタを使うとうまくいくの 1. 12. 3 節でも説明したように , ポインタに * を付けるとアドレスを代入し た変数の値を示します . つまり , 仮引数 x , y に * を付けて値を変化させると , 実引数 nl, n2 の値そのものを変化させることになります . ここで , * を付け ないで x , y を変化させると , nl , n2 のアドレスを変化させることになってしま います . このように , 関数の引数に実引数のアドレスを渡すことを引数の参照渡し といいます . 引数の参照渡しでは , 関数の中で実引数の値を変更することが れ 126 文字列引数と文字列の戻リ値 できます . ですから , 前節までをしつかりと頭に入れてから次を読んでください . 文字列とポインタとは関係なさそうに思えますが , おおいに関係があります . の引数や戻り値に文字列を使う方法について説明します . ポインタの基本的な使い方がわかったところで , おあずけになっていた関数

7. すぐわかるC/C++

26 ホインタ配列 上記のように宣言すると , たとえば配列の中身は次のようになっています . ノ 37 ps [ 0 ] "Pasca1" こで間題です . sizeof(ps[0]) はいくつになるか ? "PascaI" は 6 文字ですが , 最後に洋伊がつくので 7 文字あります . " 答えは 7 " とはりきって答えた人はもう一度ポインタのところを読んでください ( 1. 12.3 節 ) . 正解は 2 ( ラージモデルを使えば 4 ) です . ps[01 はポインタだということ を忘れましたか ? ポインタとは , 文字列そのものを記憶しているのではなく , 文字列の先頭アドレスを記憶しているのです . この場合 ps[01 は , "Pascal" の先頭アドレスを記憶しています . つまり , ps[01 は 2 バイトになります ( 1. 12.3 節の図 ) . ついでにいうと sizeof(ps) = になります . これは , 配列全体の大きさ ( 1.12.1 節参照 ) を調べているため , 2X3 で 6 になります . また , 配列の要素数を求めたければ , 次のように計算 では , 以上のことを確かめるサンカレプログラムを , 次に示します . sizeof(ps) / sizeof(ps[0]) できます .

8. すぐわかるC/C++

ノ 06 ・ 7 C& C + + ス円 レスがわかれば , * x , * y を使って実引数 nl , n2 の値を変えることができます . これで仮引数 x, y は , 実引数 nl, n2 のアドレスを知ることができます . アド ポインタ void change(int *x, int *y) ら , 仮引数をポインタにしなければなりません . 呼び出される側の関数定義では , 実引数のアドレスを受け取るわけですか いるかどうか , 次のプログラムで確かめてみましよう . サンプルプログラム 48 をポインタ引数に書き換え , 実引数の値が変わって こうすれば , 実引数の nl と n2 の値も変わります . temp 土 f ( *x く *y ) { サンプレプログラム 49 #include く stdio . h> VOid change (int *x, 土 n し temp : 土 f ( *x く *y ) { temp Y : X *y = temp; 土 n し *y)

9. すぐわかるC/C++

-98 7 C& C + + ス門 次のプログラムで , 各データ型のバイト数を調べてみましよう . サンプルプログラム 45 #include <stdio . h> main() 土 n し n [ 3 ] : printf ( " char printf ( " 土 n し printf ( " floa し printf("sizeof(n[0]) printf("sizeof(n) return 0 : %dYn" %dYn" %dYn" %dYn" s 土 z e 0 f ( char ) 房 sizeof(int) ) : s 土 z e 0 f ( f 1 oa し ) 房 s 土 zeo f ( n [ 0 ] ) ) : sizeof(n)); 実行例 char 土 n し floa に s 土 z eo f ( n [ 0 ] ) sizeof(n) これで各データ型が使用するバイト数が分かったと思います . 最後の 2 つは , 配列の大きさを調べています . sizeof(n[0]) のように個々の 配列要素を指定すると , 配列要素 1 っ分の大きさが分かります . n は int の配 列なので , 1 つ 1 つの配列要素のサイズは int と同じ 2 バイトになります . また , sizeof(n) のように配列名だけを指定すると , 配列全体の大きさが分 かります . 1 つ 1 つの大きさが 2 ノヾイトの配列が 3 つあるのだから , 2 x 3 で 6 になるわけです . 1 亠っ乙 4- つる 1.122 変第のアドレス 個々のメモリは , アドレスという 0 から始まる連番で区別されます . アド レスとは , 住所のことです . 住所がわからないと郵便を届けることができませ ん . 同じようにメモリのアドレスがわからなければ , コンビュータがメモリを 特定することができません . ですから各メモリは "xxxx 番地のメモリ " のよ

10. すぐわかるC/C++

ノの change(nt, れ 2 ) ; プ . プ 2 ホインタ ◆ -- ーー・一一一イどし勃渡される change(int x, int y); ←ー義 C では , 呼び出し側の引数 ( これを実引数という ) と受け取り側の引数 VOid では , このように 2 つ以上の引数の値を変化させたいときは , どうするので しかし , return 文で返せるのは 1 つの値だけです . せん . return 文で仮引数の値を返し , 実引数で受け取れば値は変わります . このため , 関数内部で仮引数の値を変化させても , 実引数の値は変わりま 数へその値が渡される ( コピーされる ) だけです . ( これを仮引数という ) は別の変数として扱われます . ただ , 実引数から仮引 1.125 参照菠し しようか ? それを次で説明します . アドレスを渡す change(&nl, &n2); まず , 関数呼び出し側では , 実引数のアドレスを渡すようにします . きます . やり方は , 次のようにします . 引数にポインタを使うと , 呼び出し側の実引数の値を変更させることがで