다시 오신 걸 환영해요 이제 포인터를 좀 더 상세히 이해할 수 있게 됐으니
캐릭터 포인터에 관해 얘기하고 싶어요 주로 문자열을
나타내기 위해 캐릭터 포인터를 사용하는 방법이죠
문자열은 문자 배열 다중 문자, 단어죠
포인터 연산의 개념에서 배열과 포인터가 어떻게 연관되는지 알게 됐죠
아주 유용한 개념이죠
이런 개념은 문자열 배열에 적용할 때 아주
유용합니다 문자열 문자열을 트래버스하기 쉽거든요
배열에 포인터를 사용하는 가장 흔한 응용 프로그램 중 하나는
문자열에 대한 포인터예요
편리함과 효율성 때문이죠
타입의 변수 포인터를 이용해서 문자열을 참조할
수 있습니다. 아주 유연하죠.
따라서 캐릭터 배열에서 가능한
한 캐릭터 포인터를 쓰게 될 겁니다
특히 함수에 데이터를 전달할 때 캐릭터 포인터를 사용해서요
좋은 건 다 있어요
문자열을 복사하기 위해 배열을 이용하는 예제를 보죠
이 예제에서 우리 배열 매개 변수는 문자 배열이 될 거예요
함수 선언에서 보실 수 있어요
이걸 어떤 함수와 비교하고 싶어요 문자 포인터를 취하는
함수요 문자 포인터 함수가 어떻게 더 효율적인지 보여드리죠
이 예제에선 함수가 2개예요
하나는 배열이고 다른 하나는
포인터죠
첫 번째 함수 복사 문자열에서
전체 배열을 훑어볼 수 있죠 for 루프 I = a sub I
= 0 Null 문자열이 나올 때까지요 그런 다음 루프
제어 변수를 증가시키죠
그런 다음 2 sub I = from sub I라고 하면 돼요 직접적인 임무를
맡았어요
그리고 마지막에 null 문자가 나올 때까지
배열 끝에 null 문자를 추가해요 아주
기본적인 거죠 이제 포인터를 사용할 때 어떻게 하는지 보죠
먼저, 포인터에 대한 선언을 함수 선언으로 복사 문자열에서 할 수 있습니다 char
star와 char start from을 사용해서요
for 루프에서는 변수를 선언할 필요가 없어요
포인터가 있으니까요 from이 null
터미네이터를 칠 때까지 반복하면 되죠
그런 다음 from과 to 포인터를 증가시킬 수 있어요
점 연산을 하고 있으니까요
포인터에 1을 추가하면 포인터는 주소를 1로 증가시켜 다음
캐릭터를 얻죠
다음 루프 라인에선 for와 from
둘 다 규제가 발생했어요 포인터가
가리키는 실제 값을 할당해야 하니까요 포인터에
실제 캐릭터를요
그리고 마지막에 to 포인터가 가리키는
곳에 null 문자를 추가합니다 for from
문자열의 마지막 주소의 끝에 있지만 지금은 to 주소를 가리키고
있죠
심하진 않아요 루프가 있는 거죠
기본적으로 동일한 양의 코드를 가지고 있어요.
하지만 구문에 차이가 있죠
서브스크립트는 사용하지 않고 포인터와 별표를 사용하세요
역시 편리한 편리성 문제죠
큰 이점은 없는 것 같은데요
포인터를 사용하면 코드를 더 줄일
수 있고 더 최적화할 수 있어요
char 배열을 포인터로 사용할
수도 있고 텍스트라는 문자 배열을 포인터로 사용할 수도 있습니다.
텍스트의 요소들을 사용할 수도 있고요.
여기 char star 텍스트 포인터라고
써 볼게요. 문자 포인터를 정의하는 방법이죠.
텍스트 포인터가 chars 배열의 시작점을 가리키고
있다면 1개씩 증분하면 됩니다
이 사전, 후속 구현과 감소 연산자를 이용해서요
이 위에 있는 ++ 텍스트 포인터는 텍스트의 다음 문자를 가리키도록
텍스트 포인터를 설정합니다 텍스트 sub 1이죠
이제 정수 값을 넣듯이 1-2만
더하면 돼요 그러면 다음 글자가 나오죠
캐릭터 배열에 더 유용하죠
캐릭터를 하나하나 조작할 수 있으니까요
감소화 연산자인 마이너스 텍스트 포인터를 하면 텍스트의 이전
문자열에 포인터를 설정합니다 텍스트 포인터가 텍스트의
시작을 가리키지 않는다고 가정하는 거죠
그게 사실이라면 이런 하위 에러가 나올 테니까요
줄의 끝에 a++를 하면 경계 밖의 에러가 나오죠
정수 연산처럼 항상 조심해야 해요 배열의 경계를 넘지 않게요
정수 포인터 연산을 할 때랑 비슷하죠
문자 포인터 연산도 마찬가지예요
훨씬 더 유용하죠 이제 하위 스크립트를 쓰지 않고 개별 캐릭터를 볼 수 있으니까요
아까 예제를 보면 좀 더 최적화할
수 있어요 포인터를 사용해서요 코드 줄을 더
줄이는 거죠
이제 복사 문자열에서 이 함수 선언은 이전과 같습니다 별표를 이용해
몇 가지 포인터를 생성하죠
하지만 for 루프는 더 이상 사용하지 않아요 이전 예제에서
for 루프를 사용하는 건 무의미했거든요
사실 반복문 컨트롤 변수를 초기화할 필요가 없었죠
조건에 따라 루프를 끝내기만 하면 되죠
그런 다음 for 루프에서 증가와 감소 연산자를 사용합니다
하지만 그럴 필요도 없죠
여기서 훨씬 더 간단해요 while 루프를 사용할 경우 while
루프만 살펴보면 되거든요 null 문자를 가리키고
있으면 튀어나올 겁니다 null 문자가 실제로 0과 같으니까요
while 루프에서 부울은 C에서
정수로 나타납니다 1은 참이고 그 다음에 0은
거짓입니다 0은 정말 거짓이고 다른 건 다 참이죠
이 경우엔 null 문자 0이죠 거짓이에요 튀어나오죠
while 루프의 종료 조건을 위해 할 일은 별표를 붙이는 것뿐이에요
캐릭터의 가치를 파악하는 데 있어 어떤 점이 편협한가요?
문자열의 끝에 다다르면 거기서 뛰쳐나오는 거죠
그렇지 않으면 포인터를 수정할 수 있습니다
2 더하기에서 더하기 사이에서요
이건 사후 수치화 운영자예요
++가 변수의 오른쪽에 있다는 뜻이죠
이걸 할 땐 문이 완료될 때까지 거기에
1을 추가하지 않는다는 뜻이에요
그럼 어떻게 하느냐? *2=Start from이라고 하죠
그런 다음 해당 문이 완료되면 2 1에 추가하고 1에서도 추가하죠
변수 이름 앞에 ++가 있다면 해당 문을
실행하기 전에 변수에 추가될 겁니다 그럼 문제가
되죠 문자열에서 복사되는 첫 번째 요소를 놓치니까요
하지만 코드는 더 필요 없어요 같은 구문에서 실제로 증가
분할 포인터 연산과 배정을 합니다 코드를
1로 축소하는 거죠
표기법은 아주 간단해요
정수 연산을 아주 쉽게 하고 있어요
그리고 마지막에 문자열을 모두 복사해서
null 문자의 끝에 포인터를
추가하죠 그건 규제가 있어요 이 두 가지가 루프를 통과하는
이유거든요 마지막 문자를 가리키죠
여기를 좀 정리한 거예요
같은 줄에서 포인터의 힘과 어떻게
포인터와 연산을 사용할 수 있는지 보여주죠 그리고
이런 증가와 감소 연산자와 이런 ++-마이너스도요
더 빠르고 쉽게 만들어 더 효율적이기도 하죠
이 복사 문자열 함수를 사용하고 싶다면 2개의 문자 배열을 생성하면 되죠
문자 배열을 복사 문자열에 직접 전달할 수 있어요 0개의 문자열은
포인터니까요
포인터이기 때문에 참조를 해제하거나 주소를
추가할 필요가 없어요 문자열 2, 문자열 1이라고 하면 되죠
이렇게 하면 문자열을 복사해서 문자열 2개
문자열 배열로 복사한 다음 printf를
이용해 프린트하죠
캐릭터 배열 대신 캐릭터 포인터를 사용하는 예제를
보여드리고 싶었어요 왜 캐릭터 배열이 선호되는지도요
말씀드린 것처럼 프로그래머 선호 사항입니다 포트란과
같은 이전 언어로 프로그래밍을 한 경우에는
인상이 향상될 수 있죠 하지만 있다면 포인터를
사용하는 장점을 보실 수 있어요
도움이 됐으면 좋겠네요 고마워요