Trivia
1강.포인터(1) 본문
1.1 포인터란?
▶정의
- 메모리에 있는 데이터의 주소를 가지고 있는 변수
- 변수이지만 데이터값을 가지는 것이 아니라 데이터의 주소를 가짐
- 데이터의 복사를 피하고 공유하여 작업하고자 할 때 사용
ex) 컴퓨터공학부에 대해 알고싶을 때 도서관에 있는 책의 내용을 다 복사해오는것이 아니라
그 정보들이 있는 위치(주소)만 공유하는 것 (=call by reference)
- 변수가 저장되는 주소와 매우 밀접한 관계
cf) 변수는 컴퓨터의 메모리에 저장
cf) 메모리는 바이트 단위로 접근하며 변수의 크기에 따라서 차지하는 메모리 공간이 달라짐
ex) char형 변수: 1byte, int형 변수: 4byte
▶주소 연산자 '&'
- 변수의 주소를 계산하는 연산자
- 변수의 이름을 받아서 변수의 주소를 반환
ex) 변수 i의 주소: &i
ex) 예제 프로그램
#include <stdio.h>
int main()
{
int i = 6;
char c = 69;
float f = 12.4;
printf("i의 주소 : %u\n",&i);
printf("c의 주소 : %u\n",&c);
printf("f의 주소 : %u\n",&f);
return 0;
}
i의 주소 : 6356748
c의 주소 : 6356747
f의 주소 : 6356740
▶포인터 변수 : 변수의 주소를 가지고 있는 변수
▶포인터의 선언 : (자료형) *(포인터의 이름);
ex) int *p;
▶포인터와 변수의 연결
- &연산자를 이용하여 변수의 주소를 포인터에 대입
ex) int i = 10; //정수형 변수 i 선언
int *p = &i; //변수 i의 주소가 포인터 p로 대입
- 포인터는 사용하기 전엔 반드시 초기화
1.2 간접 참조 연산자 *
▶간접 참조 연산자 *의 해석 : 지정된 위치에서 포인터의 타입에 따라 값을 읽어 들임
▶&연산자와 *연산자
- &연산자: 변수의 주소를 구하여 포인터에 대입할 때 사용하는 연산자
- *연산자: 포인터를 통하여 변수를 간접 참조할 때 사용하는 연산자
ex) 예제 프로그램
#include <stdio.h>
int main()
{
int i = 3900;
int *p = &i;
printf("i = %d\n", i); //변수의 값 출력
printf("&i = %u\n", &i); //변수의 주소 출력
printf("*p = %d\n", *p); //포인터를 통한 간접 참조 값 출력
printf("p = %u\n", p); //포인터의 값 출력
return 0;
}
i = 3900
&i = 6356744
*p = 3900
p= 6365744
1.3 포인터 사용 시 주의할 점
▶초기화하지 않고 사용하기 : 선언만 하고 초기화를 하지 않을 경우 임의의 주소를 가리키게 됨
▶널 포인트의 사용 : 포인터가 아무것도 가리키고 있지 않을 때는 NULL(0)로 설정
ex) int *p = NULL;
▶포인터 타입과 변수의 타입은 일치해야 함