5

関数にポイントを割り当てられないのはなぜですか。次のコードで気づいたように。関数が戻った後、正しいアドレスを指すポインターp1を割り当てることができません。しかし、グローバルポインタ* pを使用すると、アドレス情報を格納できます。

#include <stdio.h>
#include <stdlib.h>

int *p = NULL;
void test(int * pt1, int**pt2){
    p = (int*)malloc(sizeof(int));    
    pt1 = p;
    *pt2 = p;
    printf("p points to %p\n", p);
    printf("pt1 points to %p\n", pt1);
    printf("pt2 points to %p\n", *pt2);
}

int main(void) {
    int *p1 = NULL; 
    int *p2 = NULL;

    printf("p points to %p\n", p);
    printf("p1 points to %p\n", p1);
    printf("p2 points to %p\n", p2);

    test(p1, &p2);

    printf("p points to %p\n", p);
    printf("p1 points to %p\n", p1);
    printf("p2 points to %p\n", p2);

    return 0;
}

出力:

p points to (nil)
p1 points to (nil)
p2 points to (nil)
p points to 0x8acb008
pt1 points to 0x8acb008
pt2 points to 0x8acb008
p points to 0x8acb008
p1 points to (nil)
p2 points to 0x8acb008
4

3 に答える 3

5

test変数の中にpt1は、それ自体が個別のポインターがあります。つまり、これは単なるエイリアスではなくp1、呼び出しの存続期間中のみ存在するコピーです。

したがって、割り当てを行うと、その呼び出しの間だけ終了し、その呼び出しの外部に伝播されることはありません。testポインタから戻るpt1と、存在しなくなり、変更はコピーされません。

場合によっては、ポインタの追加の「レイヤー」を使用するだけでなくpt2、戻り値を使用して、より多くのユーザーと変更を「共有」することが適切な場合もあります。

#include <stdio.h>
#include <stdlib.h>

int *p = NULL;
int *test(int * pt1, int**pt2){
    p = (int*)malloc(sizeof(int));    
    pt1 = p;
    *pt2 = p;
    printf("p points to %p\n", p);
    printf("pt1 points to %p\n", pt1);
    printf("pt2 points to %p\n", *pt2);
    return pt1;
}

int main(void) {
    int *p1 = NULL; 
    int *p2 = NULL;

    printf("p points to %p\n", p);
    printf("p1 points to %p\n", p1);
    printf("p2 points to %p\n", p2);

    p1=test(p1, &p2);

    printf("p points to %p\n", p);
    printf("p1 points to %p\n", p1);
    printf("p2 points to %p\n", p2);

    return 0;
}
于 2013-02-07T20:30:22.763 に答える
1

p1を値で渡すので、変更はその関数のスコープ内でのみ表示されます。p2で行ったように、そのポインターへのポインターを渡すと、問題ありません。

#include <stdio.h>
#include <stdlib.h>

int *p = NULL;
void test(int **pt1, int**pt2){
    p = (int*)malloc(sizeof(int));    
    *pt1 = p;
    *pt2 = p;
    printf("p points to %p\n", p);
    printf("pt1 points to %p\n", pt1);
    printf("pt2 points to %p\n", *pt2);
}

int main(void) {
    int *p1 = NULL; 
    int *p2 = NULL;

    printf("p points to %p\n", p);
    printf("p1 points to %p\n", p1);
    printf("p2 points to %p\n", p2);

    test(&p1, &p2);

    printf("p points to %p\n", p);
    printf("p1 points to %p\n", p1);
    printf("p2 points to %p\n", p2);

    return 0;
}
于 2013-02-07T20:29:24.983 に答える
1

値を渡すp1ため、関数で更新されませんmain。ただし、参照によって渡さp2れているため(作成したことに注意してください&p2)、変更できます。

于 2013-02-07T20:30:04.447 に答える