안녕하세요 이번 강의에 다시
오신 걸 환영합니다 저는 간략한 산수와 상수 Modifier를
사용하는 강의의 어려움을 보여드리고자 해요
코드 블록을 불러오죠 새 프로젝트를 만들 거예요 이 1개의 연산 예제를
포인터 예라고 할게요
여기서 할 것은 점 연산을 이용해서
문자열의 길이를 측정하는 것인데요
가장 먼저 할 일은 함수 선언을 만드는 거예요
문자열의 길이를 반환할 거예요 int를 반환 형식으로
갖죠 문자열 길이라고 부를게요
그냥 포인터를 취하는 거죠 하지만 상수 포인터예요
우리가 가리키는 것의 값을 바꾸고 싶지 않아요
그 말은 상수를 첫 번째 키워드로 사용하고
형식을 지정한다는 거죠 문자요
*이라고 하고 원하는 대로 이름을 붙일 수 있어요, 문자열이요
다시 한 번 반복하자면 상수를 여기에 넣었다면 이건 포인터의
주소를 말했을 거예요 포인터의 값은
바뀌지 않죠
하지만 이것도 중복이고 사실 할 필요가 없어요
패스 바이 값 패스 복사를 하고 있으니까요
주소 복사본은 있으니 여기서 바꿔도 상관없어요
하지만 가리키는 걸 바꾸는 건 중요해요 자신이 가리키는 것의 값을
변화시키고 싶지 않다면 여기서 계속하는 게 좋아요 그게
중요하죠
이제 해야 할 일은 메인을 생성하는 거예요
메인을 만들어야죠 여기서 할 일은 문자열 길이를
호출하는 것뿐입니다 다양한 문자열이
있는 문자열 길이 함수죠
정수를 반환하는 거 기억하세요 %d라고 할 수 있죠 우리가 넘기는
문자열 두어 개의 길이를 프린트할게요
문자열의 길이를 호출하고 일정한
문자열을 전달하겠습니다 여기에 큰 따옴표를
넣을 수 있어요 포인터를 만들 필요도 없어요
포인터를 생성해 할당해 전달할 수도 있지만
상수인지 확인해야 해요
적은 코드에서 더 쉽기 때문에 문자열 길이 테스트라고 하죠
다시 말하지만 일정한 문자열이죠
좀 더 실험해 보죠
뒤에 공간을 만들 거예요 라인 피드를 추가하죠
여기서 문자열 길이를 호출하죠 빈 문자열로 호출해보죠
0이 되도록 하세요 그리고 세 번째
것은 문자열 길이 jason이라고
하고요
그건 그렇고 이걸 생성하고 문자열 길이 링크를 전달하면
자동으로 null 터미네이터가 추가돼요
포인터를 선언할 때 그걸 배우죠
그게 장점 중 하나죠 포인터를 생성하면 리터럴이 될
텐데 크기를 지정하면 안 돼요
캐릭터 같은 것도 해야죠 배열이라면요
배열은 포인터니까요 하지만 크기를 지정하고
싶지 않다면 문자 p라고 하고
이 안에서 jason이라고 하면 되죠
그 교훈을 기억하세요 문자 배열의 크기를 지정하지 않으면 자동으로
Null 터미네이터를 추가해 크기를 생성하죠
그래야 실수를 안 하죠 배열 안에 크기를 넣으면 Null
터미네이터가 부족할 수 있어요
마찬가지로 문자열 길이에 리터럴을 넘기면 Null
터미네이터가 끝에 추가되죠
이런 변수들을 처음에 생성해서
이런 작업을 하고 각각의 변수를 통과시킬
수 있었죠
변수 만들면서 시간 낭비하고 싶지 않았어요 그렇게 할 거예요
이 코드에 정말 중요한 건 함수예요
이제 문자열의 길이를 생성할게요. 기억하세요 정수를 리턴하고
상수가 될 거예요 일정한 Char** 문자열이라고 하면 돼요
또 function declaration varable
name이 꼭 일치할 필요는 없어요 이걸 스트링으로 넣어도 괜찮아요
이 함수 안에 로컬 포인터를 만들어야 합니다 로컬 포인터는 문자열의
끝을 가리키거든요 그런 다음 문자열 끝에 대한 주소를 확보하면
문자열 시작에 대한 주소를 마이너스할 수 있어요
문자열의 시작에 대한 주소가 입력됐어요
문자열은 자동적으로 배열의 첫 번째 요소를 가리키게 됩니다 혹은
그 배열의 첫 번째 주소를요
로컬 포인터를 생성하고 또 다른 상수인
char*를 생성합니다. 마지막
주소를 어떻게라고 적고요.
이건 문자열의 시작 주소와 동일합니다 그런 다음
루프에서 매번 증가할 거예요
마지막 주소예요 이건 로컬 변수로 Null
터미네이터 바로 앞에 주소를 저장하죠
이제 while 루프를 작성할 수 있어요
while 루프는 null 터미네이터가 보이면 나오죠
두 가지 방법으로 할 수 있어요
캐릭터를 비교할 수 있죠 참조를 해제해야 하기 때문에
while * last 주소 같은 걸 할 수도 있죠
백슬래시 0과는 같지
않으니 그런 걸 할 수 있어요 근데 코드가
좀 많네요 마지막 주소에서
스타라고 외치기만
하면 돼요 Null 터미네이터가
탈환되면 0이 될 테니까요 0은
false가 되겠죠
불리언은 1이 참이고 0은 거짓인 걸 알죠
거짓이면 튀어나올 거예요 while 조건
안에 ** 마지막 주소를 입력하세요
이건 실재, 즉 포인터예요
마지막 주소를 가리키게 되면 null 터미네이터를 가리킬 거예요
마지막 주소를 수정해서 Null 터미네이터를 가리키도록 해야 해요
여기서 할 수 있는 건 + 더하기 마지막 주소 뿐이죠
그래서 while 루프의 각 반복은 0이 될 때까지 주소를
증가시키죠
0은 Null 터미네이터를 뜻해요
while 루프가 실행된 후에 마지막
주소는 null 터미네이터의 주소를 가리키게 되죠
문자열에 전달된 주소에서 null 터미네이터의
주소를 뺄 수 있습니다 그러면 길이가 나오죠
다음 줄에서 할 일은 그게 다예요 마지막 주소를 반환하라고 할
수 있어요 사실 주소를 빼야
하죠 어떤 것도 참조 해제하거나
인다이렉션 연산자를 쓸 필요가 없어요 마지막 주소
문자열이요 문자열은 전달되고 우린
전혀 수정하지 않아요
첫 번째 캐릭터를 가리키고 있어요 J를 가리키고 있어요
주소일 수도 있고 8번째 줄에서 처음 호출했을 때 S의 주소가 될 수도 있죠
마지막 주소는 마지막 t의 주소를 가리키죠
그보다 하나 더 있죠 Null 터미네이터요 마지막 주소에서 s의
주소를 빼면 길이가 나오죠
그걸 반환할 거예요
이해가 되면 좋겠네요
17번째 줄에서 로컬 변수를 생성합니다 마지막
주소를 추적해야 하니까요 null 터미네이터의
주소요
루프가 실행되면 마지막 주소는 t 다음에 나타납니다
null 터미네이터죠
그런 다음 문자열에서 마지막 주소를 뺄 수 있어요 문자열이
가리키는 주소가 s가 되면 그건 수정하지 않죠
이게 올바른 길이를 제공하는지 보죠
이걸 실행하면 우리가 전달한 문자열의 길이를 알 수 있을 거예요
17, 0, 5가 보이죠
하나, 둘, 셋, 넷, 다섯 여섯, 일곱, 여덟, 열,
열, 열 열, 열셋 간격을 세야죠 열넷, 열다섯,
열여섯, 열일곱 네, 큰 따옴표는
비었으니까 0이어야 하고 제이슨은
5죠 0과 5가 17개예요
여기서는 포인터 연산을 이용해서
마지막 주소와 더하기 연산자를 얻었습니다.
그리고 연산의 길이를 맞추기
위해 마지막 주소에서 문자열을 빼야 했죠.
근사하죠 점 연산의 힘을 보여주려는
거예요 표기법적 편리성을요
쉽게 증가하고 감소해 캐릭터 배열의
다양한 지점으로 이동하고 캐릭터를
꺼내는 방법이죠 이 경우엔 주소만 얻습니다 그리고
그 주소들을 이용해 길이를 맞추죠
도움이 됐으면 좋겠네요 제가 방금 한 말을 다 이해해야 해요
다시 상수의 개념, ++의 개념 조건의 개념입니다 만약 Null
터미네이터를 가리키는 주소 체제가
변경된다면 그건 0입니다 그럼 튀어 나오죠 그리고 이 개념은
마이너스 주소 2개죠 고마워요