ポインタ変数について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
risa

ポインタ変数について

#1

投稿記事 by risa » 12年前

今暗号化のアルゴリズムを勉強したのですけど
ポインタ変数に文字列?を格納しているプログラムがあって
なぜそういうことができるのかが気になります
教えてください
例をあげます

コード:

char *p,*s="POIJ"
p=s;

nil
記事: 428
登録日時: 12年前

Re: ポインタ変数について

#2

投稿記事 by nil » 12年前

このような場合まずは

コード:

const char POIJ[5] = "POIJ";
のように定数が確保された後に
char型ポインタsにPOIJの先頭アドレスが渡されるため
配列と同じように振る舞うのです

box
記事: 2002
登録日時: 13年前

Re: ポインタ変数について

#3

投稿記事 by box » 12年前

涼雅 さんが書きました: 配列と同じように振る舞うのです
誤解を招きそうな言い回しかな?という気がします。

コード:

#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;
}
思ったとおりに動けばいいのですけれど。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 13年前

Re: ポインタ変数について

#4

投稿記事 by box » 12年前

box さんが書きました: 誤解を招きそうな言い回しかな?という気がします。
だから「const」って書いてあるじゃん、という(予想される)ご回答については、
では、何をもって「配列と同じように振る舞う」と書かれたのですか?と申しておきます。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

nil
記事: 428
登録日時: 12年前

Re: ポインタ変数について

#5

投稿記事 by nil » 12年前

セガ本の受け売りだったのですが
一部間違ったことを言っていたようです。

現状で自分の把握した点を書いておきます。

コード:

char a[] = "some thing"; // と
char* a = "some thing"; // の違い
についてですが、
まず上はa[1] ='a'のように配列の要素を書き換えることができる。
対して下はできない。

次にsizeof(a)とした時、
上では sizeof(char) * ( "some thing"の文字数=10 + nul文字=1 ) = 11となり、
下ではポインタのサイズ(環境によって異なる)になる。

また、双方とも添字を使って配列要素の値を取り出すことができる。
僕は先程、この部分だけを取り上げて、配列のように振る舞うと書きました。

誤解を招くような発言、申し訳ありませんでしたm(_ _)m。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: ポインタ変数について

#6

投稿記事 by ISLe » 12年前

文字列リテラルは配列「のようなもの」ではなくて配列です。
例えば "POIJ"[1] で 'O' を取得できます。

文字列リテラルを書き換えようとすると未定義の動作になります。
「できない」ではなく「どうなるか分からない」です。
ちなみにウィンドウズでは書き換えできます。
ただし同じ文字列リテラルを参照している他のコード部分に影響が出るか出ないかは状況によります。

コード:

char a[] = "some thing"; // と
char* a = "some thing"; // の違い
前者は、文字列リテラルを収めるのにちょうどの要素数を持つ配列を宣言し、その中身を文字列リテラルで初期化します。
つまり、文字列リテラルは別にあって、初期値としてコピーされます。
後者は、文字を指すためのポインタを宣言し、文字列リテラルの先頭を指すポインタ(アドレス)で初期化します。
こちらも、文字列リテラルはどこか別のところにある、という前提ですね。

risa

Re: ポインタ変数について

#7

投稿記事 by risa » 12年前

ありがとうございました
よくわかりました

閉鎖

“C言語何でも質問掲示板” へ戻る