배열 : 특정한 Type의 변수들 집합
int arr[5] = {1,2,3,4,5}
(배열 형) (배열의 이름)[원소 개수]
변수는 최상단에 선언되야 한다
컴파일러가 배열을 처리할 때 메모리 공간을 잡아야 하는데 공간의 크기는 상수여야 한다
상수 선언
const int a = 3;
배열의 배열 만들기
int arr[3][3] = {1,2,3,4,5,6,7,8,9}
int arr[2][3] = {{1,2,3},{4,5,6}}
다차원 배열은 맨 앞을 제외하고 다른 값들은 지정해줘야 함
a = 10
: 메모리 위치부터 4바이트를 할당하고 그 곳의 데이터를 10으로 바꾼다
int 형 변수가 정수 데이터를 저장하듯이 포인터도 특정한 데이터를 보관하는 변수이다
포인터는 특정한 데이터가 저장된 주소값을 보관하는 변수이다
%p는 16진수 형태로 출력
포인터는 특정한 데이터의 주소값을 저장한다. 포인터는 주소 값을 저장하는 데이터에 *를 붙여서 정의하고, & 연산자로 특정한 데이터의 메모리 상의 주소값을 알아올 수 있다
*는 저장된 주소값에 해당하는 데이터를 가리킨다
포인터에는 변수의 주소값이 들어가 있으며 여기에는 메모리가 차지하는 모든 주소의 위치가 있는 것이 아니라 시작 주소만 들어있다
상수포인터
const int* const a = &b;
포인터 덧셈/뺄셈
배열의 각 원소는 메모리 상에 연속으로 존재한다
int main(){
int arr[5] = {1,2,3,4,5};
int* parr;
parr = &arr[0];
printf("%d, %d", arr[2], *(parr+2));
return 0;
}
배열에서
arr
arr[0]
의 주소값은 동일하다
배열의 이름을 사용할 경우 첫 번째 원소를 가리키는 포인터가 된다
parr = &arr[0]
parr + 1은 parr의 주소값에 1이 더해지는 것이 아니라 1 * (포인터가 가리키는 타입 크기) 가 더해진다
포인터의 포인터
int a;
int *pa;
int **ppa;
pa = &a;
ppa = &pa;
printf("%d, %d, %d", a, *pa, **ppa);
2차원 배열
int arr[2][3];
arr[0] > arr[0][0]
arr[1] > arr[1][0]
int (*parr)[3];
: int형 이차원 배열이고 배열의 개수가 3개이다.
포인터 배열