ページ 11

文字列とポインタ_2

Posted: 2013年2月25日(月) 17:44
by tomo.xxx
こんにちは
少し前から文字列とポインタがよくわからなくて復習し始めた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バイトになるのでは?と思ったのですが、違うのでしょうか?

Re: 文字列とポインタ_2

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

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

Re: 文字列とポインタ_2

Posted: 2013年2月25日(月) 20:15
by box
このようなコードを実行してみると、ポインターのために必要な領域の大きさを
体感できるかもしれません。

コード:

#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;
}

Re: 文字列とポインタ_2

Posted: 2013年2月25日(月) 20:45
by フィア
<<
qwertyu 0x28ac50
asdfghj 0x28ac54
zxcvbnm 0x28ac58

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

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

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

例題で言うなら

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

ってところですね

Re: 文字列とポインタ_2

Posted: 2013年2月25日(月) 21:00
by box
ついでに、こんなコードも…。

コード:

#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;
}

Re: 文字列とポインタ_2

Posted: 2013年3月01日(金) 01:24
by tomo.xxx
返信が遅れてすみません

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

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

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