다시 오신 걸 환영해요
이번 강의에서는 포인터와 배열의 관계에 관해 얘기할 거예요
산수에 관해 얘기하기 전에 서로 밀접한 관계가 있다는
걸 먼저 이해해야 해요 그럼 시작하죠
배열은 같은 유형의 개체의 집합으로
단일 이름을 사용해 참조할 수 있죠 이제 배열을 꽤 잘한다는 걸 알죠
몇몇 섹션에서 캐릭터 배열을 사용했죠
대괄호 안에서 인덱스나 서브스크립트를 이용해
액세스할 수 있는 배열이죠 기억하죠
배열은 0에서 시작한다는 걸 알죠
하지만 같은 변수 이름으로 여러 달을 유지하는 방법일 뿐이에요
포인터는 값을 가진 변수로 메모리 주소를 값으로 갖고 있어요
정해진 형식의
다른 변수나 상수를 참조할 수 있죠
포인터가 뭔지도 이 시점에서 확실히 짚고 넘어가죠
메모리 주소만 갖고 있어요
포인터를 이용해 다른 변수의 주소를 다른 시간에 보관할 수 있어요
하지만 같은 타입이어야 해요 int 포인터는 int 형식의
주소를 복구하기 위해 가리켜야 하죠
배열과 포인터는 꽤 달라 보이지만
아주 밀접하게 연관돼 있고 가끔 호환성으로 사용될 수 있어요
특히 캐릭터 배열에서요
문자열인 remember라는 문자열을 만들
수도 있고 본질적으로 같은 것인 문자 포인터를 만들 수도 있어요
메모리를 할당하고 문자 포인터로
자유롭게 하느냐에 따라 약간의 차이는 있지만요
캐릭터 배열은 그럴 필요가 없지만
캐릭터 A도 고정된 크기예요
문자 배열 문자열을 크기로 20개
만들면 19개만 저장할 수 있어요
문자 포인터를 이용하면 동적 메모리 관리를 할
수 있고 크기를 늘리거나 줄일 수 있습니다 메모리와 관련해서는
더 효율적일 수 있죠
하지만 c에서 포인터를 가장 많이 사용하는 건 배열에 대한 포인터죠
특히 캐릭터에 대한 포인터를
자주 사용할 때죠
캐릭터 포인터는 캐릭터 배열과 같아요
포인터를 이용해 삭제하는 주된 이유는
표기법의 편리성과 프로그램의 효율성 때문이죠
따라서 많은 경우 하나의 배열이나 포인터를 사용할 수 있습니다
동적 메모리 관리를 제외하고요
하지만 대부분은 할 수 있어요 유일한 차이점은 구문이라는 거죠
표기법이에요
하위 스크립트로 요소 접근을 하느냐 점
연산을 하느냐 해당 요소의
특정 주소를 가리키는 문자 포인터를 사용하느냐죠
캐릭터 포인터를 사용하는 것도 더 효율적이고요
배열에 대한 포인터는 보통 코드로 이어집니다 메모리를 적게 쓰고 실행이 빠르죠
그래서 캐릭터에 대한 포인터를 가능한 많이 사용해야 하고
다른 데이터 타입에도 포인터를 사용해야 하죠
빠르고 메모리 사용이 적으니까요 배열 이상의 포인터죠
100개의 정수 배열이 있다면 무슨 뜻인지
알죠 int 값은 100이라고 하면 돼요 크기는 100이에요
이 배열에 100개의 정수를 저장할 수 있다는 뜻이죠
포인터도 정의할 수 있어요 값 포인터라고 부르겠습니다
값 배열을 가리키고 있으니까요
이 배열에 포함된 정수 값에 액세스할 수 있죠
이스타 값 포인터라고 하죠 이 시점에서 포인터를 선언하는 방법은 알죠
배열의 요소를 가리키는 데 사용되는 포인터를 정의할
때 포인터를 배열에 형식 포인터로 지정하지 않아요
포인터 투 엔드, 더블 포인터 투만 들어
왔잖아요
하지만 배열을 사용할 땐 뾰족한 배열이 아니죠
저 실제 포인터는 배열에 포함된 특정 요소를 가리키고 있어요
그러니 명심하세요 값의 주소를 포인터로 지우면
전체 배열이 아니에요
값 포인터를 설정해 첫 번째 요소인 값 배열을 가리키려면 값
포인터 또는 값과 같다고만 하면 돼요
주소 같은 건 안 쓰셔도 돼요 값 배열은
포인터니까요
머릿속으로 그려야 해요 이 배열들은
후드 아래의 포인터죠
첫 번째 배열 요소를 포인터로
할당하고 싶다면 등호 연산자의 오른쪽에 배열을
지정하고 왼쪽에 값 포인터만
지정하면 돼요
이건 배열에서 첫 번째 주소나 첫 번째 요소를 가리킬 거예요
주소 연산자가 사용되지 않는 걸 보세요
C 컴파일러는 서브스크립트 없는 배열 이름의
모습을 배열에 대한 포인터로 보고 있어요
서브스크립트 없이 값을 지정하는 건 값의 첫
번째 요소에 대한 포인터를 생성하는 효과죠
그 말은 이제 배열 내의 그 이하 값을 가리킬 수 있다는
거죠 포인터를 증가시켜 다음 주소로 가도록요
다음 강의 몇 개에서 점산에 관해 얘기할 때 그 점을 다룰 거예요
그냥 표기법일 뿐이지만 효율성을 위한 것이기도 하죠
값의 시작에 대한 포인터를 생성하는 것과 동등한 방법은 연산자의
주소를 오른쪽의 첫 번째 요소에 적용하는 것이죠
두 가지 방법이 있는데 둘 다 괜찮아요
하지만 이렇게 할 수도 있어요 값을 값을 sub0으로 설정할 수 있어요.
값 포인터를 배열의 첫 번째 요소로 설정하죠
이걸 사용하거나 값을 값 값과 같다고 하면 돼요
&가 없고 서브스크립트가 없으면
코드가 줄어들거나 더 쉽게 쓸 수 있어요
이건 좀 더 명확할 수도 있어요 왜냐하면
선언을 보기 전에는 값이 배열인지 알 필요가 없거든요
하지만 어느 쪽이든 괜찮아요 값 포인터는 값과 같고 값 포인터는
값 sub-0의 주소와 같아요
프로그래머의 기호에 따라 다르죠 이것도 기호학적인 거예요
반복해서 말씀드리자면
AR sub-i 두 가지 표현과 별표
a+i가 있을 때 그 둘은 동등한
의미예요
이 점을 확실히 이해하셨으면 해요
AR이 배열의 이름이라면 둘 다 작동하죠
포인터를 사용해 레퍼런스를 해제할 수 있어요
포인터 변수라면 둘 다 작동하죠
AR + 더하기 같은 식을 사용하세요 AR이 포인터 변수일 때만 작동하죠
따라서 ++를 해서 배열을 증가시킨
후 다음 요소로 넘어가길 기대할 순 없죠
그건 배열 포인터에서만 할 수 있어요
배열을 가리키는 포인터가 있는데 다음 요소로 가고
싶다면 매번 증가시킬 수 있어요
하지만 AR sub-i라고 하면 AR sub-i는
배열이고 배열은 포인터이기 때문에 탈륜시킬 수 있어요
ar는 포인터이고 ar
+ i를 할당했으니까요 같은 거죠
다음 강의에서는 점 연산을 다룰 텐데 배열과
포인터의 관계와 깊이 연관된 내용이죠
포인터는 배열일 수 있어요 포인터 배열이 아니라 요소예요
포인터의 주소를 이용해 배열을
탐색하고 반복할 수
있어요 고마워요