메모리 상의 특정한 데이터의 주소값을 보관
하는 변수
(포인터도 변수의 한 종류)
&(주소를 계산할 데이터)
특정한 데이터의 메모리 상의 주소를 알 수 있다
저장된 주소값에 위치한 데이터
왜 포인터에 타입이 있을까
int a; pointer *p //형태가 없는 포인터라고 가정함 p = &a; *p = 4;
모든 주소들의 위치가 아닌 시작 주소만 들어가 있기 때문에
*p 여기서 메모리에서 얼마만큼 읽어들여야 하는지 모름
const int* p = &a;
p가 가르키는 데이터의 값을 못바꿈
a = 10; //(o)
*pa = 10; //(X)
원래 변수 값은 지정해서 바꿀수 있다.
(p만 상수로 지정되었기에 a는 전혀상관없다.
int* const p = &a;
p가 가르키는 주소의 값을 못바꿈
pa = &b; //(X)
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* parr;
int i;
parr = &arr[0];
for (i = 0; i < 10; i++)
{
printf("arr[%d]의 주소값 : %p ", i, &arr[i]);
printf("(parr + %d)의 주소값 : %p", i, (parr + i));
if (&arr[i] == (parr + i))
{
printf("-->일치\n");
}
else printf("--> 비일치\n");
}
printf("arr[3] = %d, *(parr + 3) = %d \n", arr[3], *(parr + 3));
return 0;
}
배열의 주소에 다음 배열이 있어서 포인터로 배열을 사용가능하다.
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* parr;
int i;
parr = &arr[0];
printf("sizeof(arr) : %d \n", sizeof(arr));
printf("sizeof(parr) : %d", sizeof(parr));
return 0;
}
#include <stdio.h>
int main() {
int arr[2][2] = { {1,2}, {3,4} };
printf("%d\n", *arr[0]);
printf("%d\n", *arr[1]);
}
int (*parr)[3]
int* parr[3]
첫번째는 int형 2차원 배열을 가르키는 배열 포인터(2차원 배열 포인터)
두번째는 int형 배열을 가르키는 포인터 배열(배열의 요소가 포인터이다)
arr와 arr[0]의 주소값은 왜 동일할까?
C 언어 상에서 배열의 이름이 sizeof 연산자나 주소값 연산자(&)와 사용될 때를 제외하고
배열의 이름을 사용시 암묵적으로 첫 번째 원소를 가르키는 포인터 타입으로 변환되기 떄문에 arr와 arr[0]의 주소값은 동일하다
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("arr[3] : %d\n", arr[3]);
printf("3[arr] : %d\n", 3[arr]);
printf("*(3+a) : %d", *(arr + 3));
return 0;
}
arr[3]이 컴파일러에 의해 *(arr +3)로 변환된다.
int main()
{
int arr[3] = { 1, 2, 3 };
int* parr;
parr = arr;
printf("arr[1] : %d \n", arr[1]);
printf("parr[1] : %d \n", parr[1]);
return 0;
}
int main()
{
int a;
int* pa;
int** ppa;
pa = &a;
ppa = &pa;
a = 3;
printf("a : %d // *pa : %d // **ppa : %d \n", a, *pa, **ppa);
printf("&a : %p // pa : %p // *ppa : %p \n", &a, pa, *ppa);
printf("&pa : %p // ppa : %p \n", &pa, ppa);
return 0;
}