2
int main()  
{  
    int i=0;  
    int* p_numbers = ((int*) malloc (5*sizeof(int)));  
    int* temp;  
    temp = p_numbers;  
    for(i=0;i<5;i++)  
    {  
        *temp=i;   
        printf("temp %d p_numbers %d",*temp,*p_numbers);  
        temp++;           
    }
}

tempieに割り当てられたポインタを教えてくださいtemp=p_numbers

が指しtempているのと同じメモリ位置p_numbersを指していませんか?

4

7 に答える 7

5

変数tempp_numbersは、ループの最初の反復で同じメモリ位置を指します。その後、tempは整数で増分しますが、増加しp_numbersません。

割り当てがあるp_numbers = [0,1,2,3,4]ため、、、を印刷します。

temp 0 p_numbers 0
temp 1 p_numbers 0
temp 2 p_numbers 0
temp 3 p_numbers 0
temp 4 p_numbers 0

ポインタは、Java参照構文のようではなく、メモリアドレスを指していると考えてください。

于 2011-12-25T06:58:42.947 に答える
2

一時はp_numbersと同じメモリ位置を指します。ただし、forループは異なる出力を提供します。一時メモリアドレスのみをインクリメントするためです。p_numberメモリアドレスもインクリメントする必要があります。

temp++;            
p_numbers++; 

両方が同じアドレス位置を指し、同じ出力を提供するようにします。

于 2011-12-25T07:01:08.020 に答える
1

このステートメントのため、両方のポインタが同じメモリ位置を指しています。

temp = p_numbers;

forループでは、tempをインクリメントすると、以前のメモリ位置を指すようになり、p_numbersとは異なります。

于 2011-12-27T15:27:36.273 に答える
1

はい、そうです。

ただし、出力を印刷するときは、そのうちの1つだけをインクリメントするため、もう1つは最初の要素を指します。

両方をインクリメントするとどうなるかを確認してください。

int main()  
{  
    int i=0;  
    int* p_numbers = ((int*) malloc (5*sizeof(int)));  
    int* temp;  
    temp = p_numbers;  
    for(i=0;i<5;i++)  
    {  
        *temp=i;   
        printf("temp %d p_numbers %d",*temp,*p_numbers);  
        temp++;           
        p_numbers++;    // see the result when you add this line
    }
}

出力:

temp 0 p_numbers 0temp 1 p_numbers 1temp 2 p_numbers 2temp 3 p_numbers 3temp 4 p_numbers 4

ところで、重要ではありませんが、ポストインクリメント( ++i、、)よりもプリインクリメントの方が効率的です。変数を返す前に変数のコピーを作成する必要はありません。++temp++p_numbers

于 2011-12-25T06:59:04.133 に答える
1

Tempはp_numbersポイントと同じメモリ位置を指します

あなたのコードへの答えは

temp 0 p_number 0

temp 1 p_number 0

temp 2 p_number 0

temp 3 p_number 0

temp 4 p_number 0

p_number ++を使用して、ポインターp_numberも増分します。

于 2011-12-25T07:07:25.203 に答える
1
    int* p_numbers = ((int*) malloc (5*sizeof(int)));  

              +---+---+---+---+---+ 
p_numbers --> | x | x | x | x | x |
              +---+---+---+---+---+ 


    int* temp;  
    temp = p_numbers;  

p_numbers --+    +---+---+---+---+---+ 
            +--> | x | x | x | x | x |
temp--------+    +---+---+---+---+---+ 

p_numbersまた、メモリリークが発生するため、解放する必要があります。

mallocまた、場合によってはエラーを見つけるのが困難になる可能性があるため、からの戻り値をキャストしないことを習慣にしてください。

説明:

mallocが定義されstdlib.hています。そのヘッダーを含めるのを忘れた場合、プロトタイプがない関数のCの方法であるため、malloc関数はデフォルトで返されると想定されます。intこれで、このようなものがある場合、returnedをにchar*p = (char*)malloc(12);効果的にキャストするため、問題が発生する可能性があります。明示的にキャストすることで、コンパイラからの警告を無音にします。ハードウェア/ OSがあり、エラーを見つけるのが難しい場合は、次のように記述します。integerchar*sizeof(char*) != sizeof(int)

p_numbers = malloc(5*sizeof(int))

C ++コンパイラを使用している場合は、new/delete代わりに使用してください。

于 2011-12-25T08:29:49.693 に答える
0

はい、ポインタtempの値をポインタの値に設定していますp_numbers

于 2011-12-25T06:59:46.030 に答える