세리프 따라잡기

WEEK05 - TIL 포인터와 배열 간단 정리 본문

SW사관학교 정글

WEEK05 - TIL 포인터와 배열 간단 정리

맑은 고딕 2022. 5. 1. 14:31

- 포인터

 

printf("%p\n", &변수명) >> 변수의 메모리 주소를 구함

자료형 *포인터이름 >> 포인터 변수 선언

포인터 = &변수명; >> 변수의 메모리 주소를 포인터 변수에 저장

printf("%d\n", *포인터) >> 역참조 연산자, 포인터명의 메모리 주소에 접근해 값을 가져옴

*포인터 = 값 >> 역참조 연산자를 사용한 뒤에 갑을 저장하는 것. [값을 가져올수도, 저장할 수도 있음]

void *포인터이름 >> 자료형이 정해지지 않은 특성 때문에 어떤 자료형으로 된 포인터든 모두 저장가능
ㄴ> 단, void 포인터로는 역참조를 할 수 없고, 변수를 선언할 수도 없다.

자료형 **포인터이름 >> 포인터의 메모리 주소를 저장하는 포인터의 포인터를 선언 [이중 포인터]
ㄴ> 포인터도 실제로는 변수이기 때문에 메모리 주소를 구할 수 있지만, 일반 포인터에 저장할 수 없고, 이중 포인터에 저장해야 한다.
ㄴ> 포인터를 선언할 때 *의 개수에 따라서 삼중 포인터, 사중 포인터 그 이상도 만들 수 있다. 마찬가지로 역참조를 할 때도 *를 세 번, 네 번 또는 그 이상 사용할 수 있다.

포인터에 직접 (존재하지 않는) 주소값을 저장하면, 잘못된 메모리주소로 실행 에러가 난다.
반대로 실제로 존재하는 메모리 주소라면 포인터에 직접 저장할 수 있다.


- 배열

배열은 같은 자료형의 변수를 일렬로 늘여놓은 형태를 말한다.

배열의 인덱스가 0부터 시작하는 이유는 메모리 주소가 0부터 시작하기 때문
배열도 포인터로 취급되기 때문에 인덱스가 0부터 시작하면 요소 접근과 포인터 연산이 일치하게 된다.

배열의 모든 요소를 0으로 초기화 하는 방법 >> 자료형 배열이름[크기] = { 0, };

이미 선언된 배열의 크기를 구하려면 어떻게 해야하나?
배열이 차지하는 전체 공간과 요소의 개수는 'sizeof' 연산자를 활용하면 간단하게 구할 수 있다.

sizeof(배열): 배열이 차지하는 전체공간
sizeof(배열) / sizeof(자료형): 배열의 크기(요소 개수를 구함)

배열은 첫 번째 요소의 주솟값만 담고 있다.
int numarr[10] ={11, 22, 33, 44, 55, 66, 77, 88, 99, 110};
즉, 배열은 주솟값이기 때문에 포인터에 넣을 수 있다.

signed = 숫자의 양수, 음수를 전부 표현 가능한 값 (부호를 가질 수 있어서 양수인지 음수인지 구분ㅇ)
unsigned = 숫자의 양수만 표현 가능한 값 (부호를 가질 수 없어, 양수인지 음수인지 구분ㄴ)

배열과 포인터의 다른점은 크기를 계산했을 때이다. 배열에 sizeof 연산자를 사용하면 배열이 차지하는 전체 공간이 출력되지만 sizeof로 배열의 주소가 들어있는 포인터의 크기를 구해보면 그냥 포인터의 크기만 나온다(32비트라면 4, 64비트라면 8 >> 64에서는 포인터의 크기가 8이라서)

--- 구조체 포인터 ---
구조체는 멤버 변수가 여러 개 들어있어서 크기가 큰 편

 

Comments