다시 오신 걸 환영해요
이번 강의에서는 수식어를 알아보고 포인터를 활용하는
법을 알아볼게요
이전 강의에 대해 계속 배웠잖아요
변수의 값을 변경할 수 없다는 뜻이죠 하지만 포인터에 적용한다는 건 무슨 뜻일까요?
그래서 변수나 배열에서 Modifier를 사용하면
컴파일러에게 변수 배열의 콘텐츠는 프로그램에 의해 바뀌지 않을 것이라고 알려주죠
대안은 사전 처리 장치로 성명을 정의하는 건데
보통은 컨스트가 더 효율적인 방법이죠
포인터는 Modifier를 쓸 때 두 가지를 고려해야 해요
포인터는 바꿀 수 없다는 건가요?
아니면 포인터가 가리키는 값은 바꿀 수 없다는 건가요?
포인터는 주소의 값을 포함하니까요
그 주소는 절대 안 바꿀 거예요
아니면 그 포인트가 가리키는 값을 변경하고 싶지 않을 수도 있죠
어느 쪽이든 구문에서 구체적이어야 해요
따라서 포인터를 선언할 때 키워드를 사용할 수 있습니다 지정된 값은 바뀌어선 안
된다고 가리키기 위해서요
여러분이 이걸 제공하는 방식은 포인터는
값으로서의 값으로 주소를 갖고 있어요
그게 가리키는 건 그 주소의 값이에요
그걸 바꾸지 않으려면 이렇게
해야 해요
포인터를 선언할 때 형식 앞에 상수 Modifier에
별표를 넣는 거죠
어떤 형식이든 상수라고 하고 별표 포인터는 별표 포인터예요
이건 상수에 대한 포인터를 정의하는
기형이에요
999L은 바꿀 수 없어요
그래서 pvalue에 의해 가리키는 값이 동일하다고 선언하죠
컴파일러는 pvalue가 가리키는 값을 수정하려고 시도하는 모든 구문을 확인할 거예요
프로그램에 실수하는 버디가 있다면 오류를 throw할 거예요
이게 구문이에요 여기서 또 주목해야
할 건 첫 번째 단어예요
형식 전이죠 가리키는 값이 변할 수 없다는
거죠
pvalue에서 이런 걸 하려고 하면 가리키는
것에 값을 할당하려고 합니다 저기 간접 연산자가
보이니까요 우리가 가리키는 것에 값을
할당한다는 뜻이죠 그렇게 하면 에러가
발생할 것입니다 왜냐하면 999L를
888L로 바꿀 수 없기 때문이죠
그럼 상수에 대한 조언은요?
이전 선언에서 포인터를 만들었죠
그 점이 가리키고 있는 포인터는 바뀔 수 없어요
하지만 우리가 선언한 변수의 실제 값을 변경할 수 있어요
장기 값을 변경할 수 있어요
별표 p 값은 못 바꿔요
하지만 긴 값은 상수로 정의되지 않아요 그냥 긴 값으로 정의될 뿐이죠
값 정수 포인터는 여전히 수정할 수 있어요
상수가 적용되지 않았거든요
화살표에 상수만 적용했어요 값은 777l이라고 할 수 있죠
지정된 값이 바뀌었지만 변화를 위해 포인터를 사용하지 않았죠
포인터도 상수가 아니에요
포인터 기억에는 주소가 있어요
포인터가 상수라고 안 했잖아요 여전히 바꿀 수 있어요
포인터가 가리키는 건 일정한 거예요 숫자라는 새 변수를 선언하면 p-value는
그 숫자의 주소와 같다고 말할 수 있죠
포인터 값의 주소를 바꿀 거니까요
포인터가 가리키는 값은 바꾸지 않아요
이 차이를 이해하세요 주소를 뜻하는
포인터의 값을 바꾸거나
포인터가 가리키는 곳을 바꾸거나요
포인터가 가리키는 걸 바꾸고 싶지
않다면 포인터 선언문의 첫 번째 키워드가 돼야 해요
이 예제에서도 p-value에 저장된 주소를 숫자로 바꿀 거예요
그래도 저장된 값을 바꾸기 위해 포인터를 사용할 순 없어요 그
값을 바꿀 수 없다고 선언됐으니까요
포인터에 저장된 주소는 원하는 대로 바꿀 수 있습니다 우리가 했던 것처럼요
포인터를 이용해 지정된 값을 변경하는 건 포인터에
저장된 주소를 변경한 후에도 허용되지 않아요
그래서 긴 숫자로 바꿨지만
키워드는 여전히 포인터였죠
포인터가 어디를 가리키든 값을 바꿀 수 없어요
포인터의 주소를 변경하지 않는 건요?
포인터에 있는 값이요
포인터에 저장된 주소도 변경할 수 없도록 하세요
포인터 선언에서 상수 키워드를 사용하면 이렇게
할 수 있어요 같은 방식으로요 하지만 약간 다르죠
첫 번째 키워드 대신 데이터
형식과 별표 뒤에 넣죠
포인터 자체는 값을 바꿀 수 없다는 거죠
int 앞에 두면 포인터가 가리키는 값은 바뀔 수 없다고 하는 거죠
이렇게 하면 포인터는 항상 같은 것을 가리키게 돼요
주소는 절대 안 바뀌어요
컴파일러는 여러분이 코드 내의
포인터를 바꾸려는 시도를 역전시키지 않는지 확인할 거예요
이 주소는 못 바꿔요
pcount = 항목이라고 하면 오류가 나올 거예요
그건 카운트 주소만 가리킬 수 있거든요
바꾸고 싶을 때 상수 키워드를 어디에 놓느냐가 중요하죠
포인터가 포인터를 바꾸는 걸 원치 않거나 포인터의
주소를 바꾸는 걸 원치 않을 경우에요
첫 키워드인 상수는 포인터에 대한 값을 변경할 수 없어요
별의 데이터 형식 뒤에 상수를 넣으면 포인터 주소는
바뀌지 않는다는 뜻이에요
이해해야 할 게 많고 혼란스러우니 제가 말한 걸 공부하세요
구문을 이해하세요 아주 중요하고
까다롭죠 아주 쉽게 그런 실수를 할
수 있어요 그 차이를 이해하세요
여전히 p 카운트 값을
p 카운트를 이용해 바꿀 수 있어요 이전 것과 마찬가지로요 pcount는 비록 새 주소를 할당할
수는 없지만 가리키는 값은
바꿀 수 있어요
그래서 레퍼런스를 취소하고 바꿀 수 있죠 별표 p = 345라고 하면 돼요
포인터를 통해 카운트에 저장된 값을 참조하고 345로 변경해요
또한 상수인 값을 가리키는 상수 포인터를 만들 수
있어요 그래서 이런 걸 할 수 있죠 별에 상수,
상수 p 항목
값이 가리키는 게 상수라는 거죠
포인터 자체도 상수고요
p 항목은 상수에 대한 상수의 포인터로 모든 게 고정되죠
p 아이템에 저장된 주소를 바꿀 수 없고 p 아이템을 이용해
가리키는 곳을 수정할 수 없어요
하지만 아이템은 바꿀 수 있어요
항목은 상수가 아니니 항목을 바꿀 수 있어요
직접 값을 변경할 수 있어요
아무것도 바뀌지 않도록 하고 싶다면 item
int 변수를 상수로 생성해야 해요
그건 절대 변하지 않는다는 뜻이죠
하지만 상수 포인터와 포인터가
가리키는 상수 값의 차이를 기억하세요
둘 다 쓸 수 있어요 둘 중 하나를 선택하세요
모든 게 상수인지 확인하고
싶다면 해당 변수를 가리키고 있는 것이 그 변수도 상수인지 확인하세요 고마워요