5. 포인터
1) 포인터 & 포인터 변수
▣ 포인터
- 메모리 공간을 가리키는 주소 값
▣ 포인터 변수
- 메모리 공간을 가리키는 주소 값을 저장하는 공간
- 일반적인 변수 선언과 동일하나 변수명 앞에 * 를 붙여줘야 함.
☞ int *a, b; 일때 a는 포인터 변수이나 b는 그냥 int형 변수임.
- 포인터 변수의 주소랑 변수 안에 저장해놓은 주소(저장값)랑 구분 중요!!
#include <stdio.h> int main() { int *pData1; char *pData2; void *pData3; return 0; }
- 5줄 : int형을 가리키는 포인터 변수 선언
- 6줄 : char형을 가리키는 포인터 변수 선언
- 7줄 : 모든 형태의 주소를 저장 (형태에 제한이 없음)
- 메모리에 접근하려면 주소와 크기가 필요.
☞ but, void * 는 크기가 정해져 있지 않으므로 직접 크기를 지정해줘야하는 번거로움이 존재
ex) *(int *)pData3
☞ void * 변수는 단순 주소 저장에만 용이함.
☞ 예를 들어, fwrite함수의 첫번째 인자도 void * 형태임. (크기는 뒷 인자에서 받음)
2) 매개변수 전달 방식
▣ Call by Value (값에 의한 전달)
#include <stdio.h> void Swap(int a, int b) { int tmp; printf("[2] : x = %d, y = %d\n", a, b); tmp = a; a = b; b = tmp; printf("[3] : x = %d, y = %d\n", a, b); } int main() { int x = 10, y = 20; printf("[1] : x = %d, y = %d\n", x, y); Swap(x, y); printf("[4] : x = %d, y = %d\n", x, y); return 0; }
- 스택
- 결과 화면
▣ Call by Address (주소에 의한 전달)
#include <stdio.h> void Swap(int *a, int *b) { int tmp; printf("[2] : x = %d, y = %d\n", *a, *b); tmp = *a; *a = *b; *b = tmp; printf("[3] : x = %d, y = %d\n", *a, *b); } int main() { int x = 10, y = 20; printf("[1] : x = %d, y = %d\n", x, y); Swap(&x, &y); printf("[4] : x = %d, y = %d\n", x, y); return 0; }
- 스택
- 결과 화면
☞ 위의 call by value와는 달리 main 함수에 돌아와서도 x와 y의 값이 바뀌어 있음을 확인 가능.
i2sec 대구지점 23기 수료생.
'해킹&보안 > C언어' 카테고리의 다른 글
[D+22] 문자열 처리 함수 (0) | 2017.03.19 |
---|---|
[D+20] 포인터 (2) (0) | 2017.03.08 |
[D+18] 파일 입출력 심화(스테가노그래피) (2) | 2017.03.06 |
[D+17] 함수 (0) | 2017.03.02 |
[D+16] 파일 입출력 (2) (0) | 2017.03.01 |