0
typedef int* ptr_t;
int target;
const ptr_t a = ⌖
*a = 6;            //OK
a = &target;       //<- error: assignment of read-only variable ‘a’

明らかに、ポインターは定数であり、ポイントされた値ではありません。これは、#define が使用された場合とは対照的です。

typedef で宣言されたポインターに修飾子を適用するための規則は何ですか?

実際の例として、コードを検討してください void (**foo)(void);

  • トップレベルのポインターを const (たとえば、ハードウェアの場所を指す) として修飾し、次のポインターを volatile (たとえば、独立したハードウェアによって変更可能) ポインターとして修飾する型を型定義するにはどうすればよいでしょうか。

  • typedef void (**foo)(void)これが固定された宣言である場合、ソース コードで上記の操作を実行する必要があるのはなぜですか?

4

2 に答える 2

3

C 標準のセクション 6.7.5.1 で違いが説明されています。例として次のように示します。

const int *ptr_to_constant;
int *const constant_ptr;

そして、次のように述べています。

が指すオブジェクトの内容は、ptr_to_constantそのポインターによって変更されませんが、ptr_to_constantそれ自体が別のオブジェクトを指すように変更される場合があります。同様に、int 指し示す byの内容はconstant_ptr変更できますが、constant_ptrそれ自体は常に同じ場所を指すものとします。

最後に、そのセクションのポイント 4 では、typedef の使用について説明します。

定数ポインターの宣言はconstant_ptr、型「int へのポインター」の定義を含めることによって明確にすることができます。

  typedef int *int_ptr;
  const int_ptr constant_ptr;

constant_ptr型「int への const 修飾ポインター」を持つオブジェクトとして宣言します。

于 2013-04-28T12:56:08.053 に答える
3

ルールは次のとおりです。

  • typedefマクロのような純粋なテキスト置換ではありません。
  • typedef に関与するポインターがあることを確認するために、宣言が解析されません。
  • cv 修飾子は、typedef ie: で作成したシノニムに適用されますint *

そう、

typedef int* ptr_t;
const ptr_t a = &target;

次と同じではありません:

const int* a;

しかし、それは次と同じです:

int *const a;

つまり、First は、second のように定数 int へのポインターではなく、int への const 定数ポインターを宣言します。

あなたの例から気づいたように、コードの読みやすさと直感性が低下するため、ポインター
への悪い習慣です。typedefつまり、ポインターに typedef を使用しているときにバグを作成するのは非常に簡単です。それを避けるのが最善です。

于 2013-04-28T12:46:16.143 に答える