본문 바로가기

3. 배열포인터, 이젠 아무대나 *쓰지말자! *의 두가지 의미를 설명했을 때, 제일 중요했던 건 1. 초기값을 지정해줄 때의 *는 번지를 가르키는 걸 뜻했고 2. 수식에서의 *는 포인터변수가 가르키는 주소의 값을 리턴한다고 했습니다. 이 두가지는 포인터를 하시면서 반드시 기억해주세요. 오늘은 배열포인터에 대해 글을 쓸게요. 우선, 배열이 뭘까요. 여러분도 다 아시듯 array[3] = {1, 2, 3} 이런식으로 변수 여러개를 편리하게 지정할 수 있죠. 그렇다면 배열의 포인터는? 배열 포인터변수에 배열의 주소값을 넣게 될 경우, 배열의 첫번째 번지를 가르키게 됩니다. array[3]이라면 array[0]을 가르킬 것이고 array[2][3]이라면 array[0][0]을 가르키겠죠? 이런식으로 표현할 수 있겠습니다. (주소크기가 1씩 증가하는건 그냥.. 더보기
2. 포인터가 4바이트인 이유 '포인터는 주소를 가리키기만 하면 되기 때문에 4바이트 이상 필요하지 않아요.' 사람들에게 물어보니 이런 답을 많이 들었습니다. 왜 하필 4바이트일까요. 전 이렇게 생각합니다. 32비트 CPU의 주소값은 4바이트로 표현됩니다. (8비트당 1바이트이기 때문에 ) 예를들어 10진수는 7141840, 11008720, 17038120, 16645524 16진수는 0x103dc90, 0x8047c24, 0x104fa78 이런식이죠.. 만약, 64비트 CPU의 PC(Program counter)가 32비트를 쓰고 있다면 포인터의 크기는 4바이트가 될 것이고, 64비트를 쓰고 있다면 포인터의 크기는 8바이트가 됩니다. (여기서 말하는 PC란 CPU 내부에 있는 레지스터 중의 하나를 말합니다. PC는 다음에 실행될 .. 더보기
1. *의 두가지 의미 포인터를 시작하기 전에 *의 의미를 알아두면 포인터를 더 쉽게 이해할 수 있습니다. 예를 들어 여기서 몇번 항목이 에러가 날까요? 1번 int* pa = &a포인터변수 pa는 초기값으로 a의 주소를 받았습니다. *pa = 10; 그리고 pa가 가르키는 곳(a)에 10을 넣어서 printf로 a를 출력합니다. 그렇다면 출력되는 값은 5가 아닌 10이 출력됩니다. 2번 int* pb; 포인터변수 pb에는 초기값을 지정해주지 않아서 포인터변수 pb가 가르키고 있는건 쓰레기값입니다. pb = &b; 포인터변수 pb에 b의 주소를 넣었습니다. *pb = 1000; pb가 가르키고 있는 곳(b)에 1000을 넣어서 printf로 b와 포인트변수 pb가 가르키고 있는 곳을 출력했습니다. 출력되는 값은 b와 *pb 모.. 더보기