-> 값을 저장하는 것이 아닌, 값의 위치(주소)를 저장하는 변수
ex>
int* myPointer; -->> int형 변수의 위치
int a;
a = 5;
myPointer = &a; -->> int형 변수 a가 있는 위치
printf("%d\n", *myPointer);
int* 은 자료형 즉, 타입이다!!
변수앞에 * = 주소를 따라가서 해당 값을 가져오는 것 // 두 개 구분 잘하기
&x : x의 주소
*x : 주소x가 가리키는 변수의 값
#include <stdio.h>
int main() {
int* address;
int x;
x = 3;
address = &x;
printf("%p\n", address); // 주소 출력은 %p 사용
*address = 4;
printf("%d\n", x);
printf("%p\n", address);
return 0;
}
주소값은 바뀌지 않는다
저장되는 int 값은 변경
포인터 : 컴퓨터 내부 중에서도 저장장치(메모리)에 관한 것
<자료의 저장 단위>
비트 : 정보의 가장 작은 단위 / 0 혹은 1 을 담음
바이트 : 정보의 기본 단위 / 8개의 비트로 이루어짐
int - 4byte, double - 8byte
KB = 1000byte / MB = 1000KB / GB = 1000MB
<RAM 과 NUMA architecture>
RAM -> 자료를 저장하기 위한 장치 / Random Access Memory
NUMA -> none uniform memory access / cpu 별로 메모리에 접근 시간 다르다
<Big Endian & Little Endian>
-> 컴퓨터가 값을 저장하는 순서
Big Endian -> 높은 자리가 낮은 주소에 저장 (거꾸로)
-> 하드웨어(메인보드, 하드디스크, RAM...)를 제어하기 위한 소프트웨어
<기억장소 할당>
<malloc (memory allocation)>
void* malloc(int x); -> x byte의 공간을 할당하여 가장 앞의 주소를 반환
int *, char * 여러 개 있으므로 malloc으로 공간 할당 후 맞는 타입으로 캐스팅 해줘야 한다
malloc 자체는 void* 타입
#include <stdio.h>
#include <stdlib.h>
int main() {
int* a;
a = (int*)malloc(8);
*a = 10; // a가 가리키는 곳에 10을 넣어라
*(a+1) = 20;
printf("%d\n", *a);
printf("%d\n", *(a+1));
return 0;
}
a 는 공간을 몇 byte 받았는지 모름
a는 int형 가리키고 있으므로 4byte 공간에 10을 저장
a+1은 a가 가지고 있는 주소의 다음 주소
-> a가 가리키는 값의 다음 값
단순히 1 더하는게 아니라 int에 해당하는 4를 더한 주소
(a는 int형 변수를 가리키므로)
int* a;
a = (int*)malloc(sizeof(int) * 10 );
==>> int a[10]; 과 같은 의미!!
*a = 10;
*(a+1) = 20;
*(a+2) = 30;
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
a[0] = 10;
a[1] = 20;
a[2] = 30;
배열의 형태가 된다 / 두 의미가 같다
a를 그냥 출력하면 주소값이 나온다!(배열 시작 주소)
a+1은 a가 int형 포인터이므로 4를 더한 주소가 출력된다
printf("%p", a) = printf("%p", &a[0])