파이썬과 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와 아무런 상관이 없다. )
- 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 함수에 있는 값이 바뀐다~~~~~~
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하게 느껴라. 대충 그 느낌을 느끼면 코딩하는데엔 아무런 문제가 없다.
넵! 말씀 새겨 듣겠습니다.
'SW 만학도 > C' 카테고리의 다른 글
Review 2 - Control Structures / Functions in C (0) | 2024.07.03 |
---|---|
Review 1 - C programming basics (0) | 2024.07.03 |
4. Function ic C - Grammer (1) | 2024.03.25 |
3. Control Structures in C - Condition ( While / For Loop ) (0) | 2024.03.25 |
2-1. Operators / Memory in C (0) | 2024.03.20 |