ページ 1 / 1
ポインタ変数について
Posted: 2012年8月09日(木) 20:15
by risa
今暗号化のアルゴリズムを勉強したのですけど
ポインタ変数に文字列?を格納しているプログラムがあって
なぜそういうことができるのかが気になります
教えてください
例をあげます
コード:
char *p,*s="POIJ"
p=s;
Re: ポインタ変数について
Posted: 2012年8月09日(木) 20:31
by nil
このような場合まずは
コード:
const char POIJ[5] = "POIJ";
のように定数が確保された後に
char型ポインタsにPOIJの先頭アドレスが渡されるため
配列と同じように振る舞うのです
Re: ポインタ変数について
Posted: 2012年8月09日(木) 21:35
by box
涼雅 さんが書きました:
配列と同じように振る舞うのです
誤解を招きそうな言い回しかな?という気がします。
コード:
#include <stdio.h>
int main(void)
{
char *p, *s = "POIJ";
p = s;
printf("%s\n", p);
p[1] = 'X';
printf("%s\n", p);
return 0;
}
思ったとおりに動けばいいのですけれど。
Re: ポインタ変数について
Posted: 2012年8月09日(木) 21:45
by box
box さんが書きました:
誤解を招きそうな言い回しかな?という気がします。
だから「const」って書いてあるじゃん、という(予想される)ご回答については、
では、何をもって「配列と同じように振る舞う」と書かれたのですか?と申しておきます。
Re: ポインタ変数について
Posted: 2012年8月09日(木) 22:29
by nil
セガ本の受け売りだったのですが
一部間違ったことを言っていたようです。
現状で自分の把握した点を書いておきます。
コード:
char a[] = "some thing"; // と
char* a = "some thing"; // の違い
についてですが、
まず上はa[1] ='a'のように配列の要素を書き換えることができる。
対して下はできない。
次にsizeof(a)とした時、
上では sizeof(char) * ( "some thing"の文字数=10 + nul文字=1 ) = 11となり、
下ではポインタのサイズ(環境によって異なる)になる。
また、双方とも添字を使って配列要素の値を取り出すことができる。
僕は先程、この部分だけを取り上げて、配列のように振る舞うと書きました。
誤解を招くような発言、申し訳ありませんでしたm(_ _)m。
Re: ポインタ変数について
Posted: 2012年8月10日(金) 16:58
by ISLe
文字列リテラルは配列「のようなもの」ではなくて配列です。
例えば "POIJ"[1] で 'O' を取得できます。
文字列リテラルを書き換えようとすると未定義の動作になります。
「できない」ではなく「どうなるか分からない」です。
ちなみにウィンドウズでは書き換えできます。
ただし同じ文字列リテラルを参照している他のコード部分に影響が出るか出ないかは状況によります。
コード:
char a[] = "some thing"; // と
char* a = "some thing"; // の違い
前者は、文字列リテラルを収めるのにちょうどの要素数を持つ配列を宣言し、その中身を文字列リテラルで初期化します。
つまり、文字列リテラルは別にあって、初期値としてコピーされます。
後者は、文字を指すためのポインタを宣言し、文字列リテラルの先頭を指すポインタ(アドレス)で初期化します。
こちらも、文字列リテラルはどこか別のところにある、という前提ですね。
Re: ポインタ変数について
Posted: 2012年8月11日(土) 00:58
by risa
ありがとうございました
よくわかりました