[c언어] 배열, 포인터 간단 정리
pIutos
2022. 9. 22. 13:30
pointer
포인터를 선언할 때도 *를 사용하고 역참조를 할 때도 *를 사용한다. 같은 * 기호를 사용해서 헷갈릴수 있지만 선언과 사용을 구분해서 생각하면 된다. 즉, 포인터를 선언할 때 *는 이 변수가 포인터다라고 알려주는 역할이고, 포인터에 사용할 때 *는 포인터의 메모리 주소를 역참조하겠다라는 뜻.
int *numPtr; // 포인터. 포인터를 선언할 때 *
printf("%d\\n", *numPtr); // 역참조. 포인터에 사용할 때 *
int num;
int *numPtr;
*numPtr = # (x)
numPtr = # (o)
*numPtr = num; (o)
// *numPtr은 int형, numPtr은 포인터형(int형 포인터)
// num 은 int형, &num은 주소형
// 이때 주소형과 포인터형은 동일시함. ( pointer to int와 address of int는 자료형이 같음 )
sizeof
int numArr[10] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 110 }; // 크기가 10인 int형 배열
printf("%d\\n", sizeof(numArr)); // 40
printf("%d\\n", sizeof(numArr) / sizeof(int)); // 10 (int의 size는 4이므로)
위 numArr의 사이즈는 배열 공간 10 x int 자료형의 크기 4이므로 40이다.
malloc
malloc(할당) → 사용 → free(해제) 과정을 거쳐 사용할 수 있다.
malloc으로 메모리를 할당하면 할당된 주소값이 주어지기 때문에 포인터로 주소값을 저장해야한다.
int x = 6; 이런식으로 할당한 값은 메모리공간의 스택(stack)에 할당되어 생성 뒤 따로 처리를 해주지 않아도 되지만, malloc으로 할당하면 메모리공간의 힙(Heap) 공간에 할당되기 때문에 꼭 메모리 해제를 해주어야함!(그렇지 않으면 메모리누수 발생)
int *numptr;
numptr = malloc(sizeof(int));
// *numptr = malloc(sizeof(int))와 같다
printf("%p\\n", numptr); // 메모리 주솟값!!
*numPtr = 10; // 포인터를 역참조한 뒤 값 할당
printf("%d\\n", *numPtr); // 10: 포인터를 역참조하여 메모리에 저장된 값 출력
free(numptr); // 꼭 해제해주어야함.
array
배열을 포인터에 할당한 뒤 포인터를 역참조해보면 배열의 첫 번째 요소의 값이 나온다. 마찬가지로 배열 자체도 역참조해보면 배열의 첫 번째 요소의 값이 나온다. 따라서 실제로는 배열도 포인터라 할 수 있다.
-> 포인터를 선언하고 배열처럼 쓸수있고, 배열을 선언하고 포인터로 쓸 수 있다!
int numArr[10] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 110 };
// 크기가 10인 int형 배열
int *numPtr = numArr; // 포인터에 int형 배열을 할당 - 배열자체가 주소값가짐
printf("%d\\n", *numPtr); // 11: 배열의 주소가 들어있는 포인터를 역참조하면 배열의
// 첫 번째 요소에 접근
printf("%d\\n", *numArr); // 11: 배열 자체를 역참조해도 배열의 첫 번째 요소에 접근
배열의 주소가 들어있는 포인터는 인덱스를 통하여 요소에 접근할 수 있다.
printf("%d\\n", numPtr[5]); // 66: 배열의 주소가 들어있는 포인터는 인덱스로 접근할 수 있음
int *numPtr = numArr; 처럼 배열을 포인터에 바로 할당할 수 있다. 단, 자료형이 서로 같아야 하며 1차원 배열이라면 *가 한 개인 단일 포인터야 한다.
array & pointer
int numArr[10]; // int형 요소 10개를 가진 배열 생성
int *numPtr = malloc(sizeof(int) * 10); // int 10개 크기만큼 메모리 할당
numArr[0] = 10; // 배열을 인덱스로 접근하여 값 할당
numPtr[0] = 10; // 배열처럼 포인터를 인덱스로 접근하여 값 할당
free(numPtr); // 메모리 해제