다시 오신 걸 환영해요
이번 강의에서는 포인터가 가리키는 값에 접근하는
법을 알아보겠습니다
포인터는 메모리 주소를 저장하죠
그 메모리 주소는 사실 어딘가의 값을 담고 있어요
포인터는 메모리 주소를 가리키죠 그게 가리키는 것의 값을
얻고 싶어요
왜냐하면 제가 포인터의 값을 출력하면 그건 주소가 될 테니까요 하지만 전 주소를 얻고 싶어요
주소의 값을 얻고 싶어요
그래서 포인터가 가리키는 주소의 값에 접근할 수 있어요 인다이렉션
연산자를 이용해서요 간접 연산자는 별표예요
별표를 이용해 포인터를 선언하는 방법을 배웠습니다
별표를 이용해 포인터가 가리키는 값을 찾도록 하죠
그래서 레퍼런스 연산자라고도 하죠 레퍼런스,
즉 포인터를 사용하니까요
예를 들어 15와 같은 숫자가 있다면 type int의 포인터를 선언합니다
int를 가리키면서요 그리고 ampersand를 이용해 숫자 주소를 할당하는 거죠
포인터가 가리키는 것의 값을 어떻게 얻을 수 있을까요?
레퍼런스를 취소할 수 있어요
기본적으로 포인터가 가리키는 값은 15입니다
15라는 숫자의 주소를 가리키고 있으니까요
포인터 변수는 변수 번호의 주소를 포함하죠
새 값을 계산하기 위해 식에서 사용할 수 있어요
결과 값을 원한다고 해보죠 포인터가 +5를
가리키고 있는 값이요 별표는 포인터의 이름
앞에 붙이고요
그래서 이게 하는 일은 기본적으로 포인터 변수가 뭘 가리키는지
말해요 15를 가리키고 거기에 5를 더하죠
포인터가 가리키는
주소가 그 주소의 값이죠
인다이렉션 연산자 별표는
곱셈에 사용되는 기호이기도 합니다 포인터 타입을 선언할
때도 사용되죠 아주 헷갈릴 수 있어요
무슨 일이 일어나고 있는지 컴파일러가 어떻게 작동하는지 어떻게 알 수 있을까요?
맥락이 중요하죠 별표를 언제, 어디서 사용하느냐에 달렸죠
별표를 써서 포인터 형식 다음에 포인터를
선언하면
선언을 사용하는 거죠
두 숫자 사이에 별표를 사용하면
곱셈에 사용되는 거예요 예를 들어 오른쪽에
포인터 이름이 있거나 왼쪽에 있는 경우 값을 할당하거나
액세스할 거예요
이 인다이렉션 연산자를 쓰면 컨텍스트가
중요해요
그렇게 돌아가는 거예요
컴파일러가 이렇게 해석하는 거죠
이 예제에서 볼 때마다 별점 포인터예요
데이터 타입이 없거나 양쪽에 숫자가 2개씩
없다면 간접 포인터라는 거죠
예제를 살펴보죠 여기 다른 예제가
있는데요 10과 같은 정수 값을
생성할게요 x라는 타입의 다른 변수 정수를 생성하죠
카운트를 10으로 시작하고 x는 0으로 시작해요
그런 다음 int 포인터를 만들죠 int 포인터라는 것을 알 수 있습니다
왜냐하면 데이터 타입 뒤에 별표가 있기 때문입니다
그리고 int 포인터라고 이름을 지었죠
int 포인터에 count 주소를 할당하고요.
왜냐하면 포인터는 단지 주소만을 값으로 포함하고 있기 때문입니다
하지만 무언가를 가리키기도 하죠
그런 다음 int 포인터가 가리키는 변수 x를 할당할 수 있어요
포인터에 포함된 주소의 값은 무엇일까요?
x는 10을 보여줄 거예요
10살요 그래서 이렇게 디스플레이하면
%d _ x% _d가 나오고 = 10 x는 10이 되죠
그렇게 해서 포인터를 재구성하고 값을 얻을 수 있어요 여러분이 포인터의 값을
표시하길 원할 때를 가리키고 있죠 포인터는
메모리에 값이 있거든요
그냥 주소죠 16진수 정수와 주소로
표시되는 포인터 값을 디스플레이하려면
어떻게 해야 할까요?
형식 지정자 %p를 사용하세요 전에도 얘기했잖아요
16진법 메모리 주소로 포인터 값을 출력할 거예요
그래서 이런 걸 하는 경우 숫자를
선언하고 포인터를 선언하고
그걸 null로 초기화하죠 좋은 연습이니까요 선언으로 포인터에 뭔가를
할당하지 않을 땐 항상 그렇게 하는 게 좋죠 null로 초기화하도록 하세요
그런 다음 숫자 변수 10을 할당하죠
그런 다음 포인터를 숫자의 주소로 할당하죠
p 숫자의 값은 주소가 되고요
주소요 이걸 프린트하려 하면 %p를 쓸 거예요 주소 값이 되겠죠
뭘 가리키고 있는지 프린트하려면 인다이렉션
연산자를 써서 참조를 해제해야 해요
하지만 주소를 출력하면 16진법으로 출력되고 포인터는
메모리에서 8 바이트를 차지해요 주소는
16진법 숫자들이죠
어떻게 작동하죠?
그건 컴퓨터가 64비트나 32비트 주소를 지원하느냐에 달렸죠
기계에 64비트 운영 체제가 있다면
16진수 숫자가 보이겠죠
컴퓨터나 OS 주소가 32비트만 있으면
16진수 숫자가 8개인 게 보일 거예요
주소를 표시하고 싶다면요?
포인터에 값이 있기 때문에 차이점을 말할 수도 있어요
하지만 운영자 주소와 함께 주소를 디스플레이할 수도 있어요
이 예제에선 숫자의 주소를 표시하고 싶어요
숫자는 포인터가 아니에요 숫자는 그냥 정수예요
주소를 알려면 ampersand를 이용하면 돼요
주소를 표시하고 싶다면 다시 %p를 사용하면 되죠
&만 붙이면 돼요
&를 제공하고 포인터 변수를 쓰면 포인터의
주소를 표시할 수 있어요 포인터의
값이 아니라요 포인터의 주소가 메모리의 일부 주소라는 걸 기억하세요
포인터 값은 그게 가리키는 주소예요
그게 가리키는 값은 메모리의 다른 곳에 있어요
포인터가 어떻게 작용하는지
일러스트를 떠올려 보세요
여러분이 선언할 때 포인터는 8 바이트 메모리를
생성해요
포인터의 값은 주소예요
포인터가 가리키는 건 값입니다
보통 여러분이 제공한 형식의 값이죠
하지만 영화는 세 부분으로 나뉘어요
p 번호를 출력하려면 ampersand를 사용하면 돼요
실제 포인터의 주소죠
경고를 피하려면 텅 빈 별을 이용해야 해요
포인터는 주소를 가지고 있습니다 다른 변수들과 마찬가지로 여러분이
선언했을 때 할당되는 것이죠
주소 디스플레이를 위한 변환 지정자로 %p를 사용하죠
p 숫자가 차지하는 주소를 참조하기 위해 &연산자의
주소를 이용하죠
포인터의 주소예요 포인터는 주소 값을
갖고 있어요
cast a void는 컴파일러의 경고를 방지합니다
특히 %p 사양이 값이 일종의 포인터 유형이길 기대하죠
& 숫자의 유형은 그것의 포인터에 대한 포인터예요
캐스팅을 해야 해요
포인터가 사용하는 바이트 수를 표시하죠
포인터에 대한 정보를 얻는 또 다른 방법이죠
사이즈오프 연산자를 사용할 수 있는데요 다양한 데이터 타입을 표시하는
연산자의 크기를 보았는데요 포인터로 똑같이 할 수 있어요
제가 실행 중인 컴퓨터에선 8바이트일 거예요
컴퓨터 주소는 64비트예요 64비트
운영 체제니까요
사이즈 오브를 사용하면 컴파일러 경고를 받을 수도 있습니다 사이즈는
정수 유형으로 정의된 구현이죠
경고를 막기 위해 type int로 논쟁을 벌일 수 있어요
이럴 때는 p 숫자 크기와 d 바이트 %를 입력하죠
int를 입력하고 p로 1인치 크기로 캐스트하세요
메모리의 포인터 크기를 알려주고 주소의 포인터도 알려줍니다
대부분의 시스템에서 8 바이트 간격이죠
주소가 들어 있거든요
여기 또 다른 예가 있어요 이건 많은 걸 보여줄 거예요
이 예제를 실행해 출력을 보여드리죠
하지만 실행하기 전에 어떤 상황인지 설명할게요 선언된 숫자가 있어요
null을 초기화하는 포인터가 있어요
숫자 값을 10으로 설정했죠
그런 다음 정수 숫자의 주소를 프린트하려
합니다 숫자의 값도 프린트하려 합니다 아주 간단하죠 연산자의
주소와 그냥 변수를 이용해서요
연산자의 주소를 입력할 때는 퍼센트 p를 사용하죠
그런 다음 포인터에 숫자 주소를 할당할 거예요
그런 다음 몇 가지 포인터 정보를 프린트할 거예요
포인터 자체의 주소를 출력하고 싶어요
그냥 p %, 보이드 스타 앰퍼 앤드 숫자면 돼요
포인터가 메모리에 몇 바이트를 가지고 있는지 볼 거예요. 크기를 정할 수 있어요
포인터의 실제 값을 보고 싶어요
그건 주소죠 별다른 정보 없이 그냥 p 숫자만
입력하면 돼요 그런 다음 %p를 쓰죠
포인터가 가리키고 있는 주소의 값을
보고 싶다면 *p넘버를 사용합니다
인다이렉션 연산자를 이용하죠
p 숫자는 in을 가리키니 %d라고 하죠
코드블록에서 이 예제를 살펴보죠 실제로 어떻게 표시되는지 보기 위해서요
주소를 디스플레이 할 때마다 주소의 16진수인
16진수들을 볼 수 있습니다. 다른 경우에는 값을 볼 수도 있고요.
낯이 익을 거예요 포인터의 여러 부분에
접근하는 방법을 보여주는 프로그램이에요
정규 넘버 데이터 타입 int가 있고 포인터도
있죠 Null로 초기화하죠
먼저 숫자를 표시할게요 10이죠 이건 숫자의 주소를 디스플레이할 거예요
그런 다음 10번과 11번 줄의 숫자를 디스플레이하겠죠
그런 다음 포인터를 할당합니다 숫자의 주소죠
포인터의 실제 주소를 보려면 ampersand 연산자 주소를 사용하면 됩니다
그리고 void star로 캐스트를 하죠
우린 퍼센트 p를 써요
메모리에서 포인터가 몇 바이트인지 알고 싶다면 %d 사이즈오버로 하고요
주소를 보려면 땅콩 포인터의 값을 보려면 %p를 쓰고
그냥 p 넘버라고 해요 p 넘버는 주소니까요
포인터가 가리키는 게 뭔지 보려면 포인터 값 속
주소의 값과 함께 별표 p 넘버라고 하면 돼요
디레퍼런스죠 인다이렉션 연산자요
이걸 실행해보죠
이걸 실행하면 처음 두 개가 출력된 게 보일
거예요 6번째 줄에 있는 숫자 주소와
16진수 0060ff0c네요
32비트 프로그램을 실행하고 있어요 8비트인 게 보이시죠
숫자 변수인 10이죠
그리고 할당된 메모리로 실제 포인터의 주소를 출력하죠
주소랑 번호가 달라요
포인터에 대해 할당된 주소이기 때문이죠
포인터 숫자는 4 바이트예요
32비트 주소란 뜻이죠
숫자 주소인 포인터의 값은
같아야 합니다 0060ff0c죠
보다시피 숫자 주소를 알아낼 수 있죠 이름만으로요
%p 포인터를 사용해서요
연산자 4 바이트의 크기도 봤고요
p 숫자가 가리키는 값이 10인 경우 인다이렉션
연산자를 이용해 참조를 해제해야 합니다 10이 인쇄된 게 보이시죠
주소를 표시할 때는 %p를 사용합니다
정수 포인터나 바이트의 숫자를 표시할 때는 %p를
사용하죠
이게 액세스 포인터 값의 기본 구문이에요
Address pointer,
ampersand가 가리키는 값은 변수의
이름이고 포인터의 값은 변수의 이름이에요 포인터가 가리키는
값은 In다이렉션 연산자를 위한 거죠
고마워요 도움이 됐으면 좋겠네요 이걸 연구해 보세요