2022. 1. 11. 19:36ㆍC언어
포인터는 메모리의 단위라고 말씀드렸었고, 큰 상자안에 하나의 공간을 1바이트라고 말씀드렸습니다.
메모리를 상상하실때는 상자가 여러개 있는 일렬이라고 생각하셔야 됩니다. 여기서 몇 번째 박스를 가리키는가가 포인터이고, 그거를 우리는 쉽게 말해 주소값이라고 말합니다. 첫번째 박스의 주소값을 예시로 x100번지라고 하면 옆집은 x101이런식으로 쭉 이어지겠죠. 변수를 하나 int a = 10;으로 만들면 맨 앞에 들어가는 것이 아니라 엄청 많은 공간 중 한곳에 랜덤으로 들어가게 되는 것 입니다. 공간 중 int가 4바이트니깐 4개의 공간을 묶어 그 이름을 a로 둔거고, 이름에 주소를 연결시켜놓은 것은 운영체제가 하는것입니다. 주소는 우리가 변수를 만들어달라고하면 그 주소를 운영체제가 지정해주는겁니다.
중요한건 우리가 a의 주소값인 &a를 갖고 있으면 a를 찾아갈수있다고 말씀드렸었고, 얘를 찾아가는 방법으로 *기호를 통해 주소값 앞에 *&a로 붙이면 된다고 말씀드렸어요. *&표시가 역참조 였죠. 근데 이 주소값을 사용하기 위해 항상 이런기호를 계속 만들수 없으니 우리는 저장해서 이용하겠다 이거죠. p라는 변수를 만들고 그 안에 a의 주소를 넣게 되면 p = &a; 이런 형태가 될거구요. 아직 자료형이 결정되지 않았기 때문에 우리는 p가 얼마만큼의 공간을 차지하고 있는지 몰라요. 변수는 자료형을 지정해줘야된다고 했으니깐 1) 우선 포인터로 쓰기위해 p앞에 *붙여주시고 그 앞에는 원본 데이터의 자료형 즉, 받으려는 값의 자료형을 써주시면 된다라고 설명 드렸습니다. a의 타입을 보시고 아 int형이구나하고 앞에 int* p = &a이런식으로 저장해주시면 됩니다. 이렇게 하면 p는 a의 주소값을 저장한거고 굳이 *&하지 않아도 이미 &a를 저장해 뒀기 때문에 *p만 사용해서도 역참조가 가능하게 됩니다.
우리가 변수 때 배웠듯이 대입연산자의 왼쪽은 공간이 되는거고 오른쪽은 값이 들어가게 되는겁니다. 어제 풀었던 문제를 다시한번 보게되면 아래와 같이 값이 변할 수 있다라는것 확인해주시길 바랍니다.
자 우리가 int형태만 포인터로 사용할수있는게 아니라 long이나 short같이 여러 자료형을 배웠었죠. 그 크기가 다 달랐던거 기억하실까요?? 크기를 찾는 방법으로 sizeof라는 함수를 사용했었는데 sizeof를 사용해서 크기를 구해보면 포인터 변수가 아닌 자료형들은 각각의 바이트를 갖고 있다는 것을 확인할 수 있었습니다. 꼭 기억해주세요!! 자료형 별로 주소들을 구분할 수있으니 short형 주소 char형 주소들도 한번 구해보시길 바랍니다.
데이터 표현 기준이 두개로 나뉜다고 말씀드렸잖아요. 크기와 유형 근데 이 두개를 다 포함하고 있는게 자료형이라 우리는 자료형을 쓴다고 했잖아요. 그래서 우리는 생각을 한거죠. 포인터는 어떤 것 때문에 나눈걸까 그래서 크기를 봤는데 다 어땠죠?? 다 8바이트로 동일했죠. 자 우리는 우선 포인터를 사용하기 위해서는 8바이트라는걸 깨달았습니다. 다음 예시를 한번 들어볼게요. pp라는 포인터 변수를 만들어서 x100이라는 주소를 넣었어요. 그리고 *을 붙이면 찾아간다라고 말씀드렸으니깐 *을 붙이고 x100으로 찾아간거죠. 우리는 주소를 저장했다고 했는데 주소는 무조건 맨앞에있는 곳을 주소로 저장합니다. 근데 우리는 이진수를 사용한다고 했어요. 하지만 이게 4바이트를 이용해 10을 저장한거라는걸 cpu한테 알려줘야되잖아요. 아니면 어디서 끊어야될지를 모르고 뒤에있는 값까지 가져오게된다면 이상한 값이 나올거에요. 그렇기에 얘는 무조건 4바이트까지만 가져와라고 말을해줘야되는거죠. 그래서 int형태를 앞에 붙여주는겁니다. 쉽게말하면 만약 1바이트짜리 값을 저장했어요. 근데 얘가 몇바이트짜리로 쓰여진지 알려줘야될거잖아요. 끝을 모르니깐 그걸 cpu한테 어떻게 구분하냐?? 그게 int char같은 자료형인겁니다.
여러분이 비서에게, 땅 좀 알아보고 사주세요. 이런 명령을했다고 하면 비서가 직접가서 알아보고 "여기땅 좋습니다." 라고만 했어요. 근데 "제가 사세요" 라는 말을 한다고 비서가 살 수 있나요? 못사죠. 왜냐? 땅이라는게 어디서 부터 어디인지 주소만 가지고는 살수없다는거죠. 어디부터 어디까지 그 주소의 몇 평까지 사세요. 이런식으로 말해줘야지 제가 생각한 의미대로 비서도 살수있잖아요. 컴퓨터도 정확하게 알려줘야합니다. 포인터의 의미를 우선 잘 생각해보시고 잘모르겠다 하시면은 우선 틀을 외워주세요. 자료형 크기는 다 똑같은땅을 어떻게 사용해야될지를 알려주는 용도라고 생각해주시면 됩니다.
결론을 내리면 왜 받을 데이터와 포인터 형태를 맞춰줘야하나? pp라는 포인터 변수에 int형태의 주소가 담긴 변수주소를 담았다면 얘는 원본이 담은 내용을 제대로 이해하지 못하고 다르게 해석하게되니깐!! 그렇기에 주소를 갖고 제대로 이용하시려면 원본과 같은 자료형을 잘 작성해주셔야 됩니다.
'C언어' 카테고리의 다른 글
아스키코드 (0) | 2022.01.14 |
---|---|
C언어 요점 정리 - 다중 포인터 (0) | 2022.01.14 |
C언어 요점 정리 - 컴퓨터의 데이터 처리와 표현 (0) | 2022.01.10 |
C언어 요점 정리 - 지역변수 (0) | 2022.01.07 |
C언어 복습 (0) | 2022.01.07 |