タグ付けされた質問 「pointer-arithmetic」

18
配列の場合、なぜa [5] == 5 [a]になるのですか?
Joel がCプログラミング言語(別名:K&R)のStack Overflowポッドキャスト#34で指摘しているように、Cでは配列のこのプロパティについて言及されています。a[5] == 5[a] ジョエルは、それはポインター演算のせいだと言いますが、私はまだ理解していません。なぜa[5] == 5[a]ですか?

8
Cのvoidポインターのポインター演算
特定の型へのポインタを(言うときint、char、float、...)がインクリメントされ、その値はそのデータ型のサイズだけ増加されます。voidサイズのデータ​​を指すポインターxがインクリメントされた場合、xバイト先をどのように指すのですか?コンパイラーxは、ポインターの値に追加することをどのようにして知っていますか?

3
このコードは、sizeof()を使用せずに配列サイズをどのように決定するのですか?
Cのインタビューの質問をたどると、「sizeof演算子を使用せずにCで配列のサイズを見つける方法は?」という質問があり、次の解決策が見つかりました。動作しますが、理由はわかりません。 #include <stdio.h> int main() { int a[] = {100, 200, 300, 400, 500}; int size = 0; size = *(&a + 1) - a; printf("%d\n", size); return 0; } 予想通り、5を返します。 編集:人々はこの答えを指摘しましたが、構文は少し異なります、すなわちインデックス方法 size = (&arr)[1] - arr; どちらの質問も有効で、問題へのアプローチが少し異なると思います。多大な助けと徹底した説明をありがとうございました!

1
nullポインターにゼロを追加することはできますか?
ヌルポインターの場合、ポインター演算は許可されていません。しかし、私がこのようなものを持っていると想像してください: class MyArray { int *arrayBegin; // pointer to the first array item, NULL for an empty array unsigned arraySize; // size of the array, zero for an empty array public: int *begin() const { return arrayBegin; } int *end() const { return arrayBegin + arraySize; } // possible? (arrayBegin …

2
配列の最初の要素の前のポインタ
Cでは、ポインターが同じ配列またはその配列の終わりを過ぎた1つの要素を参照する場合、演算と比較は明確に定義されていると言われています。次に、配列の最初の要素の前の1つはどうですか?私がそれを逆参照しない限り、それは大丈夫ですか? 与えられた int a[10], *p; p = a; (1)書くことは合法--pですか? (2)p-1式を書くことは合法ですか? (3)(2)が問題ない場合、それを主張できp-1 < aますか? これには実際的な懸念があります。reverse()で終わるC文字列を逆にする関数を考え'\0'ます。 #include <stdio.h> void reverse(char *p) { char *b, t; b = p; while (*p != '\0') p++; if (p == b) /* Do I really need */ return; /* these two lines? */ for (p--; b …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.