들어가며
자, 블로그를 시작하고 거의 처음 쓰는 글이다.
많이 미숙하고 오류가 있는 부분들도 있을 수도 있고
그날 점심으로 스파게티를 거하게 먹었음을 추리할 수도 있다.
하지만 참고 양해 바란다. 어차피 나 혼자 보는 일기장이기 때문이다.
각설하고, 방학을 의미있게 보내기 위해 C언어의 꽃, 포인터를 학습하려고 한다!
&(참조 연산자, 주소 연산자)
변수의 메모리 주소를 구할 때는 변수의 이름 앞에 '&'를 사용한다.
int main()
{
int num = 0;
printf("%p \n", &num); //이때 저 &num은 num이 저장된 메모리 공간 상의 주소값을 가리킨다.
//다시 한번 말하지만 '가리키는 것'이다.
return 0;
}
*(포인터 연산자)
포인터 변수를 선언할 때는 포인터의 이름 앞에 '*(Asterisk)'를 사용하여 선언한다.
#include <stdio.h>
int main()
{
int *numptr; // 포인터 변수 'numptr'을 선언하는 방식이다.
int num = 10;
numptr = # // 포인터 변수에는 '지정한 변수의 주솟값'을 저장한다.
return 0;
}
따라서 아래의 두 코드는 동일한 주솟값을 출력한다.
printf("numptr의 값: %p", numptr); //numptr에는 num의 주솟값이 '저장되어 있다'.
printf("&num의 값: %p", &num); //&num은 num의 주솟값을 '가리킨다'.
*(역참조 연산자)
역참조 연산자를 사용할 때는 포인터(포인터 변수) 앞에 '*'를 사용한다.
#include <stdio.h>
int main()
{
int *numptr; // 포인터 변수 numptr 선언
int num = 10; // 정수형 변수 num을 선언과 동시에 초기화
numptr = # // 포인터 변수 numptr에 num의 주솟값을 저장
printf("%d\n", *numptr); // numptr은 num의 주소가 저장되어 있음
// 역참조(*)를 하여 주소에 접근, num의 값을 가리킴
return 0; // 다시 말하지만 '가리키는 것'이다.
}
이 역참조를 통하여 본래의 num값을 수정할 수도 있다.
강제 자료형 변환
역참조 연산자는 자료형을 강제로 변환시킬 수 있다.
int *numptr;
int num = 10;
numptr = num1; // numptr은 'int 포인터형'이고 num은 'int형'
// 따라서 자료형이 일치하지 않아서 컴파일 오류 발생.
*numptr = num; // *numptr은 'int형'이고 num도 'int형'이므로 자료형이 일치함.
// 역참조(*)를 이용하여 numptr의 자료형을 강제로 변환함.
위 코드 처럼 'int 포인터 형'을 'int'형으로 강제 자료형 변환이 가능하다.
int *numptr;
int num;
numptr = &num1; // numptr은 'int 포인터형'이고, &num은 'int형 변수의 주소'이므로 자료형이 일치함
// numptr은 pointer to int, &num은 address of int이므로 자료형이 일치함
마지막으로 정리하자면 다음과 같다.
참고 및 출처
-
코딩 도장