Eat Study Love

먹고 공부하고 사랑하라

SW 만학도/C

5. Pointer - Motivation in C

eatplaylove 2024. 3. 26. 21:24

https://eglife.tistory.com/41

 

4. Function ic C - Grammer

https://eglife.tistory.com/40 3. Control Structures in C - Condition ( While / For Loop ) https://eglife.tistory.com/33 2-1. Operators / Memory in C https://eglife.tistory.com/32 2. Variables in C 아무리 봐도 불친절한 C.. 파이썬을 배우다가

eglife.tistory.com

 

 

파이썬과 C는 매우 다르다.

 

C와 C++을 10년 이상 공부를 해도 한 2~3개월만 파이썬 하다보면 C, C++의 기본적인 내용도 순간 까먹을 수 있다.

 

C의 가장 큰 특성?

 

C에선 Data type, Parameter 등등을 Variable , Function(최소한 이름이라도!) call 하기 전에 Declare 해줘야 한다.

 

C프로그래밍의 꽃 Poiner! 이번 시간엔 요것을 다뤄보자

 

Pointer - Call by Value

 

#include <stdio.h>

void swap(int firstVal, int secondVal);

int main(void)
{
    int valA = 7;
    int valB = 5;
    printf("Before swap: valA=%d,valB=%d\n",valA,valB);
    swap(valA,valB);
    printf("After swap: valA=%d,valB=%d\n",valA,valB);
    return 0;
}

void swap(int firstVal,int secondVal)
{
    int temp;
    temp = firstVal;
    firstVal = secondVal;
    secondVal = temp;

    printf("in swap:firstval=%d,secondval=%d\n",firstVal,secondVal);
}

// Before swap: valA=7,valB=5
// in swap:firstval=5,secondval=7
// After swap: valA=7,valB=5

 

- Swap 함수가 다 끝났는데, Data가 Swap되지 않는다. 뭐가 이상한 것일까~

 

- Local Variable firstVal 과 secondVal은 function swap이 끝나면 죽는다!

( 즉, 얘네들은 main 함수 내에 valA, valB와 아무런 상관이 없다. )

 

val A/B , first/second val은 값은 같지만 memory가 아예 다르다 --> Call by Value

 

 

 

- Swap함수가 끝나면 그 안에 있던 Local Variable들은 사라진다

 

 

 

- Call by Value는 함수 하나가 끝나버리면 그 영향력이 함수가 끝나면 끝!

 

Pointers

 

- 함수 안에 있는 것들이 밖에 있는 친구들(in Main 함수)에게 영향력을 끼치게 하려면 어떻게 해야하나?

 

- Pointer라는 variable은 address 값을 저장한다.

 

- ex) int var 은 int 값을 저장하고 있고, int *ptr 은 int 값을 갖는 주소를(4byte 단위) 저장한다.

 

int main(void)
{
    int intVar = 10;
    int *intptr;
    intptr = &intVar;
}

 

 

 

- 위에서 intptr은 intVariable이라는 int 값이 저장된 주소를 가르킨다.( Pointing! )

 

- star 표시(*)를 이용해서 그 주소값에 해당하는 값을 불러올 수 있다. *ex) *intptr --> intVariable = 10

 

int main(void)
{
    int intvar = 10;
    int *intptr;
    intptr = &intvar;
    printf("%d, %d , %d, %d\n", intptr,*intptr,intvar,&intvar);

    *intptr +=1;
    printf("%d , %d \n",*intptr,intvar);

    return 0;
}

//6422036, 10 , 10, 6422036
//11 , 11

 

 

- int Pointer에서 *intPtr과 int variable인 intVar은 동시에 변한다.

 

- Swap 함수 Pointer 이용해서 다시 한 번 수정해보기

 

#include <stdio.h>
void swap(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
    printf("in swap 1st : %d, 2nd: %d\n",*a,*b);
}

int main(void)
{
    int first = 1;
    int second = 100;
    printf("Before swap 1st:%d,2nd:%d\n",first,second);

    swap(&first, &second);

    printf("After swap 1st:%d,2nd:%d\n",first,second);


    return 0;
}
// Before swap 1st:1,2nd:100
// in swap 1st : 6422044, 2nd: 6422040
// After swap 1st:100,2nd:1

 

 

- 요걸 메모리 관점에서 한 번 봐보자

 

 

 

 

- first / second Val memory가 value 5,7이 아니고 그들의 주소값을 저장한다!!

 

- valA = *firstVal ,  valB = *secondVal

 

- Call by Reference --> Local 함수 실행중에 Main 함수에 있는 값이 바뀐다~~~~~~

 

 

newSwap 함수가 끝나면 거기에 해당하는Memory 싹~ 삭제되는데 그래도 valA,B바뀜

 

 

Pointer - etc.

 

- Null pointer : 아무것도 안 가르키는 pointer를 initialize --> python에서 NULL과 같다.

 

- int *ptr; , ptr = NULL; (요렇게 초기화 시키는 것을 추천, 이게 아니면 쓰레기 값을 포인팅한다!)

 

 

 

- *ptr 이라는 것은 ptr이라는 Variable을 선언할건데, 그 앞에 *이 붙어있으니 요놈을 Dereference하면 그 앞에 int 값을 반환한다는 뜻이다. (int *ptr)

 

- scanf 에서 쓰던, &input은 input값의 주소에 입력된 값을 넣겠다는 뜻. input variable의 주소를 줬으니 사용자가 뭘 쓰던 어떤 값을 쓰던 type만 맞으면 그놈을 받아서 저장하도록 허용!

(주소값을 안 넘기면 사용자가 뭘 입력하든 input 이라는 Variable에는 아무런 영향을 끼치지 못한다. 이 글 초반부에 Swap이 발생하지 않던 함수꼴)

 

- sacnf에 주소값을(&) 쓰지 않는다면 ~ 어차피 C compiler에서 Error를 날려준다 ㅎㅎ

 


 

나중에 pointer of pointers, arr **ptr 처럼 포인터를 포인팅하는 포인터도 있고

 

다차원 구조에서 pointer 통해 variable call하는 것도 있던데..

 

잘 구분해야겠다.

 

고수분이 말했다. Poiner는 개념적으로 이해하려하면 더 어렵게 다가온다.

 

그냥 Physical하게 느껴라. 대충 그 느낌을 느끼면 코딩하는데엔 아무런 문제가 없다.

 

넵! 말씀 새겨 듣겠습니다.