주소 값의 저장을 목적으로 선언되는 포인터 변수
int main(void)
{
char ch1='A', ch2='Q';
int num=7;
}
/* 총 6바이트(1바이트 + 1바이트 + 4바이트)가 메모리 공간에 할당
1바이트의 메모리 공간을 단위로 하나의 주소 값이 할당되며, 주소 값도 1씩 증가
C언어에서는 시작번지만을 가지고 위치를 표현 */
포인터 변수란 메모리의 주소 값을 저장하기 위한 변수
포인터 변수와 & 연산자
“정수 7이 저장된 int형 변수 num을 선언하고 이 변수의 주소 값 저장을 위한 포인터 변수 pnum을 선언 → pnum에 변수 num의 주소 값 저장"
int main(void)
{
int num=7;
int * pnum; // 포인터 변수 pnum의 선언
pnum = # // num의 주소 값을 포인터 변수 pnum에 저장
}
/* &연산자는 '오른쪽에 등장하는 피연산자의 주소 값을 반환하는 연산자'
pnum에는 변수 num의 시작번지 주소 값이 저장
-> 포인터 변수 pnum이 int형 변수 num을 가리킨다.
32비트 시스템 포인터 변수 -> 4바이트
64비트 시스템 포인터 변수 -> 8바이트 */
포인터 변수 선언
- 포인터 변수는 가리키고자 하는 변수의 자료형에 따라서 선언하는 방법이 달라짐, 사실 주소 값은 동일한 시스템에서 그 크기가 동일하며 모두 정수의 배열들 띔.
type * ptr; // type형 변수의 주소 값을 저장하는 포인터 변수 ptr의 선언
포인터와 관련있는 연산자: & 연산자, * 연산자
변수의 주소 값을 반환하는 & 연산자
int main(void)
{
int num = 5;
int * pnum = &num // num의 주소 값을 반환해서 포인터 변수 pnum을 초기화
}
/* & 연산자의 피연산자는 변수이여야 하며, 상수는 피연산자가 될 수 없다 */
int main(void)
{
int num1 = 5;
double * pnum1 = &num1; // 일치하지 않음!
double num2 = 5;
int * pnum2 = &num2; // 일치하지 않음!
}
포인터가 가리키는 메모리를 참조하는 * 연산자
int main(void)
{
int num=10;
int * pnum=# // 포인터 변수 pnum이 변수 num을 가리키게 하는 문장
*pnum=20; // pnum이 가리키는 변수에 20을 저장하라!
printf("%d", *pnum); // pnum이 가리키는 변수를 부호 있는 정수로 출력하라!
}
/* *pnum이 의미하는 바: 포인터 변수 pnum이 가리키는 메모리 공간인 변수 num에 접근 */
#include <stdio.h>
int main(void)
{
int num1=100, num2=100;
int * pnum;
pnum=&num1; // 포인터 pnum이 num1을 가리킴
(*pnum)+=30; // num1+=30; 과 동일
pnum=&num2; // 포인터 pnum이 num2를 가리킴
(*pnum)-=30; // num2-=30; 과 동일
printf("num1: %d, num2: %d\n", num1, num2);
return 0;
}
/* 결과
num1: 130, num2: 70 */
다양한 ‘포인터 형'이 존재하는 이유
포인터 기반의 메모리 접근 기준을 마련하기 위해
잘못된 포인터의 사용과 null 포인터
- 포인터 변수를 선언만하고 초기화하지 않으면, 포인터 변수는 쓰레기 값으로 초기화 → 어디를 가리킬 지 모르게 됌.
포인터 변수는 어떤 값으로 초기화를 시켜야 할까
int main(void)
{
int * ptr1=0;
int * ptr2=NULL; // NULL은 사실상 0을 의미
}
/* ptr1을 초기화하는 값 0을 가리캬 'Null 포인터'라 함.
"아무데도 가리키지 않는다!"를 의미함 */
'C' 카테고리의 다른 글
배열의 이해와 배열의 선언 및 초기화 방법 (0) | 2025.03.12 |
---|---|
변수의 존재기간과 접근범위 (0) | 2025.03.12 |
조건에 따른 흐름의 분기 (0) | 2025.03.12 |
반복 실행을 명령하는 반복문 (0) | 2025.03.12 |
printf, scanf (3) | 2025.03.12 |