C언어 기초 프로그래밍 문법 - 포인터
포인터
포인터는 메모리 주소를 저장하는 ‘변수’다. 즉 다른 값이 저장된 공간(변수)을 가리킨다. 일반적인 변수는 주소에 값을 저장하는 것이지만, 포인터 변수는 값이 저장된 ‘주소’를 저장하는 것이 차이다.
1. 포인터 형태
type * 포인터 변수명
- 포인터 변수의 type(자료형)은 가리킬 변수의 type과 일치해야 한다.
→ ‘주소 값’은 정수이지만, 자료형별로 실제 크기가 다르기 때문이다.
→ ‘주소 값’의 범위는 4byte, 포인터 변수의 크기는 4byte로 고정되어 있다.
2. 주소를 다루는 방법
&연산자 (주소연산자)
scanf("%d", &iNum);
&연산자는
1) 변수의 주소 값을 반환한다. (연산의 결과가 주소 값)
2) 시작 주소를 가르쳐준다. (type의 크기에 맞게 알아서 공간사용)
3. 포인터를 다루는 방법
*연산자 (간접 참조 연산자)
int * pNum = NULL; // NULL은 초기화 값
NULL 은 정수 0이다. (포인터인 것을 명시하려고사용)
포인터에서 0은 주소 값이 ‘0이다‘ 라고 해석하는 것이 아니라 가리키는 공간이 없다고 해석한다.
4. 포인터를 사용하는 이유
첫 번째, 함수의 수행문에서 함수 외부의 변수에 접근가능하다.
두 번째, 동적 할당을 위해 사용한다. 동적 메모리 할당은 프로그래밍에서 실행 시간 동안 사용할 메모리 공간을 할당하는 것을 말한다. 동적으로 할당된 메모리 공간은 프로그래머가 명시적으로 해제하기 전까지 계속 유지된다.
동적 할당
함수를 이용하여 '런타임' 도중 원하는 크기의 메모리 할당한다. malloc() 으로 동작 할당한 공간은 자동소멸이 되지 않는다.반드시 malloc()으로 할당된 공간은 사용을 다한 뒤, free()로 삭제해줘야 한다.
런타임: 프로그램 실행 중
malloc() : 메모리할당(공간을 만든다.)
free() : 할당된 메모리 해제(공간해제)
정적 할당
일반 변수나 배열( 코드에 공간의 크기 고정), 일반적으로 작성하던 방식이다. 기본적으로 자동으로 소멸된다.
배열과 포인터의 관계
배열에서 ‘배열명’은 첫 번째 요소의 주소(시작주소)를 의미한다. 즉 포인터처럼 주소값을 가리킨다. 2차원 배열에서 [ ][ ] 인덱스를 하나만 [ ] 사용하면 한 ‘행’의 시작주소를 의미한다. 배열변수를 포인터변수에 저장하면 똑같이 다룰 수 있다. 배열과 포인터의 차이점은 ‘크기’, ‘변수의 연산 여부’이다.
예제
#include <stdio.h>
void main()
{
int iValue = 0;
int* pValue = &iValue;
// pValue만 이용하여 코드 완성하기
printf("숫자 입력 : ");
scanf("%d", pValue);
printf("입력한 값의 2제곱은 %d 입니다.\n", (*pValue) * (*pValue) );
}
'C언어' 카테고리의 다른 글
C언어 프로그래밍 기초 문법 - 배열(Array) (0) | 2020.03.25 |
---|---|
C언어 프로그래밍 기초 문법 - 함수(Function) (0) | 2020.03.17 |
C언어 프로그래밍 기초 문법 - 반복문(Repetitive) (0) | 2020.03.14 |
C언어 프로그래밍 기초 문법 - 조건문(Conditional) (0) | 2020.03.08 |
C언어 프로그래밍 기초 문법 - 연산자(Operator) (0) | 2020.02.28 |