본문으로 바로가기

[D+19] 포인터 (1)

category 해킹&보안/C언어 2017. 3. 7. 23:57
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

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