C 언어 포인터 정복하기
TAE-HYONG KIM
COMPUTER ENG, KIT
5강. 포인터의 개념 이해하기
학습 내용
함수 scanf()를 고민해보자
포인터가 왜 필요한가?
포인터는 어떤 정보가 필요한가?
포인터 구하기
포인터 값 확인하기
포인터가 참조하는 값 구하기
2
scanf() 살펴보기
scanf()는 무슨 일을 할까?
프로그램에서 scanf()에 주는 입력은 변환문자열 (“%d”)과 입력할 변수(&a)이다
scanf()는 키보드(stdin)로부터 정수 입력을 받아 변수 (a)에 저장한다(변수 a의 내용을 바꾼다)
어떤 함수에서 다른 함수의 지역변수 값을 바꿀 수 있 나?
scanf() 함수의 인자로 왜 a가 아닌 &a를 넘겨줄까?
int a = 0;
printf(“정수값을 입력하세요: ”);
scanf(“%d”, &a);
C 프로그램과 메모리
int a; double b; char c;
91 92 93 94 95 96 97 98 99 100 101 102 103
a b
c a = 10; b = 1.0; c = ‘a’;
10 1.0
‘a’
100 101 102
103
a
Little Endian: Lower SB Lower Address 00001010
00000000 00000000 00000000
함수 외부의 변수에 접근하기
변수에 읽고 쓰기
함수 내부의 변수는 변수 이름을 이용해 쉽게 읽고 쓸 수 있다
함수 외부의 변수는 인자를 통해 값을 할당 받아서 (call by value) 읽을 수 있지만 직접 쓸 수는 없다
• 함수 외부의 변수는 변수 이름을 통해 내부에서 직접 접 근할 수 없다(invisible)
함수 외부의 변수 값 에 접근할 수 있는 방법은?
• 메모리에 직접 접근해야 한다
int a, b; a = 10; b = a;메모리 저장 값에 접근하기
메모리에 저장된 값을 읽어오려면?
100 101 102
103
00001010 a
00000000 00000000 00000000
X
100번지에 저장된 4바이트 정수(int) 값 을 읽어오자
알아야 할 정보는?
4개 바이트 공간의 주소: 100, 101, 102, 103
저장되어있는 값의 형식: 정수(4바이트)
• 음수표현을 위해 2의 보수 시스템 사용
• 따라서 4개 주소 중 한 값(처음 주소)만 알면 된다
저장되는 형식: little endian
• 시스템에서 자동 결정
메모리 주소는 어떻게 알 수 있을까?
변수의 저장 주소는 실행할 때마다 바뀐다
C의 해결책: 포인터
변수를 통해 메모리에 저장된 값 접근
100 101 102
103
00001010 a
00000000 00000000 00000000
X
변수 a 대신 필요한 정보 모음을 주는 방법
a의 포인터 &a
&: 포인터(주소)연산자
&a(a의 포인터)에 들어있는 정보
변수 a가 저장된 공간의 시작 주소: 100
변수 a가 저장되는 방식: int (4바이트 정수)
scanf()에 &a를 넘겨주면
scanf()는 정확히 a의 차지하는 공간에 a가 저장 되는 방식으로 값을 저장할 수 있다!
포인터의 개념
포인터의 개념적 표현
포인터 &a가 100번지에 있는 정수형 공간을, 또는 100번지 에 저장된 정수 를 가리킨다 고 말한다
100 101 102
103
00001010 a
00000000 00000000 00000000
&a
100
int &a
100
int
포인터에 저장된 주소 얻기
포인터에 저장된 주소(가리키는 공간의 첫 주소) 확인하 기
printf() 함수를 이용해 확인할 수 있다
주소는 항상 양수이므로 “%d”보다는 “%u”를 사용
포인터 연산은 정수 단위가 아니라 포인터가 가리키는 공간 자 료형의 크기를 단위로 하는 연산이다
9
int a = 10;
printf(“%u”, &a);
int a = 10;
printf(“%u, %u”, &a, &a+1);
포인터가 가리키는 공간/값 얻기
포인터로 메모리 저장 값 접근
포인터가 가리키는 공간을 얻는 참조연산자 : *
• 사용법: *포인터
• 해당 공간을 변수처럼 사용할 수 있다
포인터가 가리키는 값 읽어서 변수에 저장하기
포인터가 가리키는 공간에 값 저장하기
10
int a; *(&a)
int a=10, b;
b = *(&a);
int a, b=10;
*(&a) = b;