文字列とポインタ_2

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tomo.xxx
記事: 13
登録日時: 12年前

文字列とポインタ_2

#1

投稿記事 by tomo.xxx » 12年前

こんにちは
少し前から文字列とポインタがよくわからなくて復習し始めたtomo.xxxです。

また、勉強していてわからないことがあったので、どなたか教えていただけると幸いです。

コード:

#include <stdio.h>

int main(void)
{
  int i;
  char *str[3];

  str[0] = "qwertyu";
  str[1] = "asdfghj";
  str[2] = "zxcvbnm";

  for(i=0; i<3; i++){
    printf("%s %p\n", str[i], &str[i]);
  }

  return 0;
}

出力結果:
qwertyu 0x28ac50
asdfghj 0x28ac54
zxcvbnm 0x28ac58



このプログラムの出力結果のアドレスの差(例えば0x28ac50と0x28ac54)がなぜ4バイトなのかがよくわからないです。

僕はここは文字が7つとNULL文字をあわせて文字列の大きさは8バイトなので差は8バイトになるのでは?と思ったのですが、違うのでしょうか?

non
記事: 1097
登録日時: 14年前

Re: 文字列とポインタ_2

#2

投稿記事 by non » 12年前

tomo.xxxさんこんにちは。
お考えのように結果を得るには、
printf("%s %p\n", str, str);
とします。それでも、その差が、お考えのようになるとは限りませんが。

まず、char *str[3];
はポインタ(アドレスが入る箱)が連続して3つ取られます。
おそらくこのポインタのバイト数は4バイトです。
str[0] = "qwertyu"; のようにした場合、
"qwertyu"の文字列は、どこかに用意されます。どこに用意されたか知る方法が
最初に書いた方法です。
このアドレスがstr[0]に入ります。
tomo.xxxさんが行ったのは、&str[0]ですから、ポインタ変数が確保されたアドレスです。
non

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

Re: 文字列とポインタ_2

#3

投稿記事 by box » 12年前

このようなコードを実行してみると、ポインターのために必要な領域の大きさを
体感できるかもしれません。

コード:

#include <stdio.h>

int main(void)
{
    int i;
    char *str[3];

    str[0] = "qwertyuasdfghjklzxcvbnm1234567890";
    str[1] = "";
    str[2] = "zxc";

    for (i = 0; i < 3; i++) {
        printf("%s %p\n", str[i], &str[i]);
    }
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

フィア
記事: 82
登録日時: 12年前

Re: 文字列とポインタ_2

#4

投稿記事 by フィア » 12年前

<<
qwertyu 0x28ac50
asdfghj 0x28ac54
zxcvbnm 0x28ac58

このプログラムの出力結果のアドレスの差(例えば0x28ac50と0x28ac54)がなぜ4バイトなのかがよくわからないです。

僕はここは文字が7つとNULL文字をあわせて文字列の大きさは8バイトなので差は8バイトになるのでは?と思ったのですが、違うのでしょうか?

「文字列の範囲」を出力しているわけではなく、「ここから始めますよっという場所」を出力しているのですそのため何文字であろうが4バイトですよ

例題で言うなら

qから始めますよ
aからはじめますよ
zから始めますよ

ってところですね

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

Re: 文字列とポインタ_2

#5

投稿記事 by box » 12年前

ついでに、こんなコードも…。

コード:

#include <stdio.h>

int main(void)
{
    printf("sizeof(char *)   = %d\n", sizeof(char *));
    printf("sizeof(short *)  = %d\n", sizeof(short *));
    printf("sizeof(int *)    = %d\n", sizeof(int *));
    printf("sizeof(float *)  = %d\n", sizeof(float *));
    printf("sizeof(double *) = %d\n", sizeof(double *));
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

tomo.xxx
記事: 13
登録日時: 12年前

Re: 文字列とポインタ_2

#6

投稿記事 by tomo.xxx » 12年前

返信が遅れてすみません

boxさん、nonさん、フィアさん
ありがとうございます。

やはりまだまだ勉強不足のようです・・・
試行錯誤して頑張ってみます。

本当にありがとうございました。

閉鎖

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