다시 오신 걸 환영해요
이번 강의에서는 포인터와 구조의 연관성을
알아보도록 하죠
구조 내부의 요소들이 포인터가 될 수
있어요 우리 구조 그 자체를 포인터로 만들 수도 있고요
아주 유용한 개념이죠
그래서 구조가 중요합니다 c는 두 구조의 포인터를 제공하죠
유형 구조 변수를 생성할 때 그걸 포인터로
만들 수 있어요
구조물 자체보다 구조물을 조작하는 게 더 쉽죠
이것도 표기법 같은 거예요 일을
더 쉽고 효율적으로 만들죠
c 언어의 예전 구현들을 보면
구조는 함수에 대한
인수로 전달될 수 없습니다 하지만 포인터는
할 수 있죠 이게 구조를 갖는 또다른 이유입니다
여러분이 그걸 선언했을 때 포인터가 될 수
있거든요 그런 다음 옛날 버전 C에서 그걸 함수에
인수로 넘길 수 있거든요
인수로 구조를 전달할 수 있다고 해도 포인터를
전달하는 게 더 효율적이죠
그게 더 효율적이니까요 과거에도 중요성을 전달하는 것이 더
효율적일 수 있다는 얘기를 했었죠
이 경우엔 더 효율적이죠 전체
구조를 넘기는 경우 구조가 크고 많은 요소를
포함한다면 그 구조의 모든 요소를
그 매개 변수로 복사하는 거니까요
포인터를 전달하는 경우 그냥 주소를 복사하는 거죠
그래서 구조화된 인수로의 포인터가
더 중요합니다 구조가 클 수 있으니까요
그래서 많은 데이터가 구조를 이용합니다 다른 구조에 대한 포인터를
포함하고 있죠
C# 프로그램 구조에서 많이 보시게
될 겁니다 아까 언급한 이유와 관련해서 포인터죠
옛날 버전에서 매개 변수로 패스할 수 있고 더 효율적이죠
모든 걸 패스 바이 값으로 하니까요
주소를 복사하는 데 훨씬 효율적이죠
이 큰 구조의 모든 요소를 복사하는
것보다요
구조를 포인터로 선언하는 건 꽤 간단해요
타격이라는 변수를 포인터로 정의할 때 데이터 형식 다음에 별표를
사용하면 돼요
우리는 구조가 새로운 유형이라고 말했어요
이 경우에는 가장 중요한 데이트 구조죠
그냥 날짜를 구성하고 별표 날짜 포인터를 사용하면 됩니다.
그러면 null로 초기화 할 수 있어요.
왜냐하면 날짜 포인터라고 할 때 메모리를 할당하지
않고 실제 포인터를 저장하기 위해 메모리를
생성한다는 걸 기억하세요.
그 안의 데이터에 대한 메모리를 생성하는 게 아니죠
이 날짜 포인트나
다른 날짜의 주소를 할당할 수 있어요 아니면
다른 메모리를 다른 곳에 할당하거나 일부
데이터를 이용해 초기화할
수도 있고요
변수 날짜 포인터는 다른 포인터처럼 할당될 수
있습니다 할당 문으로 오늘의 날짜를 지정할
수 있습니다 이미 오늘의 날짜를 선언한 경우에요
&를 이용해서 주소를 알아냈어요
그래서 일반적인 날짜 구조를 만들어 오늘 날짜를 입력하죠
세 가지 원소에 대한 기억을 생성하는 거죠
그런 다음 포인터를 만들어 다른 날짜의
주소를 할당하는 거죠
아주 간단해요 우린 일반 데이터 타입으로 그걸
했었죠 구조로도 별반 다르지 않아요
날짜 포인터가 가리키는 데이터 구조의 멤버들에게 간접적으로 접근할 수 있어요
그래서 이렇게 해야 해요
데이 포인터 구조의 요소들에 접근하고
싶다면 먼저 레퍼런스를 해제해야 해요
그래서 괄호 안에 넣는 게 유용할 겁니다 아주 간단하죠
날짜 포인터를 참조 해제해야 합니다 오늘 날짜가
가리키는 것의 값을 얻기 위해서요
특정 값을 설정하기 위해 오늘 날짜의 주소를
가리키는 값 말이에요
그래서 참조를 해제하고
.day=21을 하면 21을 하루 포인터에 할당할
수 있어요.
위에 있는 것은 오늘 날짜가 가리키는 것을 가리키고 있는 것입니다
우리는 이 값에 접근하여 날짜를 21로 정하길 원하죠
이 경우에는 괄호가 필요합니다 점이
별표보다 먼저 있기 때문이죠
괄호를 넣지 않으면 망치게 돼요 점을 먼저 넣으려고 하거든요
포인터를 포인터로 보내기 전에요 데이터를
가리키려고요
Null 포인터로 데이터에 접근하려고 할 거예요
참조를 없애서 그 가치를 얻는 거죠
자, 이제 우리가 스트럭츠에게 포인터를 줄 차례죠
날짜 포인터로 가리키는 날짜 구조에 저장된 달의 값을 테스트하고 싶다면
이런 걸 할 수 있어요
포인터를 레퍼런스 해제하고 괄호를 넣어요 점보다 우선하도록요 그런 다음
. month = 12라고 하죠
완벽하게 유효한 구문이에요
하지만 좀 거추장스럽네요
C#은 고유한 구문이 있어서 모든 걸 레퍼런스를 해제하고
구조의 괄호를 쓸 필요가 없어요
구조가 가리키는 것에 액세스하고 싶을 땐 이런 식으로 레퍼런스를
해제할 필요가 없어요
C에 포인터 구조에 존재하는 특별 연산자가 있습니다
대시가 보다 크죠
대시 다음에 더 큰 기호가 뜨죠
포인터를 다시 참조할 필요가 없어요
괄호 안에 x를 쓰고 y에 점을 찍는 대신
x가 y보다 크다고 쓰면 돼요
x는 포인터이기 때문에 참조할 필요가 없고 구조 안의 요소들에
접근하고자 합니다 무엇을 가리키든지 간에요
그래서 이 구문을 곳곳에서 보게 될 거예요 괄호와 d 참조가
안 보일 거예요 다 맞는 말인데 자꾸 글자를 입력하네요
x가 y보다 크다고 하는 게 훨씬 효율적이에요
이전의 if문은 괄호 안에서 참조를 없애는 대신 if date
포인터 대시가 월보다 크다고 하면 돼요
다소 직관적이죠 대시가 크다는 건 뭔가를 가리키고 있다는 뜻이니까요
Date 대시가 월보다 크군요
날짜 포인터는 포인터예요 그래서 대시를 크게 쓰는 거죠
중첩 구조라면 대시를 구조보다
크게 하고 그 뒤에 점을 찍어야죠 중첩 구조의
요소들에 접근하려면요
하지만 데이 포인터는 포인터이기 때문에 대시 = 혹은 대시 보다 큰를
사용해야 해요
여기 예제가 있어요 구조 날짜를 생성하는데 세 가지
요소가 있어요 그런 다음 포인터 날짜 포인터를 생성하죠 오늘 일반 변수를
생성할 거예요 포인터에 오늘의 주소를
할당하고 구조의 실제 요소를 할당하기
위해 대시를 더 크게 써서 프린트할 수 있어요
어떻게 작동하는지 코드블록에서 보도록 하죠
여기 예제를 넣을게요
일반적으로 구조물을 정의할 때 함수
밖에서 정의하죠 그럼 어떤 함수에서도 사용할 수 있으니까요
글로벌 게임 같아요 하지만 구조를 정의할
때 어떤 메모리도 생성하지 않는다는 걸 기억하세요
여전히 로컬 변수 또는 포인터로 변수를 만들지만
실제 정의는 함수 밖에 있어요
사용하고 싶으면 어떤 기능에서도 사용할 수 있어요
이 위쪽에 새로운 타입 Date나 name to Date를
생성했어요 3개의 정수를 포함하고 세미콜론으로 끝맺죠
그런 다음 메인 내부에 몇 가지 변수를 만들어요
하나는 오늘 하루의 일반적인 변수 구조 날짜이고
다른 하나는 포인터예요 앞에 별표가 붙어 있는 걸 보면 포인터라는 걸 알 수 있죠
여러분이 포인터를 만들 때 메모리만 할당해 해당 포인터의
값에 대해 해당 주소를 저장하죠
그래서 거기에 주소를 할당해야 해요 오늘 ampersand와 함께요 왜냐하면
그건 메모리 리포트를 생성하기 때문이죠
이제 날짜 포인터는 오늘을 가리키게 됩니다
오늘의 주소와 함께요
그런 다음 데이터를 할당할 수 있어요 아주 유용한 이 대시를 사용해서요
다른 사람처럼 할당 연산자를 사용하는 데이터를 할당하는 거죠
프린트할 때 레퍼런스를
해제할 필요가 없어요
프린트하기 위해서
포맷 스펙티파이어를 위한 데이터 타입을 지정합니다 정수는 % 높은 %d와
동일합니다 그리고 대시 그레이더를 이용합니다 왜냐하면 이건 참조를
감소시키기 위해서 기억하기 때문이죠
이걸 바꾸면 유효할 거예요
괄호를 넣고 .월이라고 해야 해요
어느 쪽이든 좋지만 대시가 더 커지는 것에 익숙해지세요 더 나은 구문이니까요
이제 이걸 빌드하면 날짜
포인터 값이 출력되는 걸 볼 수 있어요
모두 925와 2015로 설정돼 있죠
오늘 날짜는 9시 25분 15초예요 그렇게 프린트할 수 있었죠
꽤 간단하죠
대시가 크다는 걸 기억하세요 포인터를
위한 새 구문이에요
하지만 다른 건 다 정상이에요
포인터는 스토어 주소를 가지고 있어야 합니다
동적 메모리를 할당하거나 기존 구조를 할당해야 하죠
어떤 녀석들을 혼내줄지 다시 얘기해보죠
이제 포인터를 포함하는 구조에 대해 얘기해 보죠
구조를 위한 포인터를 만드는 법은 알죠
포인터에 대한 메모리를 할당할 수 있어요 기존 포인터의
기존 주소를 할당하고 싶지 않을 때요
하지만 구조 내부의 요소는
포인터 그 자체예요 포인터는 구조의 일원일 수도 있어요
그 캐릭터 배열을 쓸 필요는 없어요
구조를 만들 수 있죠 포인터로
이름을 붙일 수 있어요 이 예제에서는 두 개의 정수와 두 개의 정수 포인터
P1과 P2가 있었죠 아주 유효한 구문이에요
그래서 포인터라 불리는 구조는 두 개의 정수 포인터를 포함하도록 정의되죠
첫 번째는 P1이고 두 번째는 P2예요
형식 구조 변수를 포인터로 정의할 수 있어요 일반적인, 구조,
int, 포인터처럼요
변수 포인터도 다른 스트럭츠처럼 사용할 수 있어요
포인터는 포인터가 아니에요
int 포인터예요 치기 내부에 두 가지 요소가 있는데 그게
포인터예요 하지만 포인터 자체는 실제 포인터가 아니죠
그러니 주의를 기울이세요 구조 변수로 구성원으로서 포인터가 2개죠,
달라요
따라서 포인터 변수 안에 있는 요소에
접근하고 싶다면 대시를 더 크게 쓰면
안 돼요 포인터는 포인터가 아니라 구조거든요
점을 이용해 P1과
P2에 액세스할 수 있어요
이 예제에선 구조를 생성합니다
변수를 생성하죠 포인터라고 부르는 포인터가 아니에요
두 개의 정수인 i1은 100과
같고 i2는 초기화되지 않았죠
P1과 P2는 포인터예요
그래서 메모리가 할당된 주소의 유효한 메모리 주소를
가지고 있어야 하죠
그게 i1과 i2가 하는 일이죠
정수 변수를 선언하면 메모리를 정수용으로 할당하죠
i1과 i2의 주소를 P1과 P2로 할당하면 아무 문제 없습니다 i1과
i2는 정수용으로 메모리를 할당하니까요
만약 정수 포인터가 정수 포인터가 아니라 문자 포인터라면
동적 메모리를 할당해야겠죠
이렇게 정수를 넣고 있어요 두 정수의 주소를 p1과 p2로 할당했죠
이제 별 포인터라고 하죠 p2는 97, 마이너스
97이죠
왜 저기서 레퍼런스를 취소해야 하죠?
포인터가 있으니까요 P2를 말하는 거예요
조언이죠 Pt P2는 포인터예요
구조 요소에 접근하는 게 아니에요
모든 의견을 참작하고 있어요 P2요
그 값을 할당할 거예요 97을 가리키고 있는 게 뭐든 간에요
차이점을 보세요
구조 포인터를 만드는 게 아니에요
정규 변수 포인터를 생성할 건데
두 가지 요소가 포인터예요
구조 내부에 이 두 요소를 할당하고 싶다면 인다이렉션 연산자를
이용해 참조를 해제해야 합니다 여기서 그렇게
하죠
그리고 2개의 print문에서요
다시 한 번 P1이 가리키는 값을 출력하고 싶어요 그래서
P2와 똑같이 참조를 해제했죠
그런 다음 값을 다시 출력하고
싶어요 포인터가 가리키는 값을요
첫 번째 것에서 i1 = 쉼표
I는 포인터예요 P1은 % I예요
큰따옴표 안의 첫 번째 것은 실제 텍스트를 프린트하는
거예요 쉼표를 찍은 후로는 어떤 것도 참조 삭제를 하지 않아요
먼저 100인 i1을 프린트하고 그 다음 100인
포인터 P1을 프린트할 거예요
P2에 할당하고 나면 I2는
마이너스 97이 되겠죠
그럼 캐릭터 배열이나 문자 포인터는 어떨까요? 이전 강의에서는 포인터
내부의 요소로서 캐릭터 배열을 생성하는
법을 다뤘죠 그럼 캐릭터 포인터는 어떨까요?
먼저와 마지막으로 캐릭터
배열을 사용할까요? 아니면 요소로서
먼저와 마지막으로 캐릭터 포인터를 사용할까요?
어떤 게 더 좋을까요?
두고 봐야죠 이것도 표기법적인 거지만 포인터를 쓰면 장점이 있어요
그래서 요소 안에서 캐릭터에 대한 포인터를 만들
때 대개는 좀 더 낫죠
요소로서의 배열 요소 Char 배열 또는 요소로서의 포인터를
만들 때 어떻게 되는지 아셔야 합니다 둘 다 유효해요
하지만 큰 차이가 있어요
구조를 Vep나 vp라고
하고 탈리아와 서머스라고 한 다음 스트럭트
포인터 이름을 써요 잊지 마세요, 구조명에는 글자 배열이 있어요
스트럭트 포인터에는 포인터들이 있어요
여기서 포인터는 브래드와 폴링조와 동일해요
그런 다음 프린트해요 첫 번째 요소를 프린트하죠
글자 a와 vp요 그런 다음 트레어스 첫
번째 요소요 첫 번째에 대한 포인터죠
스트럭츠 네임은 varablevep이고요
스트링은 구조 안에 저장되어 있어요
이 구조물은 두 이름을 위해 40 바이트를 할당했어요 바로
문자 배열이죠
포인터 안에 캐릭터 배열을 만들 때 일어나는 일이죠
20과 20이라는 이름을 위해 40 바이트를
할당했어요
포인터 이름, 가변 트레우스 포인터 2개가 있든 처음과 끝에 있든 문자열은
컴파일러가 스트링 상수를 저장하는 곳에 저장되죠
구조물에는 두 주소가
있어요 포인터는 주소인 값을 포함하고 있어요
구조 내에서 2개의 포인터를 할당할 뿐이죠
대부분 시스템은 16 바이트고 포인터는 보통 8이나 4 바이트예요
p 이름 구조는 문자열을 저장할 공간을 전혀 할당하지 않습니다 왜냐하면
포인터를 위한 공간만 할당하기 때문이죠
포인터는 주소 값을 가지고 있어요.
가리키는 주소는 그에 대해 할당된 메모리가 없어요
그래서 2개의 포인터를 생성할 때 2개의 포인터에 대해 할당된 메모리가 없어요
공간이 없어요
다른 곳에 할당된 공간이 있는 문자열에서만 사용될 수 있죠
구조물 내부에 포인터가 있을 땐 멜록이나
가래를 사용해야 해요
그렇지 않으면 문자열 상수가 저장된 곳에 저장될 수 있죠
그게 큰 차이점이죠 그래서 포인터와 P 이름 구조는 오직
프로그램 다른 곳에 생성되고 할당된 문자열을 관리하기 위해만 사용되어야 하죠
동적으로 할당하지 않거나
다른 곳에서 할당되지 않은 이상 거기에 데이터를 할당하면
안 됩니다 기존 구조물 같은
것에 의해서요 하지만 일반적으로 여러분은 그 포인터를 없애야 하죠
아주 달라요
이 2개의 문자 배열을 40 바이트로 할당했어요 스트럭트라는 이름 내에서요
P, 스트럭트는 2점이에요
유형의 변수를 생성하면 그에 대해 할당된 메모리가 없어요
두 문자 포인터를 위한 메모리를 생성합니다 각각 8바이트죠
처음과 마지막이 가리키는 것에 대해 실제로 메모리를 할당하려면 초소형 메모리를 해야 해요
그래서 포인터를 사용하는 게 말이 되는 한 예가 있어요 그리고 구조는 문자열을
다루기 위한 거죠 여러분이
그 메모리를 동적으로 할당할 경우에요
그게 보통 사용할 때죠 허가된
다른 데이터 유형이 자동으로 메모리를 할당해 주거든요
포인터를 이용해 주소를 저장해야죠
이건 유리한 점이 있어요 말로이가 줄을 걸 수 있는 충분한 공간을
할당하게 할 수 있죠 동적 메모리 할당의 장점에 관해 얘기했죠
컴파일 타임에 정적으로 생성할 때는 특정
바이트만 생성하게 되죠
바이트가 더 필요하면 프로그램이 실행되지 않을 거예요
다시 가서 재편집하세요 동적으로 할당된 문자열을 가지고 다시
조정할 수 있습니다 필요한 만큼의 메모리를 생성할 수 있습니다 프로그램에서
훨씬 더 효율적이기 때문이죠
구조 내부에서 생성된 모든 포인터에 대해서 meloc을 사용하세요.
이 경우엔 이름 카운트라는 스트럭처가 있죠
두 가지 포인터가 있어요 문자 포인터요 fname과 성이요
그리고 int와 글자가 있죠
이 안에 있는 두 줄은 구조에 저장되어 있지 않아요
주소를 포함하는 포인터에 대한 메모리만 생성하죠
fname과 lname에 대한 메모리를 만들고 싶어요 포인터가 가리키는 것에 대해서요
동적 메모리 로케이션에 의해 관리되는 덩어리에 저장하길 원하죠 초소형 메모리를 사용해서요
두 개의 문자열의 주소는 저장된 거지 그들이 가리키는 건 아니에요
주소는 문자열을 처리하는 함수들이 일반적으로 사용하는 것입니다
그래서 포인터를 사용하는 것입니다 그럴 필요가 없기
때문입니다 포인터를 이용하면 더 쉽게 전달할 수 있죠
여기 예제가 있어요 GetInfo라는 기능이 있어요
팁을 줘야 해요
포인터를 아주 쉽게 전달할 수 있어요
이제 또다른 혹은 포인터 배열을
생성할 거예요 전달될 포인터
배열이죠 메모리를 할당할
거예요
보다시피 temp라는 글자를 만들어 그
temp에 데이터를 저장하죠
사용자에게 뭔가를 가져오라고 하죠 Sgets는 익숙하지 않지만 getShave scanf와 비슷하죠
포인터 내에서 fname에 대한 메모리를 할당합니다 다른 캐릭터에 대해
메모리를 할당하는 것처럼요 말로크한테 전화해서
바이트 숫자를 전달하죠
이 경우에는 str의 길이가 10이고 null 터미네이터는 1이에요
말록은 텅 빈 스타가 돼요 그래서 캐릭터 스타를 캐스팅했죠
하지만 중요한 건 이거예요 말코손바닥사슴 울음소리는 송곳니가 있는 곳에 꼭 필요하죠
포인터를 전달했는데 포인터는 할당된 메모리가
없어요
메모리를 할당하고 있어요 그럼 쉽게 복사할 수 있죠
매개 변수로 통과된 구조 pst의 fname에 임시직을
복사할 수 있어요
그리고 성을 입력하게 할 수 있어요 성에는 몰록 메모리를 더할
수 있고 성 이름 구조 변수에 저장할 수 있죠
여러분이 하셔야 할 게 이겁니다 여러분의 구조 안에 캐릭터에
대한 포인터가 있을 때 말로크를 하셔야 해요
포인터는 주소만 저장하거든요
주소를 저장할 만큼의 메모리를 할당합니다 문자열을
저장할 만큼의 메모리는 아니고요
주소가 가리키고 있는 것이 무엇이든 메모리를 할당해야 합니다.
간단하게 간단하게 할당하면 됩니다.
유일한 차이점은 여기에서 굵은 기호를 사용해서 문자 포인터로
있는 요소들에 접근할 수 있다는 것입니다. 그래서 그것에 할당할 수 있고
참조를 취소할 수 있어요.
이것들을 가지고 놀고 싶을 거예요. 이건 스트럭츠 내부에서
흔히 볼 수 있는 캐릭터 정보예요
이걸 해야 하는 과제가 있을 거예요 하지만 이 코드를 가지고 해보고 싶어요.
코드 블록으로 들어가서 문자열을 위한 메모리나 문자
포인터를 할당할 거예요. 그리고 str 카피를
이용해서 데이터를 저장할 수 있는지 볼게요. 하지만 먼저 메모리를
할당해야 해요.
이전 예제에서처럼 상수를 작업하는 경우 그 메모리가 어디서 할당되는지 누가 알겠어요?
이번 강의에서는 중요한 개념을 많이 소개했는데요
이 새 구문에서 포인터 역할을 하는 구조는
In다이렉션
연산자를 쓰는 것보다 대시를 더 많이 쓸 수 있죠,
아주 좋아요
그리고 실제로 요소들을 포인터로 갖는 것과 캐릭터 포인터를
위한 메모리를 어떻게 할당해야 하는지를요 고마워요