関数内のポインターのアドレスを変更したい場合は、ポインターが指す変数の値を変更するのではなく、ポインターへのポインター (つまり、2 次ポインター) を関数に渡すことができます。このようにして、関数内のポインターのアドレスを変更することで、ポインターが指す変数を変更することができます。以下に例を示します。
#include <stdio.h>
// 函数原型,接受一个指针的指针作为参数
void changePointer(int **ptrPtr) {
int newNumber = 42;
// 修改指针的地址,使其指向新的变量
*ptrPtr = &newNumber;
}
int main() {
int number = 10;
int *ptr = &number;
printf("Before function call: %d\n", *ptr);
// 将指针的地址传递给函数,并在函数内部修改指针的地址
changePointer(&ptr);
printf("After function call: %d\n", *ptr); // 输出 42
return 0;
}
この例では、`changePointer` 関数はポインターへのポインターを引数として受け入れます。関数内で、新しい整変数 `newNumber` を作成し、その変数のアドレスを渡されたポインター `*ptrPtr` に割り当てます。このようにして、main関数のptrのアドレスがnewNumberのアドレスに変更されます。したがって、`*ptr` は `newNumber` を指すようになり、この値は関数の外部からアクセスできるようになります。「newNumber」のライフサイクルは「changePointer」関数が終了すると終了するため、実際のアプリケーションではライフサイクルの問題を慎重に扱う必要があることに注意してください。
次のコードを実行すると、新しい洞察が得られると思います。
#include "stdio.h"
struct Stud{ //定义结构体类型
int no;
char name[10];
struct Stud *next;
};
void fun(struct Stud *s) //一个修改结构体地址的函数
{
s=s->next;
}
int main(){ //主函数
struct Stud s[2]={
{1,"Mary"},{2,"Smith"}}; //初始化
s[0].next=&s[1];
fun(&s[0]); //进入函数
for(int i=0;i<2;i++){ //打印
printf("%s(%d)",s[i].name,s[i].no);
}
printf("\n");
}
C言語では、関数を介して変数の値を変更したい場合、変数のアドレス(ポインタ)を関数に渡し、関数内でポインタを介して変数の値を変更することができます。こうすることで、関数の外側で変数の変更を確認できます。以下に例を示します。
#include <stdio.h>
// 関数のプロトタイプ、パラメータとしてポインタを受け取ります
void changeValue(int *ptr) { // ポインタを介して変数の値を変更します *ptr = 42; }int main() { int 数値 = 10;
printf("関数呼び出し前: %d\n", number);
// 変数のアドレスを関数
changeValue(&number);に渡します。printf("関数呼び出し後: %d\n", number); // 出力 42
0を返します。
}
上記の例では、「changeValue」関数は整数ポインタをパラメータとして受け取り、ポインタを通じて変数の値を変更します。`main` 関数では、整数変数 `number` を宣言し、そのアドレスを `changeValue` 関数に渡します。関数内では、ポインタ `*ptr` を通じて `number` の値が 42 に変更されます。この変更は関数の外部でも見ることができます。