2016-12-12 1 views
0

以下のコードを実行すると、4として出力されます。与えられたCコードでポインタ減算によって生成される値

このコードでは何が起こっているのか説明できます。私の理解から

:[1]すなわち配列要素20のアドレスの

アドレスは、ポインタ変数pに格納され、60のアドレスは、変数qに格納されます。 q-pが実行され、印刷されます。しかし、 私は出力が何か違うと予想しました。

たとえば、最初の要素の開始アドレスを100とみなし、各要素が整数の場合は2バイトを使用します。 [0]アドレスは100、a [1] 102、a [2] 104、a [3] 106、a [4] 108、a [5] 110である。

[5] -address of a [1] = 110-102 = 8

ただし、値は4です。どこに何かが見当たりませんか?

Here(codepadリンク)はCコードです:

int main() 
{ 
     int a[] = { 10, 20, 30, 40, 50, 60 }; 
     int *p = &a[1], *q = &a[5]; 
     printf("%d",q - p); 
     return 0; 
} 
+0

'5 - 1 = 4'なので、インデックス値の差異。 –

+1

intポインタはmemアドレスをステップ数でカウントするため、4は[1]と[5]の間のメモリ/サイズ(int)の量を表します。 – George

+0

値を差し引くには '* q - * p'が必要です。あなたが現在行っていることは、自分の記憶値を減算することです(これは、単に5 - 1を行うことと変わりありません)。 – Rockybilly

答えて

1

ポインタの違いがsizeof(pointed_to_elem)の違いを数えます。生のバイトの違いが必要な場合は、char*にキャストするか、char*ポインタを使用してください。ポインタ演算で

printf("%d",(char*)q - (char*)p); 

または

char *p = (char*)&a[1], *q = (char*)&a[5]; 
1

、 "部" は、データタイプのサイズです。このため、配列要素を指すintポインターに1を加算すると、そのプラットフォームにはintのバイト数に関係なく配列の次の要素が得られます。

同じ理由から、インデックス1のインデックス要素からインデックス5の配列要素のアドレスを減算すると、配列のデータ型に関係なく5 - 1 = 4が得られます。わずかに、関連の理解のためにおそらく有用接線上


sizeof配列のは、依然として全体のアレイのバイト単位のサイズです。あなたは、配列内の項目数を取得したいのであれば、あなたが同じ配列にポインタを減算する場合

int a[] = { ... }; 
int count = sizeof(a)/sizeof(*a); 
1

ような何かをしなければならないあなたは、対応するインデックスを差し引いたかのように、あなたは同じ違いを取得します。 Cポインタ演算は、配列要素のサイズを考慮する必要がないように、この方法で動作します。

a[j]のアドレスからa[i]のアドレスを減算すると、jからiを引いた場合と同じ結果になります。

減算結果は、整数に収まらないタイプptrdiff_tであることに注意してください。

関連する問題