0

たとえば、私の64ビットのubuntuマシンでは、ポインタの長さは2バイトで、1つのメモリアドレスを持っているので、それが指している長いintまたはintに関係なく、常に2バイトですか?

もしそうなら、それが指すデータのタイプを決定するポイントは何ですか? 以下のコードでは、互換性のない警告の目的を除いて、データが何バイトを表しているか%huを andを使用して示し%luているため、ポインタが int であろうと long であろうと、結果は同じです。誰かヒントをくれませんか?

#include <stdio.h>
int main(void) {
    int *ptr1;
    long int *ptr2;
    long int a = 0xffffffff;
    ptr1 = &a;
    ptr2 = &a;
    printf("the value should the same as 2 ** 16 %hu", *ptr1);
    printf("the value should the same as 2 ** 32 %lu", *ptr2);
    return 0;
}

アップデート:

私が考えることができるポインターのタイプを決定する別の目的は、次のようなポインター演算です。

ptr + 1、常に特定の値ではなく、データ型が持つバイトの長さをスキップします

4

1 に答える 1

1

私はあなたが求めていることを誤解しているかもしれません。もしそうなら、事前にお詫び申し上げます。起こっていることは、一般的なポインターの概念を、特定のポインターが参照する可能性のある型の概念と混同していることだと思います。

ポインターは、それが指すものに関係なく、単なるメモリ内のアドレスです (ただし、特定の環境またはシステム用に構造化されています)。参照されるデータの型は、割り当て (malloc、calloc など) において重要です。これは、特定のポインターによって参照される特定の型/構造体に割り当てられる必要があるメモリのバイト数を知ること重要になるためです。配列構造へのポインターを使用している場合、ポインター参照をインクリメントすると、データ サイズはさらに重要になります。これは、ポインターのインクリメントが、参照されるデータのサイズだけインクリメントされる可能性があるためです。

ポインター型を宣言できますが、何も割り当てられません。そして、受け取っている警告は、意図的または偶然に、あるタイプの変数のアドレスを取得したが、それを別の種類の変数のアドレスとして使用しようとする危険があることをコンパイラが伝える方法です。.

int には 4 バイトかかるが、短い int には 2 バイトかかるとしましょう。short int へのポインタを取り、それに int 値を書き込むと、途中で誰が何を知っているか分からなくなります。実行時にコードに本当に悪いことが起こらないように、参照しているポインターの種類を追跡することが重要なのはまさにそのためです。

私が言ったように、私は問題を誤解している可能性があります。もしそうなら、お詫び申し上げます。これがお役に立てば幸いです。

于 2012-09-19T02:31:04.037 に答える