다시 오신 걸 환영해요 이번 강의에서는 점산법에 관해 얘기할 거예요
이제 배열과 포인터의 관계를 알았으니
이 개념이 더 이해하기 쉬울 거예요
연산이라고는 하지만 실제로는… 이
말의 의미는 포인터에서 +/마이너스
혹은 증가 또는 감소 작업을 할 수 있다는 거죠
배열에 대한 포인터를 사용할 때의 힘은 배열의 요소들을 순서대로
배열할 때 유용하죠
첫 번째 요소에서 끝까지 가는 거죠 그걸 반복하는 거예요
이게 진짜 파워 포인터예요 포인터가 주소를 사용하기
때문에 배열의 각 요소는 또 다른 주소일 뿐이죠
포인터에 ++만 추가하면 다음 주소로 갈 수 있어요
여기서 값 포인터를 이용해 값 배열의 첫 번째 정수에
액세스할 수 있어요
0 이하로 액세스할 수 있어요
값을 포인터는 정수 배열을 가리키는
포인터죠
그걸 배열의 첫 번째 요소에 할당했어요 배열 이름에 포인터를 할당함으로써요
연산자 sub-0의 주소도 사용할 수 있어요.
하지만 변질 값 포인터는 배열의 첫
번째 요소를 가리키고 있기 때문에 변질
값 sub-0 배열의 첫 번째 정수를 제공해요
참조 값 하위 3을 포인터 변수로
사용하고 싶다면 이 값 포인터에 3을 추가하고 인다이렉션 연산자를
탈퇴에 적용하면 돼요
이런 것도 할 수 있어요 값을 포인터 + 3라고 하고 별표로
데레퍼런스를 해요
보통 별표를 따옴표 밖에 붙여서 명확하게 하죠
하지만 값 포인터라고 하고 있어요
배열의 첫 번째 요소의 주소죠 거기에 3을 더해요
각 바이트를 추가해서 정수를 계산합니다 여러 바이트를
곱하고 거기에 정수를 곱하는 거죠
하지만 이건 본질적으로 하위 3을 가리킬
거예요 배열의 4번째 요소죠
그래서 별표 값 포인터 + i에서 그건 값 배열에
포함된 어떤 값이든 액세스하는 데 사용되죠
이 수식을 이해하면 i에 뭐든 추가할 수 있어요 그럼
특정 요소 배열을 가리킬 거예요
값을 sub 10에서 27로 설정하고 싶다면
그냥 포인터를 사용하면 돼요. 값 포인터에
+ 10을 더하고 27과 같다고 하면 돼요.
여기 다른 구문이 보이시죠
표기법상 편리하긴 하지만 프로그램 자체에 있어서는 더 효율적이에요
포인터는 배열과 밀접하게 관련돼 있어서 포인터
수명을 늘리거나 값을 추가하거나 포인터에서
값을 빼도 쉽게 요소에 접근할 수 있어요
아주 유용하죠
값 포인터를 설정해 값 배열의 두 번째 요소를 가리키려면 주소
연산자를 값 하위 1에 적용하고 결과를 값 포인터에 할당할 수 있죠
우리도 봤어요 주소 하위 연산자를 이용하고자 할 때 아까
언급했던 것과 같은 작업을 하는 방법이죠
원한다면 언제든 할 수 있지만
포인터 산수를 하는 게 훨씬 편리해요
값 포인터가 값을 sub-0으로 가리키면
1의 값을 포인터로 설정할 수 있습니다. 값의 값에 1을 추가하기만
하면 되죠. 이게 바로 점 연산의 핵심이죠
값을 점유하거나 += 1이라고만 하면
돼요 그럼 값 포인터는 배열의 두 번째 요소나 첫 번째 인덱스를
가리키죠
아주 잘 표기했고 쉬웠어요
C#에서 완벽하게 유효한 표현이죠
어떤 데이터 타입이든 정수 문자든 뭐든 포인터로
사용될 수 있어요 이게 캐릭터에 얼마나 유용할지 생각해 보세요
문자 포인터가 있다면 문자열의 각 요소, 각각의
문자에 접근할 수 있어요 포인터에 ++를 함으로써요
증가와 감소 연산자 ++-마이너스는 이런
포인터를 다룰 때 특히 유용합니다 보통
한 요소에서 다음 요소로 넘어가기 원하니까요
더하기 22나 빼기 20은 흔치 않아요
보통은 순서대로 하니까요
포인터에서 증분 연산자를 사용하면 포인터에 1을 추가하는 것과 같은 효과를 내죠
감소 연산자를 사용하면 포인터에서 1을 빼는 것과 같은 효과를 내죠
그러니까 ++ 값 포인터는 그 값 포인터를
설정해 값 배열에 있는 다음 정수를 가리키게 하는 거죠
이 값 포인터는 값 배열에 있는 이전
정수를 가리키는 값 포인터를 설정하죠
하지만 마이너스를 할 땐 조심해야
해요 적어도 배열 안에 있어야 하니까요 0이 아니라요
++도 마찬가지고요
배열의 끝에 있다면 범위 밖의 에러가 있어선 안 되죠
그러니 값을 포인터로 하세요 줄이면 처음엔
값 배열의 시작을 가리키지 않았죠
또 다른 예로는 배열의
모든 요소를 합할 건데요 배열에 SUM
함수가 있는 게 보이시죠 함수는
배열을 갖고 있고 정수라는
상수도 매개 변수로 받아들여요
이 함수 안에 정수를 만들 거예요
정수 합계를 0으로 초기화하고 정수 포인터를 만듭니다 int
형식에 대한 포인터요
또한 상수인 포인터를 생성할
거예요
무슨 뜻이냐면 주소가 변경될 수 없다는 거죠
항상 배열 + n일 거고 이름은 배열 엔드일 거예요
루프가 더 효율적이기 때문에 이걸 하는 겁니다 배열
끝으로 가게 설정하고 포인터를 보는 거죠
배열 끝은 그 배열 끝의 주소를 가리키죠
통과된 걸 배열이라고 하고 n은
배열 크기예요
for 루프는 반복문 컨트롤 변수 포인터를 초기화합니다
배열에 대한 포인터죠 여러분이 해야 할 일은 배열의
첫 번째 요소에 포인터를 할당하고 싶다면 포인터는 배열과
같다고만 하면 돼요
루프 종료 조건은 포인터가 배열 끝보다 작을 때죠
포인터는 주소라는 걸 기억하세요 배열 끝도 주소예요
포인터 주소가 포인터 n보다 작으면 루프의 본체를
실행해야 한다는 거죠
포인터는 정수예요 16진수 주소죠
증액할 때마다 다음 주소로 가요 엔딩 주소가 있으니 엔딩까지
루프를 통과하라고 할 수 있죠
그런 다음 포인터 자체를 증가시킵니다 해당
주소를 증가시켜 배열의 다음 요소로 가도록요 우리가 가리키는
게 그거니까요
루프의 본체에서 SU + = 포인터라고 하죠
값을 얻기 위해 포인터를 과용할 거예요
값을 얻고 싶으면 포인터의 주소를 원하거나 포인터가
가리키는 주소를 원해서는 안 되니까요
그리고 마지막에 합계를 반환하죠 모든 요소를 한 배열로
합산할 거예요
메인에 선언 기능도 있는 게 보이실 겁니다
파일 상단과는 반대죠 보통은 파일 맨 위에 두죠
하지만 전체적으로는 10개의 요소를 만들어요, 3과 7 음화 9 등이요
그런 다음 배열이나 합계를 넘기고 크기는
10으로 지정하죠
여기서 알 수 있는 건 배열의 합을 반환한다는 거죠
점 연산으로 배열을 반복할 수 있어서 좋아요.
다음 주소를 더하고
마지막 주소를 볼 수 있어요.
포인터가 마지막 주소를 보는 게 더 효율적이죠 counter가
n보다 작은 걸 보는 것보다요
또한 우리가 상수로 만든 걸 아실 겁니다 상수는 변하지 않으니까요
컴파일러가 더 효율적이죠
여기 배열은 상수 포인터예요 주소가 바뀔 수 없다는 뜻이죠
이 예제에서 아셔야 할 건 함수에
배열을 전달하려면 단순히 배열의 이름을 지정해야 한다는 거죠
함수를 전달하는 방법은 알죠 배열에 대한 포인터를 생성하려면
배열의 이름만 지정하면 돼요
배열의 첫 번째 요소를 포인터에 할당할 때 봤죠
이게 암시하는 건 배열 SUM 함수에 대한 호출이
함수에게 전달된 건 사실 배열 값에 대한 포인터였다는 거죠
이걸 보면 배열과 포인터가 아주 밀접한 관계란 걸 알 수 있죠
배열은 포인터에 불과해요
그래서 함수 내에서 배열의 요소를 바꿀 수 있는 거죠
왜냐하면 이 시점까지는 데이터를 함수에 전달할 때 데이터가 함수
밖에서는 바뀌지 않거든요 포인터가 아니라면요
그래서 스캔파일 주소를 입력해야 해요
함수 밖에서 요소가 변경되는 유일한 경우는
함수에 포인터를 전달할 때죠
요소들이 그 함수 안에서 수정되기 때문에 포인터를
전달한다는 걸 암시하죠
이건 배열과 포인터가
아주 유사하다는 걸 증명하죠 다른 구문을 사용할
뿐 포인터예요
참조나 참조의 복사본을 전달하는 방법에 관해
얘기할 겁니다 그 참조로 함수
밖에서 함수의 데이터를 변경할 수 있죠
이전의 과제를 기억하신다면 함수에서
데이터를 변경하고 싶을 때마다 전역 변수를 사용해야
했죠
참조로 지나친다는 개념을 이해하지
못했고 포인터의 개념도 이해하지 못했거든요
아까도 언급했지만 포인터의 장점 중 하나는
함수 안에서 데이터를 변경해도 함수 밖에서 반영된다는 거죠
그건 또 다른 강의죠
하지만 아까 예제에서 봤듯이 그 개념 자체는 배열이 어떻게
포인터인지 보여주거든요
왜 함수 내의 형식적 변수가 포인터로 선언되지 않았는지 궁금하시겠죠
그럴 수도 있죠 이런 걸 할 수 있어요 int 배열 합, int 별 배열
배열로 선언할 필요가 없죠
완벽하게 유효해요 배열과 포인터가 같거든요 int 별 배열이라고 할 수 있죠
아주 밀접한 관계라고 했잖아요
그래서 배열 유형을 int의 배열 유형으로 선언할 수 있어요
배열 SUM 함수 안에서요 또는 int 포인터로 선언할 수도 있죠
그래서 배열을 매개 변수나 인수로 받아들이는 많은
함수가 매개 변수가 포인터인 거죠
함수에게 전달되는 배열의 요소를 참조하기 위해 인덱스 숫자를 사용하려면
매개 변수를 배열로 선언하세요
이것도 표기법이에요 대괄호와 서브스크립트
혹은 포인터를 사용하는 표기법의 다른 방식이죠
배열 자체는 보통 읽기가 더 쉬워요 프로그램
유지 보수 측면에서요 함수에 의한 배열 사용이 더 정확히 반영되죠
하지만 포인터는 사용하기 더 쉽죠
인수를 배열에 대한 포인터로 사용한다면 형식 포인터로 선언하세요
형식 매개 변수에서요
함수의 포인터 표기법을 사용한 예가 여기 있습니다
이전 예제에서는 배열 표기법을 사용했죠
int start array라고
입력하면 함수가 즉시 작아지는 게 보이실
겁니다 첫 번째 요소에 포인터를 할당할 필요가 없으니까요
루프는 또한 훨씬 작아집니다 왜냐하면 첫 번째
문에서 그 숙제를 할 필요가 없으니까요
그냥 배열이 배열 끝보다 작을 때까지 그 배열을 증가시킬
수 있어요 코드는 좀 줄었지만 여전히
아주 선명하죠 배열과 포인터를 이해하신다면요
int 별 배열을 넘기면 더는 그 배열을
초기화할 필요가 없죠 포인터에 넘길 거니까요 더는
포인터를 초기화하지 않아요
그런 다음 배열 끝의 주소를 설정합니다
정수 포인터로요
배열 끝이죠 그걸 이용해 루프를 빠져나와서
SU + = 별 배열이라고 하면 돼요 인다이렉션 연산자를
이용해 다시 배열을 실질화해 합계를 반환하는 거죠
주요 함수는 완전히 똑같습니다 선언은 배열의 반대인 포인터라는 점만 빼고요
다른 표기법을 사용했지만 같은 기능을 제공하는 두 가지 예가 있습니다
그래서 함수 매개 변수 안의 매개 변수인 포인터를 많이
보는 거죠
요약하자면 몇 가지는 유효합니다 포인터를 사용할 때 유효하고
그렇지 않을 때 유효하죠
여기서 몇 가지 변수를 선언하면 획득이라는 배열을 선언합니다 3개의 요소를
포함하고 있죠 그런 다음 2개의 포인터를 선언해요
그 포인터에서 산수를 할 수 있어요 포인터 1 더하기 +라고 하죠
점이나 2 = 점이나 1 더하기 2라고 할 수 있죠
포인터 2는 벌어들이기 +1이라고 할 수도 있어요
포인터가 있기 때문에 연산을 할 수 있고 주소로 포인터를 수정할 수 있기
때문에 완벽하게 유효하죠.
배열은 점 연산이 안 돼요 돈 더하기 더하기라고 하면 안 돼요
포인터 2-0이라고 하면 안 돼요 2 더하기 0이요 1은 주소니까요
배열 안의 어떤 것도 가리키지
않죠
획득 포인트를 곱하거나 1을 곱하거나 2를 얻을 순 없죠
그건 무효예요
포인터 연산을 할 때는 올바른 구문을 숙지하고
포인터 연산은 배열이 아닌 포인터에만 적용된다는 걸 명심하세요
또한 프로세스 배열은 포인터를 인수로 사용하죠
배열 표기법과 포인터 표기법 중 선택할 수 있어요 배열 처리
함수를 쓰기 위해서요
임의 함수를 처리하고 싶다면 포인터를 매개 변수로 사용하는 게 좋아요
어떤 걸 사용할지 고를 수 있어요
하지만 포인터를 사용하는 건 보통 코드보다 효율적이죠
배열 표기법을 사용한다는 것은 이 기능이 배열과 배열 표기법으로 작동한다는
것을 프로그래머들에게 더 잘 보여 줍니다 특정 언어를 프로그래밍한
경험이 있는 사람에게는요
이전에 프로그래밍을 했다면 포트란과 파스칼 등에서 화살표
표기법을 사용할 수 있어요
다른 프로그래머들은 포인터 표기에 익숙해서 포인터 표기가
더 자연스럽다고 느낄 수도 있어요
컴파일러의 점차적 산수와 포인터 표기법을
이용해 기계어에 더 가깝습니다 더 효율적인 코드로 이어지니 이걸 사용할
또 다른 이유죠
코드 블록 안의 이 예제들을 살펴보죠
슬라이드 예제를 보시죠 3번 라인에 함수 선언문이 있어요
배열 합계예요
이 예제에선 배열 표기법을 쓸 거예요
인덱스를 사용할 때는 괄호를 사용하죠
그걸 값 전달 배열과 크기
전달이라고 부를 거예요
배열의 SUM 함수는 정수 배열이에요 먼저 14번 줄에서
점 연산에 사용할 포인터를 만들어
주세요 그런 다음 배열의 끝을 주소
배열과 크기에 할당해야 해요
루프를 종료할 때 사용할 수 있는 배열의 끝이죠
하지만 배열에 포인터를 할당해야 해요
배열은 포인터에 할당할 수 있죠 첫 번째 요소를
가리키기 위해서요 배열 이름을 사용해서요
작전실 주소는 안 써도 돼요
마음만 먹으면 이런 것도 할 수 있어요
이것도 괜찮아요
그리고 포인터를 더해요 포인터를 증가시키죠 다음
주소로만 증가하니까요 배열의 다음 요소를 가리키고 있어요
18번째 줄에서는 포인터를 과감하게 사용하여 합계, 합계,
합, 더하기 합이 가리키는 포인터의 값을 계산하죠
이걸 빌드하면 경고가 하나 있어요 int가 아닌 메인이죠
이걸 바꾸고 싶어요 메인에서 오류 값을
반환하는 게 좋거든요 그냥 0을 반환하라고
하죠
메인에 오류가 있으면 마이너스 오류를
반환할 수 있어요 이제 이걸 실행하면 배열에 있는 값의 합을
수행하는 게 보일 겁니다 3 더하기 7 더하기 9 등이죠 그게
뭔지 모르겠지만 21처럼 보이네요
손쉽게 이 배열 매개 변수를 포인터로 수정할
수 있어요 별표 앞에 포인터를 선언하면 되죠
우리도 그렇게 불러요 우린 개조만 해요 포인터를 선언할 필요가
없어요 더 쉽게 하기 위해 이름을
바꿔야겠죠 하지만 이 포인터를 더는 선언할 필요는 없어요
여전히 배열의 끝을 얻고 싶고
더는 할당할 필요도 없어요
그냥 빈칸으로 둘까요? while 루프가 있는 게 사실 더 유용할 수도 있어요
숙제가 없으면 그냥 세미콜론을 넣으면 되죠
이제 됐어요 여전히 레퍼런스를 취소하고 반환하고 싶어요
하지만 이걸 빌드하면
함수 선언을 포인터로
정의해야 합니다 우리가 변경했으니까요
이건 어떤 이름이든 될 수 있지만 일관적일 거예요
이제 빌드∙∙∙
변경한 변수들을 모두 다시 사용하는지
확인해야죠
성공적으로 빌드했어요 실행하면 같은
결과가 나오죠 21이에요
그러니 포인터를 배열에서 공식 매개 변수로 사용하는 차이는
교환할 수
있다는 거예요 편리한 편리함이죠
하지만 포인터를 사용하면 보통 코드가 적죠
더 많이 조작할 수 있고 더 강력한 것들을 할 수 있습니다 컴파일러에
기반하여 더 효율적이기도 하고요 고마워요