変数とポインタについて
最終更新日:2004-06-16.
今回は、変数とポインタについてちょっと。
ポインタ変数は、変数のアドレスを記憶する変数です。
この表現ではちょっとわかりにくいかもしれませんね。
例えば。
文字型配列に文字列が格納されているとします。
その中から任意の文字や文字列を検索するとき、
該当の文字や文字列が見つかった場合その変数のアドレスを
返すことでうまく処理できます。
また、関数間でデータの受け渡しをするとき、
その変数の値を使用するときとその変数のアドレスをやりとりする
場合とがあります。
これはそのときどきに応じて使い分けると便利です。
・ポインタ変数
ポインタとは、指し示すというような意味とのこと。
ポインタ変数は、通常の変数のアドレスを格納する変数です。
このポインタを使うと、変数のアドレスやその内容をうまく参照したり
処理したりできます。
int i;
これは、int型の変数iを宣言しています。
メモリ上に、これに対応した領域が確保されます。
「&i」によって変数iのアドレスが参照できます。
int *ip;
これは、int型のポインタ変数ipを宣言しています。
このポインタ変数は、int型の変数のアドレスを記憶します。
ip=&i;
これは、変数iのアドレス「&i」をipに代入しています。
変数のアドレスを参照したり利用するときに便利です。
*ip=i;
「*ip」は、ポインタ変数が記憶している変数の値です。
ポインタ変数は、変数のアドレスも、変数の値も参照したり処理したり
できます。
これらは、必要に応じて利用すると便利です。
・文字型変数とポインタ変数。
文字型の変数も上記と同じように使用できます。
char c='Z';
char *cp=&c;
また、文字列を処理する際、文字型配列を使用します。
ここでポインタを使うと、とても処理が楽になることもあります。
char word[6]="Japan";
char *p=&word[0];
文字型配列「word」にはJapanが代入されています。
ポインタ変数「p」は変数のアドレス「&word[0]」を記憶しています。
このようなとき、ポインタ変数pをうまく使うことで、文字配列
wordの値やアドレスを容易に参照したり処理したりできます。
では、それらをソースで見てみましょう。
+------------------------------------------------------------+
/* filename=no011-1.c */
/* include */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* main */
int main( )
{
char line[128];
char address[128];
char *p, *q;
int i;
/* 基本の文字列 */
strcpy(line, "yahooのURLはhttp://www.yahoo.co.jp/です。");
/* URL部分を調べる */
p=strstr(line, "http://");
q=strchr(p+7, '/');
/* 検索がヒットしない */
if( (p==(char *)NULL) || (q==(char *)NULL) )
exit(1);
/* 文字列の長さ */
i=(q-p+1);
/* 結果をコピー */
strncpy(address, p, i);
address[i]='\0';
printf("line=%s\n", line);
printf("address=%s\n", address);
return 0;/* 終了 */
}
+------------------------------------------------------------+
上記のソースをコンパイルして実行すると以下のように表示されました。
line=yahooのURLはhttp://www.yahoo.co.jp/です。
address=http://www.yahoo.co.jp/
戻る