못정함

C언어) 9-2. 포인터 완전 정복을 위한 포인터 이해하기 본문

C언어 공부/C언어 독학 (교재)

C언어) 9-2. 포인터 완전 정복을 위한 포인터 이해하기

hadara 2024. 10. 9. 15:15

-포인터는 변수이므로 값을 얼마든지 바꿀 수 있다. 

-언제든지 다른 주소를 저장하거나 포인터끼리 대입할 수 있다 

-그러나 대입 연산에 엄격한 기준이 적용된다.


<주소와 포인터의 차이>

주소 변수에 할당된 메모리 저장 공간의 시작 주소 값 자체

상수

포인터 주소를 저장하는 또 다른 메모리 공간

변수

따라서

-두 포인터가 같은 주소를 저장하는 것 가능 (하나의 변수를 동시에 가리킨다.)

 

-주소도 포인터처럼 간접 참조 연산자를 쓸 수 있지만, 상수이므로 대입 연산자 왼쪽에 올 수 없음.

&a = &b 불가능.

 


<주소와 포인터의 크기>

-포인터도 저장 공간이므로 그 크기가 있음 : 저장할 주소의 크기에 따라 결정된다.

-모든 주소와 포인터는 가리키는 자료형에 관계 없이 크기가 같다. 

-sizeof 연산자로 크기 확인


<포인터의 대입 규칙>

-포인터는 크기가 모두 같다.

<규칙>

1. 포인터는 가리키는 변수의 형태가 같을 때만 대입해야 한다. 

같은 포인터지만 int / double이 다를 경우 오류가 난다....  (이유는 생략)

2. 형 변환을 사용한 포인터의 대입은 언제나 가능하다.

-포인터가 가리키는 자료형이 달라도 형 변환 연산자를 사용하면 대입 가능.

근데 뭔가 이것도 문제가 잇음...;;; 메모리 저장방식을 정확히 이해하고 사용해야하지만 난 바보니까 그냥 사용하지 않기로 하자

 


<포인터를 사용하는 이유>

임베디드 프로그래밍: 메모리에 직접 접근하는 경우 임베디드 프로그래밍? 

Embedded System을 제어하기 위한 프로그램. (내장형 시스템). 생활 기기에서 특정 기능을 제어하기 위해. 
ex) 정수기에서 정수/냉수 구분하는 거
동적 할당한 메모리를 사용하는 경우

동적할당?

 컴퓨터 프로그래밍에서 실행 시간 동안 사용할 메모리 공간을 할당하는 것을 말한다. 사용이 끝나면 운영체제가 쓸 수 있도록 반납하고 다음에 요구가 오면 재 할당을 받을 수 있다.

 

두 변수의 값을 바꾸며 포인터 이해하기

#include <stdio.h>

void swap(int *pa, int *pb);   //함수 선언

int main(void)
{
    int a= 10, b= 20;

    swap(&a, &b);         //a,b의 주소를 인수로 준다
    printf("a:%d, b:%d\n", a, b);    //변수 a,b를 출력

    return 0;
}


void swap(int *pa, int *pb)  //  main이 돌아가면 pa, pb는 각각 a,b를 가리키는 상태가 됨.
{
    int temp;      //교환을 위한 임시 변수

    temp = *pa;    //temp에 pa가 가리키는 변수의 값을 저장
    *pa = *pb;     //pa가 가리키는 변수에 pb가 가리키는 변수의 값을 저장
    *pb = temp;    //pb가 가리키는 변수에 temp 값을 저장 
}

-swap 함수는 포인터를 통해 main함수의 변수 a,b를 공유하므로 두 변수를 직접 바꾸는 것이 가능.

-main함수의 변수 자체가 값이 바뀌는 것임

 

포인터 없이 두 변수의 값을 바꾸는 함수는 불가능한가?

 

다른 함수의 변수 사용하기  -> 불가능

#include <stdio.h>

void swap(void);

int main(void)
{
    int a= 10, b = 20;

    swap();
    print("a: %d, b:%d\n", a, b);

    return 0;
}

void swap(void)
{
    int temp;

    temp = a;
    a = b;
    b = temp;
}

함수 안에 선언된 변수명은 사용 범위가 함수 내부로 제한되기 때문. main 함수 안에 있는 a, b를 main함수 밖에서 사용할 수 없다. 

 


그렇다면...

변수의 값을 인수로 주자  (변수를 복사해서 사용) => 얘도 불가

#include <stdio.h>

void swap(int x, int y);

int main(void)
{
    int a= 10, b= 20;

    swap(a,b);
    printf("a:%d, b:%d\n", a, b);

    return 0;
}

void swap(int x, int y)
{
    int temp;

    temp = x;
    x = y;
    y = temp;
}

-컴파일 오류가 나는 것은 아닌데 

실행결과가 a: 10. b:20

swap 실패함

왜냐하면 함수는 오직 하나의 값만을 반환할 수 있기 때문. 한 번의 함수 호출을 통해 두 변수의 값을 바꾸는 것은 불가

 

 

와 포인터의 중요성을 깨달았다.