ポインタ変数
ポインタ変数は、ある変数の内容が格納されているメモリ空間のアドレスを格納する変数です。つまりポインタに入れるものはデータではなくデータのアドレスです。
アドレスを指定してデータをやりとりしたり、通常であればアクセスできない様々な変数へ配列としてショートカットを作り、連続してアクセスし処理するなどして使うと便利です。
使用例
変数を宣言する際に変数の前に「*」を付ける事でポインタ変数として宣言出来ます。変数の型とセットで宣言する必要があります。
試しにこのプログラムを実行すると、
○ポインタ変数にデータ変数のアドレスを取得
○ポインタ変数自体を複製
○ポインタ変数に格納されたアドレスによって参照される変数の値を変更
○ポインタ変数に格納されたアドレスによって参照される変数の値で計算
が実行され図1の様に出力されます。
void setup() { Serial.begin(9600); //9600bpsでシリアルポートを開く } void loop() { int A = 1, B = 0; //int型変数A,Bを宣言してそれぞれ1,0を格納 int *P1, *P2; //ポインタ変数の宣言の仕方その1(参考) int* P[] = {NULL, NULL}; //ポインタ変数の宣言の仕方その2(以下使用) P[0] = &A; //int型変数Aの前に"&"を付けるとAのアドレスを返しポインタ変数P[0]に格納 Serial.println((int)P[0]); //ポインタ変数P[0]に格納されたアドレスをシリアル出力可能なint型にして出力 P[1] = P[0]; //ポインタ変数P[0]のアドレスをポインタ変数P[1]にコピー可能 Serial.println(A); //int型変数Aをシリアル出力 *P[1] = 2; //ポインタ変数P[1]の前に"*"を付けるとint型変数Aにアクセス出来2を格納 Serial.println(A); //int型変数Aをシリアル出力 B = *P[1] + 1; //int型変数Bに*P[1](int型変数A)に1を足した数を格納 Serial.println(B); //int型変数Bをシリアル出力 delay(3000); //3秒待つ }
図1:プログラム例
ポインタ変数のパラメータ
int *P1 : ポインタ変数の宣言
&A : 変数Aのアドレスを返しポインタに格納される
&A : 変数Aのアドレスを返しポインタに格納される
*P[1] : ポインタ変数に格納されているアドレスの変数の値
NULL : ポインタ変数も宣言した直後はデタラメな値が代入されおり、アドレスを代入したかを区別する必要があります。NULLもしくは0をポインタ変数に代入しておけば、ヌルポインタが代入されアドレスが代入されていないことを示せます。
図1:シリアルモニター出力結果
ポインタ変数の応用1
液晶ディスプレイに大量の文章を表示するようなときは、文字列の配列を使うと便利です。文字列それ自体が配列なので、2次元配列となります。
表1:二次元配列の例1
char* A={"string1", "string2","string3", "string4"};
void setup() {Serial.begin(9600);}
void loop(){for (int i = 0; i < 4; i++){Serial.println(A[i]);}}
ポインタ変数の応用2
自分の中では一番ポインタ変数の有難味を感じた使い方はコチラ。
ポインタ変数の配列に、様々な変数のアドレスを登録しておけば、配列になっていない変数同士をあたかも配列の変数の様にfor文などで扱うことが出来ます。
表2:二次元配列の例2
int I=1,J=2,K=3,L=4,M=5,N=6;
int* A={&I,&J,&K,&L,&M,&N};
void setup() {Serial.begin(9600);}
void loop(){for (int i = 0; i <= 5; i++){Serial.println(*A[i]);}}
ポインタ変数は難解な所が有りますが、今まで出来なかった事が出来る様になる魔法の変数です
励みになりますのでよければクリック下さい(^o^)/