これは単純ですが、char配列へのポインタはまだ私の頭を傷つけることがあります。 gccは4行目と5行目で "添え字付きの値が配列もポインタでもない"と、8行目と11行目で "unary *"の引数が無効であると不平を言っています。私は行4と5をブラケットを使って逆参照するように変更しましたが、それでも私が望むものを得ることはできません。Cポインタの混乱 - char配列へのポインタ
これはかなり単純な関数でなければなりません:あなたはsafe
とunsafe
の前にアスタリスクを必要としない
1 void makesafestr (const char *unsafe, const char *safe)
2 {
3 int offset=0;
4 for (; (*safe)[offset] != "\0" ; offset++) {
5 switch ((*unsafe)[offset]) {
6 case "\n":
7 case "\r":
8 *safe[offset] = "~";
9 break;
10 default:
11 *safe[offset] = *unsafe[offset];
12 }
13 offset++;
14 }
}
これは、あなたが '*'を必要としない理由です。 角括弧[]で囲まれた後置式は、配列オブジェクトの要素の添字 の指定です。添え字演算子[] の定義は、E1 [E2]は(*((E1)+(E2))と同じです)。 がバイナリ+演算子に適用される変換規則のために、E1が配列オブジェクト(つまり、配列オブジェクトの 初期要素へのポインタ)であり、E2が整数である場合、E1 [E2]はE2番目 E1の要素(ゼロから数えて)。 – Fred
うわー、それは複雑です。これは、ポインタがいつも逆参照されてから、添え字が追加されることを意味しますか?私は、コンパイラがポインタの配列であると仮定し、 '安全' + [オフセット]のアドレスを使用して、そのアドレスを逆参照することを心配しました。 –
いいえ 'a [i]'は '*(a + i)'と等価です。 'a + i'の* result *は逆参照されます(IOW、逆参照の前にオフセットが追加されます)。あなたが 'char(* safe)[]'( 'char'の配列へのポインタ)として' safe'を宣言していたならば、添え字を適用する前にポインタを逆参照する必要があります'* safe [i]'は、(* safe)[i] 'ではなく' *(safe [i]) 'として解析されます。問題)。 –