❓포인터란?
: 주소 그 자체이다. 즉, 메모리의 주소이다.
❓포인터 변수란?
: 메모리의 주소를 가지고 있는 변수를 의미한다.
메모리
: 변수가 저장되는 공간을 의미한다. 메모리는 byte 단위로 접근할 수 있다.
메모리에는 데이터 영역, Heap 영역, Stack영역이 있다.
데이터 영역: 전역 변수 및 static 변수가 할당되는 영역
(프로그램의 시작 시 할당되어 종료 시 소멸된다.)
Heap영역: 프로그래머가 할당하는 영역
(프로그래머가 명시적으로 할당하고 소멸시킨다.)
Stack 영역: 함수 호출 시 생성되는 지역 변수 및 매개 변수가 저장되는 영역
( 함수 호출이 완료되면 소멸된다.)
자료형 별 메모리에 저장되는 형식
int main(void){
int i = 10;
char c = 69;
float f = 12.3;
return;
}
위의 사진 처럼 각각의 크기에 따라서 저장이된다.
❓ 그런데 왜 char 형과 float형 사이에 3byte가 있는 걸까?
: 메모리는 4byte씩 읽기 때문에 C는 1byte라고 하지라도 메모리가 읽는 byte는 4byte이기 때문에 float은 3byte뒤인 12부터 저장된다.
포인터 연산자 - 변수의 주소(&)
: 변수의 주소를 계산하는 연산자는 &이다. 즉, 변수 앞에 &를 사용하면 해당 변수의 주소를 가져올 수 있다.
포인터(변수)의 선언
: 포인터(변수)란 주소를 가지고 있는 변수이다. 정수형 변수의 주소를 가지면 정수형 포인터 변수, 실수형 변수의 주소를 가지면 실수형 포인터 변수라고 불린다.
int number = 10; //정수형 변수 number에 저장
int *p; //정수형 포인터 변수 p 선언
p = &number; //포인터 변수 p에 number 변수의 주소 저장
포인터 연산자 - 간접 참조 연산자(*)
: 포인터가 가리키는 값을 가져오는 연산자
포인터 변수(*) vs 간접 참조 연산자(*)
포인터 변수(*) | 간접 참조 연산자(*) | |
의미 | 주소를 담는 변수 선언 | 포인터 변수가 가르키는 값에 접근 |
사용법 | int *p; char *c; ... | printf("%d", *p); *p = 10; |
연산자 여부 | X | O |
예제 - 포인터 변수가 가르키는 메모리의 값을 간접 참조 연산자(*)를 이용해서 변경하기
#include<stdio.h>
int main(){
int number = 10;
int *p;
p = &number;
printf("변수 number의 값1 = %d\n", number);
*p = 20;
printf("변수 number의 값2 = %d\n", number);
}
// [출력]
// 변수 number의 값1 = 10
// 변수 number의 값2 = 20
'2학년 2학기 > c언어' 카테고리의 다른 글
9-3장 포인터와 함수 (0) | 2024.10.28 |
---|---|
9-2장 포인터의 연산 (0) | 2024.10.28 |
8장 함수 (0) | 2024.10.25 |
7장 배열 (1) | 2024.10.25 |
6장 (1) | 2024.10.25 |