다시 오신 걸 환영해요
이번 강의에서는 포인터 정의에 관해 얘기할 겁니다 리포터를
선언하고 연산자의 주소를 사용해 메모리 주소를 포인터에
할당하는 구문이죠
이 시점까지 포인터는 변수에 불과하다는
걸 머리에 새겨야 합니다 메모리 주소를
가리키거나 값으로 메모리 주소를 포함하는 변수요
포인터를 선언하는 건 일반 포인터를 만드는 것과는 달라요
포인터 포인터 같은 건 할 수 없어요
포인터를 그렇게 말하면 안 되죠 구문이 약간 달라요
별표를 붙여요 변수가 포인터라는 것만으로는 충분하지 않아요
포인터 포인트에 대한 변수도 명시해야 하고요
변수 유형에 따라 저장소 용량도 다르고요
일부 포인터 작업은 해당 저장소 크기에 대한 지식이 필요해요
일반 변수처럼 데이터 유형을 지정할 때 포인터
데이터 유형의 변수를 생성할 때도 해당
데이터 유형을 지정해야 해요
형식 int의 변수에 대한 포인터를 선언할 수 있습니다 int, *
혹은 별표 p number를 이용해서요
그게 포인터라는 걸 알려줄 거예요
int는 같아 보이지만 그다음은 별표예요
별표는 포인터를 의미합니다 그런 다음 포인터 자체의
형식을 지정하죠 int 포인터예요
p number int*라는 이름의 변수 유형이요
int 형식의 모든 변수의 주소를 저장할 수 있어요
포인터는 주소를 저장하죠 다른 변수의 주소를
저장하려면 그 변수는 정수 타입으로
정의되어야 해요
PI는 int 변수를 가리키고
char*pc는
문자 변수를 가리키죠 부동 소수점 별 Pf 별
Pg 이게 부동 변수에 대한 포인터예요
그렇게 정의하는 거죠 타입이 중요해요
별표와 포인터 이름 사이의 공간은 선택이에요
여백을 안 둬도 돼요 공간이 없어요
변수 과장에 대해 말씀
드리겠습니다 선언에는 스페이스를 사용합니다 그리고 과장을
할 때는 사용하지 않죠
따라서 이 모든 선언은 관례에 따라 공간을 포함해야 하죠
포인터의 가치는 주소라서 대부분
시스템에 서명되지 않은 이미지로 내부에서 표시돼요
뭔가 저장해야 해요 16진수 숫자가 저장돼 있어요
정수처럼 보이도록 저장하고 있지만 정수
타입이라고 생각하지 마세요
정수 값과 마찬가지로 포인터 값과 그 반대 값도 마찬가지죠
따라서 그걸 프린트하려 해도 숫자 a 16진수처럼 보이겠죠 그렇다고
정수처럼 다룰 수 있는 건 아니에요
예를 들어 1에 정수를 곱하는 건 괜찮지만
포인터를 2에 곱하는 건 안 돼요
포인터는 새로운 타입이에요 정수 타입이 아니죠
%p는 포인터를 위해 지정된 형식을 의미하죠
다양한 데이터를 포인터로 표시하고 어떻게 사용되는지 볼게요
이전 선언은 변수를 생성하지만
초기화는 없어요 할 일이 없잖아요
항상 값을 포인터에 할당해야죠
초기화하지 않으면 아주 위험해요
그래서 그걸 선언할 때 포인터를 초기화해야 하죠
초기화 방법을 모르거나 다른 변수
주소가 아니거나 메모리를 동적으로
할당하지 않았다면 null 포인터를 쓰면 돼요
포인터를 초기화해 아무것도 가리키지 않게 할 수 있죠
null을 이용해서요
Instarp number = null은 int의 포인터라고 하죠
Null은 표준 라이브러리가 정의하는 상수예요
0점짜리 포인터에 해당하죠
아무것도 가리키지 않는다는 뜻이죠
메모리에 있는 어떤 장소도 가리키지 않아요
이렇게 하는 것이 좋습니다 버퍼 오버플로를
실수로 하거나 메모리에 잘못 쓰는 실수를
안 할 수 있으니까요
이것으로 초기화하면 실수를 제한할 수 있어요
아까 null에 대해 얘기했었죠 null 캐릭터에 관해 얘기했죠
null 포인터와는 다른 개념이죠
null 포인터는 어떤 것도 가리키지 않는다는 의미입니다 그리고 그걸로 초기화 되어야 하죠
표준 def에 대한 지시 사항을 추가해야 해요 null 정의를 사용하려면
h를 쓰세요
교환원 주소예요 포인터를 주소로 할당하고
싶다면 기존 변수의
주소연산자를 이용하면 돼요
추가나 하위 변수로 변수를 초기화하고 싶다면 이미 선언한 대로
연산자 주소, ampersand를 사용하세요
scanf 함수에 대해 얘기할 때 봤었죠.
정수 값 변수 99를 할당했어요
type int의 포인터를 생성하고 숫자의 주소를 할당하죠
이렇게 할 수 있는 이유는 숫자는 int이고
우리가 만든 포인터는 int를 가리키기 때문이죠
등호 연산자 다음에 할 일은 &&를 사용하는 거죠
이제 p 번호는 숫자의 주소를 포함하죠
p의 초기 값은 변수 번호의 주소예요
숫자 선언은 자신의 주소를 저장하는 포인터 선언을
선행해야 합니다 메모리를
할당받지 않은 포인터를 할당할 수는
없으니까요
포인터 번호를 할당하려고 하면 그 후에 하지 않으면 숫자는 존재하지 않아요
주소를 포인터로 할당하려면 주소는
메모리를 할당받아야 해요
컴파일러가 불평할 테니까요
하지만 조심하세요 점수 선언에는 특별한 게 없거든요
같은 문장에서 일반 변수와 포인터를 선언할 수 있어요
두 배 값, p 값 f num이라고 할 수 있죠
여기 이 문에서 유일한 두 번째 변수
pval은 포인터예요 다른 두 개는 그냥 더블이죠
그 선언은 좀 더 노골적이고
좀 더 명백하죠 하지만 *pq에선 어떨까요?
둘 다 포인터인데 아닌 것처럼요
여기에 int 포인터는 p밖에 없어요
변수 q는 int를 입력하죠
p와 q가 모두 포인터라고 생각하는 건 흔한 실수죠
그러니까 한 줄에 있는 여러 가지 변수에서 포인터를 선언할 때는 조심하세요
p로 시작하는 이름을 포인터 네임으로 쓰는 것도 좋아요
이걸 보면 변수가 포인터라는 걸 알 수 있죠
보통 변수 선언은 프로그램 맨 위에서 하죠
보통 메인 함수 안에서요
나중에 프로그램에서 사용되는 변수들을
볼 때 여러 데이터 타입이나 포인터 타입을 쉽게 식별할
수 있습니다 p라는 접두사가 있기 때문이죠
이번 강의에서는 포인터를
정의하고 선언하고 기존 변수의 주소를 포인터에
할당하는 방법을 살펴봤는데요
기존 변수나 포인터 값을 할당할 필요가 없는
경우도 있어요 새 메모리를 할당하고 싶을 수도 있죠
다음 강의에서 다룰 거예요 하지만 지금은 단순하게 할 거예요
형식 int의 포인터 사용에 초점을 맞출
겁니다 더블이나 플로트 같은 쉬운 형식도요
현존하는 변수와 주소를 할당하는
데 집중할 겁니다 어떻게 되는지 보죠
그러니 앞으로 나아가죠 고마워요