포인터 인자와 주소 반환

Jeon곰탱·2022년 11월 24일
0

c-lang

목록 보기
13/13

📌 포인터 인자

🎯 값 인자 vs 주소 인자

  • 값 인자의 예
void change(int i){
	i = 10;
}
void main(){
	int a = 5;
    change(a);
    printf("%d",a);
}

함수가 시행되면 지역 변수 i가 10으로 변경되고, 함수가 종료되면 해당 함수의 지역 변수에 할당된 메모리 공간 해제되면서 변수 i는 유효하지 않는다. change 함수는 main 함수에 전혀 영향 미치지 못함!


  • 주소 인자의 예
void change(int *i){
	*i = 10;
}
void main(){
	int a = 5;
    change(&a);
    printf("%d",a);
}

함수가 시행되면 간접참조를 통해서 i가 가리키는 변수, 즉 main의 a에 영향을 끼친다.

위를 call by value 와 call by reference라고 한다.


🎯 주소 인자

void change(int *i){
	*i = 10;
}
void main(){
	int a = 5;
    int *pa = &a;
    change(pa);
    printf("%d",a);
}

swap 함수 만들어 보시오~


🎯 배열 인자 다시 보기

void init(int x[]) {
	x[0] = x[1] = 0;    
}
void main(){
	int ar[2] = {-2,4};
    init(ar);
    printf("%d %d,ar[0],ar[1]);
}
  • 한줄요약: int x[] 는 배열이 아니라 포인터

  • 즉, void init( int x[]) == void init (int *x) 완전 동일

  • 배열 포인터를 달라고 해서 저렇게 쓴거임


🎯 주소 반환

int *next_addr(int *p){
	return p+1;
}
void main() {
	int ar[5] = {2,1,3,0,4};
    int *pl;
    
    pl = next_addr(&ar[1]);
    printf("%d",*pl);
}

smaller 함수
smaller(&ar[1],&ar[3]);


🎯 포인터 배열

void main() {
int a=1,b=2,c=3;
int *pi[3];

pi[0] = &a;
pi[1] = &b;
pi[2] = &c;

*pi[0] = -100;

printf("%d",a);    

}

profile
Atomic habits make me

0개의 댓글