ポインタの実施内容のC
-
20-09-2019 - |
質問
知りたいと思い 建築を侵害する前提 います。また、知りたいと思いる場合は、前提条件はfalse全てのアーキテクチャには載したものではありませんで間違ってはいなかった).
sizeof(int*)==sizeof(char*)==sizeof(void*)==sizeof(func_ptr*)
のメモリー中の表現のすべてのポインタの指定された建築にかかわらず、同一のデータ型を指摘。
のメモリー中の表現のポインタは同じ整数値として同じビット長しています。
乗除算のポインタをデータタイプのみにより所持を禁止されているコンパイラです。注意:はい、ごきげんよう、トメ子です全くナンセンスです。うのがあるハードウェア-サポートするのを禁止この誤った使い方?
すべてのポインタ値をできる構造の単一の整数です。この建築が利用は、セグメント-オフセット?
Incrementingのポインタが追加
sizeof(the pointed data type)
のメモリアドレスによって格納されるポインタです。の場合p
はint32*
そのp+1
のメモリアドレス4バイトの後にp
.
私はもっとも多く使用されているためのポインタで使用される連続した仮想記憶空間です。その用途で一般的に得ようとしてアドレスを多数。見スタックオーバーフロー問題 ポインタとの比較.
解決
できませんの具体的な事例をもとに考察すべてのことだが、もちろん、マスダもしゃべります。
sizeof(int *) == sizeof(char *) == sizeof(void *) == sizeof(func_ptr *)
わからないのシステムI 知 これはfalseが発生していると考えること
モバイルデバイスがある程度の読み取り専用メモリとプログラムコードなどが格納されています。読み取り値(定数の変数が考えられ読みます。そのROMアドレス空間がり小さくなければならない通常RAMアドレス空間のポインタとサイズの異なる。同様に、ポインタ機能がずれてしまう可能性があり、という点にこの読み込み専用メモリのプログラムが読み込まれ、その改変を行うことはできません(お客様のデータで保存されます。
でんのプラットフォームか顕微鏡の測定結果によれば、上にはありませんが想像できますシステムである。
のメモリー中の表現のすべてのポインタの指定された建築にかかわらず、同一のデータ型を指摘。
う会員のポインタvs通常のポインタ.ないのと同じ表記(サイズ)。会員のポインタの this
ポインタとを相殺するものとする。
ととも考えられるCPUと負荷係数データを他の独立したメモリの領域は、別のポインタ形式です。
のメモリー中の表現のポインタは同じ整数値として同じビット長しています。
かるビットの長さが定義されています。:)
An int
多くの64-bitプラットフォームには32ビット.がポインタは64ビット.していて、CPUの分割型記憶モデルにおいてポインタで構成したペアの数が多い。同様に、会員のポインタのペアです。
乗除算のポインタをデータタイプのみにより所持を禁止されているコンパイラです。
最終的には、ポインタのデータタイプのみ 存在し のコンパイラです。のCPUで動作しないポインタが整数とメモリースしています。ああこれらの操作ポインタの種類 え きを禁じます。まれているCPUを禁じる連結のC++文字列オブジェクト。ではできないことでC++文字列タイプにのみ存在し、C++言語ではなく、発生する機械のコードです。
しかし、答えだ 平均, ていない商品については、モトローラ68000定する必要はありません。になっていると思う別登録数は、メモリースしています。ることも容易であることを禁じようなナンセンス事業です。
すべてのポインタ値をできる構造の単一の整数です。
い安全であります。CとC++の基準を保証することでも可能なメモリ空間レイアウト、CPUアーキテクチャおよびいただけます。具体的には、保証 実装で定義されていますマッピング.つまり、でき換のポインタを整数に変換する整数値に戻りオリジナルのポインタです。そのC/C++言語に対応したものの中間整数値です。る個々のコンパイラのハードウェアです。
Incrementingのポインタが追加sizeof(たデータタイプ)のメモリアドレスによって格納されるポインタです。
これを保証しようとするものです。ればと考えて概念的には、ポインタしないアドレス、ポイントする オブジェクト, このサポーターです。追加のポインタを明らかにし、 次へ オブジェクトです。場合にはオブジェクトは20バイトの長さ、incrementingのポインタを移動させることができ20バイトで移動し オブジェクト.
場合にポインタに過ぎなかったのですが、メモリアドレスリニアアドレス空間である場合は、基本的には整数、incrementingが追加さ1のアドレスは、先週末、例のギフトショップへ バイト.
最後に、申し上げたように、コメントご質問、C++があります。なケアに関する建築ベースで作成している。これらの多くの制限が不明瞭に現代のCPUます。がんを対象に往年のCPUのでしょうか。かばんを対象に、次代のCPUのでしょうか。んでもいい仕事はできませんとくします。かばんを対象に、仮想マシン?コンパイラでコンパイルが存在しを生み出すbytecodeのためのフラッシュ、準備から実行します。何をしたい場合はコンパイルC++によるPythonソースコードについて教えてください。
ご宿泊のルールで指定された標準を保証するコードを作 すべての これらの例です。
他のヒント
ない特定の現実世界に例の心が"権限"を標準装備。うにする必要がないの基準を作ることができョンを実施する意図に従わない場合その他の前提になっていました。これらを前提とした真のほとんどの時間だけなので便利な実施のポインタとして整数を表すメモリアドレスで直接取得のプロセッサーがとりあえず今回は結の"便利"できないとして普遍的真実
- 必要なのは、標準の(この質問).例えば、
sizeof(int*)
きの不平等をsize(double*)
.void*
は保証できる店舗の為のポインタ値とします。 - ないます。定義によってサイズで表現。場合はサイズである必要はありませんが、表現できるようになっている。
- ない必要があります。このビット長の建築"は、漠然とした。何は64-bitプロセッサ、本当ですか?でのアドレスバス?サイズのレジスタ?データバス?どう?
- 然マーサの特別な心にも感動を"掛け"または"分"、ポインタです。れにより所持を禁止されているコンパイラはもちろんの増殖や分割、配下の表現(いんとうしいことになる結果が未定義です。
- かかわからないあ すべ デジタルコンピュータでのバイナリー。
- あり;います.がること、間違いありませんポイントの位置ことになる
sizeof(pointer_type)
気付いた。たちの見解を示すものではない、相当額の算数、数( 遠く は論理的な概念です。実際の表現は、特定建築)
6.:ポインタを明らかにすることは必ずしもメモリアドレスです。を入手している。"のポインタの陰謀"のスタックオーバーフローのユーザー jalf:
あり、私はこの言葉が使われている"住所"のコメントする。現だけではないんだようです。いることを意味するものではなく"メモリアドレスのデータは物理的に保存"が単に抽象的な"何については、こちらをご覧下さいを見つけるために。の住所のことがございましたのも、このままでは常に変更す"
と:
ポインタはメモリアドレス!私は述べたように、このメソッドは、ということかを設定することができます。ポインタは、通常のコンパイラとしてとらえ、メモリアドレス、その通りですが、なれてしまいます。"
あのさらなる情報へのポインターからは、C99の標準:
- 6.2.5§27ることを保証
void*
やchar*
して同一の表現には、使用できinterchangablyなしに変換、住所と同一のものは同ビットパターンをなしていきその他のポインタ型) - 6.3.2.3§1国為のポインタを不完全またはオブジェクトの型にキャストできることへ(から)
void*
してもらうことを目的としても有効である;こ含まないための関数ポインタ! - 6.3.2.3§6国
void*
キャストできること(および)から整数7.18.1.4§1震の種類intptr_t
やuintptr_t
;の問題:これらの種類のオプションの基準を明示的に記載があることを要しない整数型のに十分な大き実際の値を保持するためのポインタを!
sizeof(char*) != sizeof(void(*)(void)
?-ではなくx86 36ビットアドレッシンモード(サポートされて毎年、建国記念のインテル®プロセッサー以来、Pentium1)
"メモリ内表現のポインタは同じ整数値として同じビットの長さ"といメモリー中の表現の他の近代建築タグ付きのメモリを持っており、既に廃止前にCされています。メモリがいも整数、ビット言語(バイトではありません;最物理メモリすることを認めていません読めるというだけ8ビットまで)
"掛け算のポインタでは不可能"-68000家族アドレス帳のもポイント)なサポートIIRC.
"すべてのポインタでの整数にキャスト"でなくPICs.
"Incrementing T*相当の追加sizeof(T)のメモリアドレス"-trueによる定義で設定します。にも相当 &pointer[1]
.
わからないのが、DOSの仮定は#3は問題無し。DOSは16ビットおよび様々な仕掛け地図が多く、16ビット以上の価値のメモリを消費します。
のメモリー中の表現のポインタは同じ整数値として同じビット長しています。
この前提が偽での80186、例えば、32ビットのポインタで開催された二つのレジスタ(オフセットを登録セグメントの登録)、半単語の後に登録事項の中でアクセス。
乗除算のポインタをデータタイプのみにより所持を禁止されているコンパイラです。
できません増殖や分割します。P
私はなぜ迷い増殖や分割、ポインタです。
すべてのポインタ値をできる構造の単一の整数です。この建築が利用は、セグメント-オフセット?
は、C99の標準でポインタに格納する intptr_t
, は整数タイプです。ですね。
Incrementingのポインタが追加sizeof(たデータタイプ)のメモリアドレスによって格納されるポインタです。場合はint32*そのp+1に等しいメモリアドレス4バイトp.
x + y
場所 x
は T *
や y
整数であるがequivilentる (T *)((intptr_t)x + y * sizeof(T))
ど分かっています。配置する問題が、パディングを提供することがあり、 sizeof
.んでした。
一般に、その答えはすべての質問質問質問質問質問"あり"、これだけの機械を実装している人気の言語で直接見の日の光と続き、現在の世紀です。言語基準は異なりこれらの"不変量"は、主張がなされた実際の製品は、可能な例外の項目3-4を必要とする一部修正再表示する普遍的にtrueです。
それは確かにすることができま分MMUデザインに対応約の能力に基づくアーキテクチャのた学術的には、過去からなるシステムは見た共用部などの機能を有効にします。システムが葛藤を主張していた大きなポインタ.
のほか、グ/能力MMUs、しばしば大きなポインタは、極端なデザインのためにはエンコードデータの種類のポインタ.こうしたのです。(この問いを持ち上げるのですけれどもすべての代替案についての基本的な単語、ポインタ-である単語すくなっています)
具体的には:
- のメモリー中の表現のすべてのポインタの指定された建築にかかわらず、同一のデータ型を指摘。 Trueを除き、非常に奇過去のデザインのための保護ない強い型の言語のものをハードウェア
- のメモリー中の表現のポインタは同じ整数値として同じビット長しています。 それは確かに何らかの整数型と同じ、 LP64vs LLP64.
- 乗除算のポインタをデータタイプのみにより所持を禁止されているコンパイラです。 右.
- すべてのポインタ値をできる構造の単一の整数です。この建築が利用は、セグメント-オフセット? な使用は、セグメント-オフセットがC
int
ることができるのではない大き上がれます♪※数に限りがございが必要な場合もありlong
またはlong long
にポインタです。 - Incrementingのポインタが追加sizeof(たデータタイプ)のメモリアドレスによって格納されるポインタです。場合はint32*そのp+1に等しいメモリアドレス4バイトp. そうです。
すべてのインテル-アーキテクチャのCPU、すなわち、ひとつひとつのPeeCee、精緻な分割単位叙伝説,複雑になります。しかし、効果的に無効になります。でもPCのOS、ブートを設定し、セグメント拠点を0となり、セグメント長~0,nullingのセグメントを平らメモリーモデルです。
がたくさん"の語対応"アーキテクチャーは、1950年代1960年代と1970年代。でもせっ主流の事例であったCコンパイラです。その時、 ICL/三河PERQ機 1980年代になった単語対応した書き込み可能な管理店microcode).そのinstantiationsたCコンパイラと風味のUnixという PNX, ものの、Cコンパイラに必要な特別microcode.
の基本的な問題はchar*型の語対応機器がぎこちない.ただし,実施していただきたい。だができるとと sizeof(int *) != sizeof(char *)
...
興味深いことに、Cがありました言語と呼ばれ BCPL の基本的なポインタをタイプした単語のアドレスそれは、incrementingのポインタまたはアドレスを次の単語、 ptr!1
ただの言葉で ptr + 1
.がありました異なるオペレーターのための取り組みとしてbyte: ptr%42
います。
編集:わからない答えない問題が血糖値が低い。脳(確かに、鉱山)なども予定しているとのことです。:-(
小nitpick:
pはint32*そのp+1
が間違っているのは、が必要で符号なしint32、そうでない場合はトップでのメモリ領域は2GBまでです。
興味深い響き-たことから、著者のCコンパイラのためのトランスピュータチップすると言われるコンパイラの場合はNULLと定義された-メモリ領域は2GBまでです。なぜですか?なのでトランスピュータが符号付きのアドレス範囲:-2GB+メモリ領域は2GBまでです。まbeleiveす。凄いですよね。
かった人々としっかりと定義NULLのようなことが壊れています。私は同意がない場合またはNULLポインタの中では自分の住んでいます。
思ったものになっているのは嬉しいとは思いませんの作トランスピ!
知りたいと思い建築を侵害する想い 下記に記します。
いたように、これまでとは違ったスティーブンCに記PERQ機MSalters記68000s、PICs.
私は失望がかなうかという答えによるネーミングの他にも、素晴らしいアーキテクチャおいて標準準拠のCコンパイラに収まらない一定の主張には根拠がな前提をアップデート。
sizeof(int*)==sizeof(char*)==sizeof(void*)==sizeof(func_ptr *)?
ない必要があります。例:
ほとんどのコンパイラのためのハーバード-アーキテクチャの8-bitプロセッサ--日替、8051とM8C--作sizeof(int*)==sizeof(char*), ものとは異なるsizeof(func_ptr*).
一部の非常に小さなチップをその家族に256バイトのRAM(以下)が数キロバイトのPROGMEM(フラッシュROM)、コンパイラの多くにsizeof(int*)==sizeof(char*)1(単8ビットのバイトがsizeof(func_ptr*)に等しい2(二つ8ビットバイト単位)。
コンパイラの多くの大きなチップとその家族と少数キロバイトのRAMおよび128はキロバイトのPROGMEMくsizeof(int*)==sizeof(char*)に等しい2(二つ8ビットのバイトがsizeof(func_ptr*)に等しい3(三8ビットバイト単位)。
少しハーバード-アーキテクチャのチップでの店のちょうど2^16日("64KByteのPROGMEM(フラッシュROMとも2^16日("64KByteのRAM+メモリマップドI/Oのコンパイラなどのチップを作sizeof(func_ptr*)は常に2(二バイト);ももいえないことその他の種類のポインタsizeof(int*)==sizeof(char*)==sizeof(void*)への"長ptr" 3バイトの汎用ポインタ この魔法のビットを示すかどうかがポインタをポイントRAMまたはPROGMEM.(どちらかと言えばそういうポインタを渡す必要があります"print_text_to_the_LCD()"関数を呼び出すときはその機能から多くの異なるサブルーチンは時に住所変数の文字列バッファそのもRAMなどの多くの定数文字列がでPROGMEM).などのコンパイラが特殊なキーワード("短い"または"近い"、""や""これまでにそのプログラマーをより具体的に指示するなどのcharへのポインタを同じプログラムで定数文字列するだけであれば2バイト数を示すことがでPROGMEMに位置するものであり、非常に文字列するだけであれば2バイト数を示すことがRAMに位置するものであり、そのような3バイトのポインタが"print_text_to_the_LCD()"受けた。
最もコンピュータの1950年代と1960年代に使用 36ビット語長 または 18ビット語長, は、18ビット(以下アドレスバスになります。なんとCコンパイラでコンパイルなどをコンピュータを使うことが多 9ビットのバイト, とsizeof(int*)==sizeof(func_ptr*)=2を18ビットがすべて整数とする単語-整;がsizeof(char*)==sizeof(void*)==4の 特にPDP-10の指示 内カンパニーのヘルスケアなどのポインタフル36ビットの言葉です。専門誌とインターネット36ビット単語を含む18ビット単語のアドレスなどで、ビットのその他の18ビットのこ(その他のもの)を示すビットの位置を指摘を文字以内のこと。
のメモリー中の表現のすべてのポインタの指定された建築 はにかかわらず、同一のデータ型を指摘すか?
ない必要があります。例:
一つは、建っては、前述のとおり、ポインタは、異なるサイズです。定できるようになりましたもいらっしゃるかもしれにとって"同じ"表記?
一部のコンパイラでコンパイルシステムによって使用 "記述子" 実行文字にポインタのその他の種類のポインタ.などの記述子が 異なる のためのポインタを指初の"char"、"char big_array[4000]
"より、ポインタが指し示す最初の"char"、"char small_array[10]
"ある間違異なるデータタイプの場合でも、小さい配列が開始、同じ場所にメモリー地に大きな配列になります。記述子を機にトラップのバッファオーバーフローの原因となるなどの問題その他の機です。
の "低脂肪のポインタ" 使用されSAFEliteと同様のソフトプロセッサ"は類似の"拡張情報"のバッファのサイズは、ポインタをポイントです。低脂肪のポインタの利点を引くトラッピングバッファがあります。
のメモリー中の表現のポインタは同じ整数値としての 同じビット長としての建築?
ない必要があります。例:
に "タグアーキテクチャ" 機械、各単語の記憶のあるビットかどうかを示すこの言葉からは整数、またはポインタ、または、地下鉄からも近くて便利。などの機械、タグのビットを教えてくるかどうかと言ったの整数またはポインタです。
いNovaミニコンにて "間接ビット" 各単語る "間接ネジ付きコード".そのように保管整数値をクリアするビットが格納にポインタを設定しれます。
乗除算のポインタをデータタイプは禁止され のコンパイラです。注意:はい、ごきげんよう、トメ子です全くナンセンスです。んで -いハードウェア-サポートするのを禁止この誤った使い方?
あり、一部のハードウェアに直接投影されることはないが支援します。
いるその他の既述のとおり、"掛け算"で指68000の6809のみ(一部)"データレジスタ";することができませんから直接値"アドレスの登録".(でも簡単のためのコンパイラに動作しな制限をMOVている場合は、それらの数値からのアドレスの登録を適当なデータを登録し、利用MUL).
すべてのポインタ値をできる構造の単一のデータタイプ?
そうです。
るために memcpy()有, は、標準Cることを義務付けるもので、毎にポインタ値の各種キャストできることにvoidポインタ"void*").
のコンパイラが必要で、この作品もアーキテクチャをお使いのセグメントおよびオフセットなのです。
すべてのポインタ値をできる構造の単一の整数?つまり、 何を築いのは、セグメント-オフセット?
本当のところはわからないけど。
いすべてのポインタ値にキャストできることをsize_t"と"ptrdiff_t"積分実験データ種定義される"<stddef.h>
".
Incrementingのポインタが追加sizeof(たデータ タイプ)のメモリアドレスによって格納されるポインタです。場合はint32* 次にp+1に等しいメモリアドレス4バイトp.
かまいます。
Q:している場合は配列の一部のような構造またはプリミティブデータタイプ(例えば、"#include <stdint.h> ... int32_t example_array[1000]; ...
"が、増加のポインタをポイントが配列(たとえば、"int32_t p=&example_array[99];...p++;...")は、ポインタの現在ポイントを連続した配列であるsizeof(たデータタイプ)バイトにメモリ?
A:あり、コンパイラにしなければならないと思いポインタ、incrementingますので、ポイントの独立した連続int32_tの配列,sizeof(たデータタイプ)バイトに記憶するための基準に対応しています。
Q:そのため、pはint32*、p+1に等しいメモリアドレス4バイトの後、p?
A:時sizeof(int32_t)が実際に平等に4つありますか?その他、などの特定の単語連想機械を含む現代のDspがsizeof(int32_t)が等しい2も1、p+1に等しいメモリアドレス2も1"Cバイト"p.
Q:なった場合には、ポインタ、キャストで"int"...
A:ワンタイプの"世界中でVAX異端".
Q:...そしてキャストすると、"int"へのポインタ...
A:別タイプの"世界中でVAX異端".
Q:なった場合には、ポインタpでのポインタをint32_t、キャストへの積分タイプをたっぷり十分に大きいのポインタを追加してく sizeof( int32_t )
この整数型、そしてその後はキャストする整数型へのポインタがいる全てのポインタはp+1?
ない必要があります。
多くのDspやその他の近代的チップワ志向への対応ではなく、バイト指向の処理に使用する8ビットチップスです。
一部のCコンパイラでコンパイルなどのチップcram2文字それぞれの言葉がかか2などの言葉をint32_t--そのことを報告 sizeof( int32_t )
4.(聞いたことがあるCコンパイラ用の 24ビット Motorola56000ることがあります。
のコンパイラに必要な手配もないp++"とのポインタをint32_t単位でのポインタのint32_t値です。様々な種類があり、コンパイラになる。
一つの基準に準拠した方法は、店舗毎にポインタint32_tとして"ネイティブな言葉。で2つの言葉をシングルint32_t値、Cコンパイラの統"int32_t * p; ... p++
"一部組み立て言語を単位とするポインタ値2.一方、そのなかで"int32_t * p; ... int x = (int)p; x += sizeof( int32_t ); p = (int32_t *)x;
"は、Cコンパイラの56000がコンパイルで組み立てた言語単位、ポインタ値4.
私はもっとも多く使用されているためのポインタで使用される連続した仮想メモリ スペース。
複数の日替、8086のその他のシステムは連続しないRAM-- 数ブロックRAMのでアドレスなのに"といったハードウェアシ".メモリ-マップドI/Oまたは何も付けるギャップのアドレス空間ブロックとなります。
でもぎこちないようで録音できます。
場合などに ビット-バンディングハードウェア を防止するために使用され問題 読み取りの変更-write --同じビットのRAMを読み込み可能または書面を2つ以上の異なるスしています。