2013-10-21 3 views
1

은 내가 C는 항상 값에 의해 통과 알고,하지만 난 포인터가있는 경우 : 포인터를 함수에 전달하고 C에 지정된 변수에 값을 할당하는 방법은 무엇입니까?

int i = 4; 
int * p; 
p = &i; 

다음 나는 기능이를 어떻게 변수 i의 값을 여기에 포인터 p을 통과 변경?

void changeValue(int *p) 
{ 
} 

포인터를 전달하고 변수가 가리키는 변수를 변경하는 방법은 p입니까?

+0

"나는 항상 값으로 전달합니다."어떻게 알 수 있습니까? – Abhineet

+1

어딘가에 그것을 읽어라. – user2131316

+0

그 선배에게 고마워. 나는 그것을 몰랐다. 나는 경험상 모든 것이 복사된다는 것을 알고 포인터의 값을 알았지 만 결코 두 번째 생각을하지는 못했다. – Abhineet

답변

2

이 간단한 예에서는 포인터 (즉 아닌 값)을 통과하여 그 포인터를 정수로 유지되는 새로운 값을 다시받을하는 방법을 보여준다. 감소 된 변수의 수에 유의하십시오. 즉, 반드시 int *p;의 별도 사본을 작성할 필요는 없습니다. 이 경우 i의 주소에 p : p = &i;을 초기화 할 필요도 없습니다.

int changeValue(int *); 
int main(void) 
{ 
    int i=15; 
    changeValue(&i); 
    return 0; 
} 

int changeValue(int *p) //prototyped to accept int * 
{ 
    return *p = 3; 
} 

그런 다음, 그 포인터를 첫번째 장소에있는 포인터를 생성하고 전달하려는 경우 : I know the c always pass by values 올바르지 않습니다 :

int changeValue(int *); 
int main(void) 
{ 
    int i=15; 
    int *p; 
    p = &i; 
    *p; // *p == 15 at this point 
    //since p is already a pointer, just pass 
    //it as is 
    changeValue(p); 
    return 0; 
} 

int changeValue(int *q) //prototyped to accept int * 
{ 
    return *q = 3; 
} 

당신의 문이 점에 유의하는 것이 중요하다. 특히 큰 배열이나 구조체가 사용되는 경우 포인터가 더 작고 실제 변수보다 쉽게 ​​전달되기 때문에 포인터가 전달되도록 함수를 작성하는 것이 일반적입니다. &i (i의 주소)을 전달하는 것은 포인터를 전달해야하는 경우 p을 전달하는 것과 마찬가지로 작동합니다.

1
int i = 4; 
int * p = &i; 
changeValue(p); 
printf("%d",*p); 

void changeValue(int *p) 
{ 
    *p = 5; 
} 

전체 프로그램 - 간단하게 http://ideone.com/DCvhxE

+0

답변에 링크 된 짧은 (올바른) 예제 코드를 삽입하는 것이 어떻습니까? 답은'changeValue()'프로토 타입을 그리는 데 실패하므로 정확하지 않습니다. – alk

2

changeValue

changeValue(p); 

를 호출하여 전달하고 *pchangeValue()에에 값을 할당하여 (i)가 가리키는 변수의 값을 변경

void changeValue(int *p) 
{ 
    *p = an int value; 
} 
1

포인터를 changeValue에서 역 참조하고 할당하면 호출하는 프레임의 i 값이 변경됩니다.

는 예컨대 :

void changeValue(int *p) 
{ 
    *p = 0; 
} 
2
void changeValue(int*) ; 

int main(void) 
{ 
    int i = 4; // Suppose i is stored at address 1000h 
    int * p;  
    p = &i;  // Now p stores the address of i that is 1000h 

    changeValue(p); // Can also be written as changeValue(&i); 
    // Here you are passing the address of i to changeValue function 

    return 0 ; 
} 

void changeValue(int* p) // Accept a parameter of type int* 
{ 
    *p = 100 ; // store the value 100 at address 1000h 
    return ; 
} 
+2

코드가'changeValue()'프로토 타입을 그리는 데 실패했습니다. – alk

+2

함수의 첫 번째 모양 _in C_가 특정 리턴 유형으로 먼저 정의되지 않은 경우, 즉 리턴 유형이 모호한 경우 컴파일러가 int를 리턴한다고 가정하면 아마도 좋다. 처음으로'changeValue (p); '가 main에 나타나기 때문에 모호하기 때문에 컴파일러는'int'라고 가정합니다. 그런 다음 함수 정의에서'void changeValue (int *)'로 정의됩니다.결과적으로 _create_compile 시간 오류 _redeclaration이 발생합니다. 프로토 타입'void changeValue (int *);를'main()'의 어딘가에 추가하면 코드가 완벽합니다. (나는 downvoter가 아니지만 upvote 고정 된 경우) – ryyker

+0

@alk :: 내 실수. 나는 어리석은 곳에서 이것을 대답했다. – Abhineet

관련 문제