C/C++関連のメモ

intやfloatを1byteごとに分割してchar配列に代入

参考 http://www.geocities.jp/neo_ku_ron/HP_NEW/PGTip/UN_BitTypeConvert/UN_BitTypeConvert.html
http://www.host.or.jp/cgi-win/webboard/wb_cont.exe?programing+g+10391+NAME

整数型はビットをシフトしてキャストすれば変換できたが、浮動小数点型はできませんでした。ということで下のやりかた。

ビットシフト

int n=10;
char c[4];

// intをcharに分解
c[0] = n;
c[1] = n>>8;
c[2] = n>>16;
c[3] = n>>24;
// 参考ページではunsigned charでキャストしてるがHEXで分解するので必要ないと思われる。溢れるんだろうか?と思って実行したけどmbedのオンラインコンパイラでは溢れなかった。

//charをintに結合
//こっちも上と同じ理由でキャスト外してる。
int readN=( (c[0]) | (c[1]<<8) | (c[2]<<16) | (c[3]<<24) );

union(共用体)

union UNI_TEST_T{
    float a;
    char b[4];
} test;

test.a=123.456;
//上記でtest.bからchar配列としてaにアクセスできる

ポインターのキャスト

float a;
char* b;

b=(char*)&a; 
//で、aに値を代入すればb[]でアクセスできる

配列へのポインタ

http://enakai00.hatenablog.com/entry/20110808/1312783316

char (*ptr)[10]; //char[10]配列へのポインタ
char *ptr[10]; //charポインタの配列

配列へのポインターを使って中の要素にアクセスする

char buf[10][2];
char (*ptr)[10];
ptr=buf;

(*ptr)[1]=0;  //これでbuf[0][1]へ0を代入できる。
(*ptr[0])[1]=0; // これは上記と同義
*ptr[1]=0; //これだとbuf[1][0]へ0を代入することになる。ややこしい

アドレスをprintfる

int a=10;
printf("アドレスは%pです\n", &a);

配列へのポインタを関数に渡す

参考
http://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/prog1/11-03.html

// 引数に配列へのポインタをとる関数
void func(char *buf)
{
    //buf[]で普通にアクセスできる
}

int main()
{
    char buf[4];
    func(buf);
}


Please log in to post comments.