1

ある関数にポインターがあり、そのポインターを返して、後でそれが指すものを変更できるようにしたいと考えています。それを返すと、ポインターが指しているアドレスまたはポインター自体が返されますか? この質問は、リンクされたリストの先頭が指すものを変更したいためです。

たとえば

struct node_{
    //variables
}*headPtr=NULL; //assume when we are returning headPtr in foo() it is no longer NULL but points to something

typdef struct node_ node;

node foo(){
    //some if conditions
    return headPtr;
}

main(){
    node *tmpPtr;
    tmpPtr=foo();
}
4

2 に答える 2

0

この関数は、リンクされたリストの先頭へのポインタと他のいくつかの引数を取り、新しいノードを作成してリストを追加し、新しい先頭を返します。

 struct type *ptr_change_head(struct type *ptr_old_head, other args){
  struct type *ptr = ptr_old_head;
  struct type *ptr_new_head = <new head>;

  ptr_new_head->ptr_next = ptr;

  return ptr_new_head;

}
于 2013-10-19T21:44:40.280 に答える
0

まずは自分のタイプを合わせましょう。 foo()の型シグネチャは を返すと言っていますnodeが、実際には へのポインタを返そうとしていますnodefoo()と再定義しましょう。

node *foo() {
    return headPtr;
}

それを返すと、ポインターが指しているアドレスまたはポインター自体が返されますか?

この線

tmpPtr = foo();

tmpPtrは、ポインターが指しているアドレスを変数に配置し、tmpPtr完全に一致する別の変数になりますheadPtr。つまり、同じものを指す 2 つの別個のポインターです。ここでは、次の 2 つの点に注意してください。

  • tmpPtrheadPtrは 2 つの別個の変数であり、一方を再割り当てしても他方には影響しません。
  • 現在、それらは同じノードを指しているため、.ではなく実際のノードを指していると仮定して、いずれかのポインターを間接参照することにより、それらが指しているノードを変更する可能NULL性があります。

あなたの意図が何headPtrを指すかを変更することである場合は、次のいずれかを実行できます。

  • headPtrのような割り当てで直接変更しheadPtr = somethingます。
  • headPtrtypeへのポインタを設定しますnode**

headPtr次のようなものへのポインタを設定できます

node **foo() {
    return &headPtr;
}

int main() {
    node **headPtrPtr = foo();
    *headPtrPtr = something else;
}

これは へheadPtrPtrのポインタに配置されますheadPtr。を逆参照することで、新しいノードを指すheadPtrPtrことができます。headPtr

于 2013-10-19T22:23:27.037 に答える