변수는 그 자체로 자신의 자료형에 맞는 값을 저장했다.
포인터 변수형은 메모리 주소를 저장한다.
ex ) int형 포인터(int *)는 int 변수값의 위치값을 저장한다고 생각하면 된다.
포인터 - 특정한 변수 자체가 존재하는 메모리 주소값을 가진다
ex) int*a = &변수명; (주소값을 담는과정)
정의부에서 사용하는 *은 '주소의 값'을 의미함.
&는 포인터에서 주소를 가져올 때 사용 ( 주소연산자 )
포인터 (*) - 포인터를 선언할 때 사용 ( 선언부 )
간접참조 연산자(*) - 선언된 포인터 변수가 가리키는 변수를 구함 ( 정의부 )
포인터는 다중으로도 사용 가능하다.
포인터의 포인터가 존재 할 수 있다!
#include <stdio.h>
int main(void)
{
int a = 5;
int *b = &a;
int **c = &b;
printf("%d \n", **c);
return 0;
}
출력값 : 5
* 는 차원수를 의미하며 *가 하나 씩 늘어날 때마다 *수가 하나 적은 것을 담을 수 있다.
예를 들자면,
int* 는 int를 담을 수 있다.
int**는 int*를 담을 수 있다.
int* 자료형은 int의 주소를 담는 자료형이다.
배열의 이름은 배열 주소값 자체를 가지고있다.
int a[] = {1,2,3,4,5};
int *b = a;
printf("%d\n", b[2]);
출력값 3
배열과 포인터는 상호 치환되어 사용이 가능하다.
(내부적으로 거의 동일하기 때문)
다만 차이점은 배열은 포인터 '상수'라는 점이다.
이것으로 배열 포인터, 포인터 배열이 무엇인지 잘 생각해보면 좋다.
포인터 배열 : 배열의 요소들이 포인터 인 것(포인터 변수들을 저장하는것)
int num1 = 10 , num2 =20 , num3 = 30;
int *arr[3] = {&num1, &num2, &num3};
배열 포인터 : 배열을 가리키는 포인터 (배열의 이름은 배열 주소값 자체를 가지고 있으니 비슷한 개념이다.)
arr[2][3] = {{1,2,3},{4,5,6}};
(int*)pArr[3] = arr; (이 경우에 배열과 똑같이 참조가능)