2012-01-18 6 views
1

gccがchar *(例えば "STRING")とchar(例えば 'C')をポインタとして追加する理由は何ですか?gccがchar *とcharを生ポインタ( "str" + "c")として追加する

const char *ccc = "Test1"; 
    const char t = 'T'; 
    const char *res = ccc + t; 
    printf("%s, %p, %d, %p\n", res, ccc, t, res); 

出力

, 0x8048d97, 84, 0x8048deb 

私はあなたが文書化、標準仕様、または製品を指すことができ、意味ですか?この動作を制御または無効にすることはできますか?

UPD:なぜ私が尋ねると、どのような予想外では、コンパイラは適切な演算子+を見つけることができないとき

(char*)CString() + (char)char_var 

として

CString() + 'c' 

作品ということです。自動連結を無効にして、そのような場所を(レガシーコードで)見つけることは多分考えました。しかし、ほとんどの場合、私はその動作の正確な文書を探したいと思っていました。

+0

なぜこの動作を制御または無効にしますか?あなたはこれが何をすると思いますか? –

+0

'strcat'がここで使われているかもしれません。 –

+2

これはCとC++がポインタを扱う方法です。演算子のオーバーロードが必要な場合は、 'std :: string'を使用してください。実際には、 'std :: string'を使ってください! –

答えて

3

ccc + tでは、tは整数として扱われます。正味の効果は、rescccに84バイトを加えたもので、84はASCIIコード'T'です。

ccc + tは、純粋にポインタ上で動作し、実際の文字列には触れないことを指摘する価値があります。 "Test" + 'T'かもしれないの文字列に付加されていると予想される場合には、これを言っています。

1

ポインタ演算と呼ばれます。たとえば、ptr + x&ptr[x]に相当します。

1

Cには文字列がありません。 Cには配列とポインタがあります。

アレイの初期化子{ 'T', 'e', 's', 't', '1', 0x00 }の場合、「文字列定数」をという構文砂糖と考える必要があります。

Cにも文字がありません。 Cは小さい(通常8ビットの)整数を持ちます。

あなたは(ASCIIと仮定)数値定数0x54ため'T'としてシンタックスシュガー「文字定数」を考える必要があります。

あなたは

const char *ccc = /* whatever */; 
char t = /* whatever */; 
const char *res = ccc + t; 

を書くときですから、ポインタに小さな正の整数を追加しています。それ以上はない。

私はあなたがしたいことをする方法についてのアドバイスを提供しますが、それは退屈で冗長であり、ポイントから気を散らすでしょう。 C++はまあまあまあの文字列クラスを持っています、あなたはおそらくそれを学ぶだけで幸せになるでしょう。

+0

"Cには文字列がありません"なぜC標準は*文字列*を "文字列は最初のヌル文字で終わって連続する文字列"と定義していると思いますか? – ouah

+1

もちろん、標準は、私が言及した配列初期化子の構文的な砂糖の解釈を定義しています。同じ規則を使用し、定義も必要な標準ライブラリ関数がたくさんあります。そこから実際にその言語でファーストクラスの文字列型を持つまでは、長い道のりです。 – zwol

関連する問題