함수를 사용하여 포인터에 포함된 주소 변경
포인터를 선언한 경우p~하듯이int *p; 메인 모듈에서, 나는 다음에서 포함하는 주소를 변경할 수 있습니다.p할당함으로써p = &a;어디에a는 이미 선언된 다른 정수 변수입니다.다음 기능을 사용하여 주소를 변경하려고 합니다.
void change_adrs(int*q)
{
int *newad;
q = newad;
}
메인 모듈에서 이 함수를 호출하면
int main()
{
int *p;
int a = 0;
p = &a; // this changes the address contained by pointer p
printf("The address is %u\n", p);
change_adrs(p);
printf("The address is %u\n", p); // but this doesn't change the address
return 0;
}
주소 내용은 변경되지 않습니다.동일한 작업에 기능을 사용하는 것이 뭐가 문제입니까?
C에서는 함수 인수는 값으로 전달됩니다.따라서 인수의 복사본이 생성되고 변경 내용은 변경되어야 하는 실제 포인터 개체가 아닌 해당 복사본에 적용됩니다.이 작업을 수행하려면 포인터 투 포인터 인수를 허용하고 참조되지 않은 인수를 변경하도록 함수를 변경해야 합니다.예를들면
void foo(int** p) {
*p = NULL; /* set pointer to null */
}
void foo2(int* p) {
p = NULL; /* makes copy of p and copy is set to null*/
}
int main() {
int* k;
foo2(k); /* k unchanged */
foo(&k); /* NOW k == NULL */
}
C++를 사용할 수 있는 고급스러운 방법이 있다면 포인터에 대한 참조를 받아들이도록 함수를 변경하는 것입니다.
C에서 변수는 값으로 전달됩니다. 포인터의 복사본은 함수로 전달됩니다.대신 포인터에 대한 다른 포인터를 사용합니다.
void change(int **p, int *someOtherAddress)
{
*p = someOtherAddress;
}
int a = 1, b = 2;
int *p = &a;
printf("*p = %d\n", *p);
change(&p, &b);
printf("*p = %d\n", *p);
이 인쇄물은
*p = 1
*p = 2
만약 당신이 C의 함수에 있는 변수의 내용을 바꾸고 싶다면, 포인터 또한 일종의 변수입니다, 당신은 항상 을 사용하여 포인터나 간접 참조에 의해 그것을 넘겨야 합니다.&주소 및*참조 해제 연산자제 말은.*변수 값을 변경할 때 연산자가 항상 사용되고 앞에 나옵니다.
#include <stdio.h>
#include <stdlib.h>
void changeIntVal(int *x) {
*x = 5;
}
void changePointerAddr(int **q) {
int *newad;
*q = newad;
}
void changePPAddr(int ***q) {
int **dummy;
*q = dummy;
}
int main() {
int *p;
int **pp;
int *tempForPP;
int a = 0;
printf("\n The address pointing by p -> %p, pp -> %p, value of a -> %d ", p, pp, a);
p = &a;
pp = &tempForPP;
printf("\n The address pointing by p -> %p, pp -> %p, value of a -> %d ", p, pp, a);
changeIntVal(&a); // ----
// |---
changePointerAddr(&p); // ---- |----> parts of what I mean
// |---
changePPAddr(&pp); // ----
printf("\n The address pointing by p -> %p, pp -> %p, value of a -> %d ", p, pp, a);
return 0;
}
기본 데이터 유형(예:int, 더블 포인터는 필요 없습니다.수신처 주소에는 직접 기입할 수 있습니다.int이 주소는 호출되는 함수의 포인터로 처리되며 저장됩니다.이건 좀 다른데chararray("string")는, 지적되는 사이즈가 가변적이기 때문에, 착신측 함수내에서 변경할 때는, 다른 레벨의 간접을 사용할 필요가 있습니다.이것을 시험해 보세요.
void foo(int *oldVal)
{
int newVal = 99; // or whatever you want
*oldVal = newVal;
}
int main(int argc, char *argv[])
{
int someVal = 0;
foo(&someVal); // we send its address to foo()
printf("someVal is now %d.\n", someVal);
return EXIT_SUCCESS;
}
이렇게 해도 실제 값은 변경되지 않습니다.p왜냐하면q그 기능은 로컬이며, 그 기능의 변경은 에 반영되지 않습니다.main주소를 전달해 주세요.p지나가는 대신p가치에 따라
아래 구문 사용
void change_adrs(int **q)
{
int * otheraddess;
*q = otheraddress;
}
이렇게 전화하면change_adrs(&p);
또는 함수의 반환 유형을 변경하고 반환된 주소를 받는 방법도 있습니다.
int* change_adrs(int *q)
{
int * otheraddess;
q = otheraddress;
return q;
}
int main()
{
p = change_adrs(p);
return 0;
}
언급URL : https://stackoverflow.com/questions/13431108/changing-address-contained-by-pointer-using-function
'programing' 카테고리의 다른 글
| c에서 nan과 inf를 어떻게 사용하는가? (0) | 2022.07.26 |
|---|---|
| VueJs Vue.component에서 데이터를 가져오는 방법 (0) | 2022.07.26 |
| Java에서 무한대를 구현하는 방법2 (0) | 2022.07.26 |
| Vuetify 데이터 테이블에서 Vuex 상태를 올바르게 업데이트하려면 어떻게 해야 합니까? (0) | 2022.07.26 |
| ## 프리프로세서 오퍼레이터와 gotcha의 어플리케이션은 무엇입니까? (0) | 2022.07.26 |