본문 바로가기

Let's Study/Pointer

5. *p와 p[]의 차이. *p와 p[]의 차이를 설명하기에 앞서 간단한 코드를 보여드리겠습니다. 1번은 배열을 이용해서 각각 *(a + 2), a[2], 2[a]를 출력하고 있고 2번은 char형 포인터에서 b[2]에 해당하는 값을 출력하는 겁니다. 각각 어떤 값이 출력될까요? 1번 여러분이 아시는 a[2]는 당연히 3이 출력되겠죠. 그렇다면 2[a]와 *(a + 2)는 어떤 값이 출력이 될까요? 똑같이 3, 3이 출력이 됩니다. 여기서 눈치가 조금 빠르신분은 대충 아셨겠지만 a[2]는 배열이 아닙니다. 포인터 변수를 배열처럼 사용했을 뿐. a[2]의 의미는 a에서 2만큼 더 떨어진 곳의 값을 지칭합니다. 그래서 *(a + 2) == a[2]는 같은 표현이죠. 그렇다면 2[a]는 무슨 뜻일까요. C언어에서 []는 연산자를 나타냅.. 더보기
4. sha == sha[0] == &sha[0][0] 3. 배열포인터에서 int sha[3][2]; int (*psha)[2]; psha = sha일 때 배열 sha는 배열의 첫번째 주소를 가리킨다고 했었습니다. 그렇다면 sha == sha[0] == &sha[0][0] 이건 맞는 문장일까요? 맞는 문장이네요. 하지만 주소만 보고 정말 저 문장이 똑같다고 할 수 있을까요. sha는 전체 배열을 뜻하고 sha[0]은 0행 전체를, sha[0][0]은 [0][0] 하나를 가리키고 있습니다. 그래서 sha는 3 x 2 x 4 인 24가 나오고 sha[0]은 2 x 4 sha[0][0]은 4가 나옵니다. 이로써 sha == sha[0] == &sha[0][0] 는 가리키는 주소만 같을 뿐 완전히 다르다는 걸 알게 됬습니다. 더보기
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 모.. 더보기