[Powered by Google Translate] 가 structs에 대해 얘기하자. Structs 함께 변수의 무리를 그룹화 할 수있는 방법을 제공 좋은 패키지로. 그것은 바로 예를 볼 수있을 가장 쉬운 방법입니다 그래서 우리는 구조체 말 다음, 둥근 괄호를 열고 이 구조체에, 우리는 정수 연령을해야합니다 숯불 * 이름, 그게 전부예요. 그것은 곱슬 괄호 후 콜른으로 이상한 것처럼 보일 수 있습니다 하지만 structs와 필요한 사실입니다. 유효한 유형의 구조체 정의 내에서 이동할 수 있습니다. 여기, 우리는 정수 및 문자 *를 사용했습니다 뿐만 아니라 말하자면의 100 요소를 배열을 사용할 수 또는 다른 구조체. 당신이 C에서 structs를 사용하는 경우는, 당신은 새로운 유형을 생성하는 다른 유형의 수집 아웃. 여기, 우리는 새로운 유형을 만들고 있어요 정수와 숯불 * 부족합니다. 나중에 보 겠지만, 구조체 타입 Gmail을 사용하는 다른 종류의에 해당 방법은 여러가지입니다. 보통, 어떻게 구조체 유형을 비교됩니다 정수 타입과 비슷합니다. 우리가 작성한 코드는 유효한 C이며, 반면 그것은 매우 유용하지 않은 그리고 그 소리는 우리에게 경고를 제공합니다. structs와 비슷한 얼마나 기억 나? 음, 우리는 기본적으로 말 INT, 이는 매우 도움이 줄 수 없습니다. 그럼 실제로 해당 유형의 변수를 선언하게 그것을 세미 콜른의 앞 이름을 제공하여. 우리는 변수 학생 전화 할께. 이제 우리는라는 변수 학생을 선언했고 구조체에 의해 지정된 유형. 우리가 어떻게 구조체 내부의 변수를 어떻게해야합니까? 이 변수에 대한 기술적, 이름 회원입니다. 학생 구조체의 특정 멤버를 액세스하려면, 당신은 변수 이름에 점을 추가 당신이 원하는 회원의 이름이 나타납니다. 자, 이제, 단 2 유효한 가능성 student.age은 그리고 student.name. 그리고 우리가 뭔가 같이 할 수 student.age = 12 그리고 student.name = 학생. 이제 우리가 두 번째 학생을하고자 할 경우? 당신이 줄을 복사하여 붙여 넣기 생각할 수 학생 2 또는 뭔가 학생을 변경할 수 있으며, 그리고 그게 작동합니다, 하지만 기술적으로, 학생, 학생이 같은 유형이 없습니다. 봐, 당신은 서로에 할당 할 수 없습니다. 이 때문에 지금까지입니다 당신의 구조체은 익명있다. 우리는 이름을 제공해야합니다. 이를 위해 우리는 구조체의 이름을 삽입 단어 구조체 후. 학생, 정의이 나타납니다. 우리는 여전히 즉시 형식의 변수를 선언 할 수 우리가 전에 그랬던 것처럼, 학생을 구조체. 우리는 S1 전화 할게요 구조체 이름을 제공함으로써, 우리는 이제 구조체 학생을 사용할 수 있습니다 거의 동일한 방식으로 우리는 INT 사용할 수 있습니다. 그래서 우리는 입력 구조체 학생의 변수를 선언 할 수 같은 구조체 학생 S2. 배열과 마찬가지로, structs는 바로 가기 초기화 구문을 제공합니다 그래서 우리는 학생이 S2 구조체, 말을 할 수 동일 왼쪽 곱슬 브레이스 3, S2. 여기 S2.age는, 3 수 그리고 S2.name는 S2를 가리 킵니다. int 형식으로 당신이 할 수있는 모든 일을 생각 그들 대부분은 당신이 구조체 학생 유형으로 할 수 있습니다. 우리는 함수 매개 변수의 형식으로 구조체 학생을 사용할 수 있습니다. 우리는 새로운 구조체의 내부 구조체 학생을 사용할 수 있습니다. 우리는 구조체 학생에 대한 포인터를 가질 수 있습니다. 우리는 구조체 학생의 크기 작업을 수행 할 수 있습니다. 구조체 학생은 유형입니다 단지 INT와 같은 유형입니다. 우리는 또한 S2 to S1 할당 할 수 있습니다 모두 같은 타입이기 때문에, 그래서 우리가 할 수 S1 = S2. 우리가 할 경우 어떻게됩니까 S1.age = 10? 전혀 S2 변경됩니까? 다시 말하지만, 그냥 평범한 정수로 structs 생각합니다. 우리가 어떤 INT Y에 일부 INT X를 지정하는 경우는, X = Y와 같은 그리고, X를 변경 에서와 같이 X + +, Y는 전혀 변경합니까? Y는 여기 변경 등 둘 이상의 S2 않아하지 않습니다. S2.age은 여전히​​ 3. 그러나주의 하나의 구조체를 할당 때, 포인터의 모든 여전히 같은 일을 가리 그들은 단지 복사 된 때문입니다. 당신은 포인터를 공유하기를 원하지 않는 경우, 당신은 수동으로를 처리하기 위해 필요합니다 아마도 포인터 중 하나에 메모리 한 블록 malicking에 의해를 가리 키도록 및 데이터를 통해 복사. 이 곳 구조체 학생을 작성 가질 성가신 수 있습니다. 형 데프를 사용하여, 우리는 할 수 유형 데프 구조체 그리고 우리는 학생 전화 할께. 이제, 우리는 모든 학생을 사용할 수 있습니다 우리는 구조체 학생을 사용하는 데 사용. 이 유형의 방어력이 익명 구조체입니다 그리고 학생 호출합니다. 그러나 우리는 또한 학생들의 식별자를 계속한다면 단어 구조체 옆에 typedef 구조체 학생에서와 같이, 우리는 서로 교환하여 지금 구조체 학생 및 학생 모두 사용할 수 있습니다. 그들은 같은 이름을 가지고 필요가 없습니다. 우리는 밥에 데프의 구조체 학생을 입력 할 수 있습니다 그리고 학생 밥을 구조체 교환 형식이 될 것입니다. 에 관계없이 유형 데프의, 우리는 구조체 옆에있는 식별자가 필요 경우 구조체의 정의 재귀입니다. 예를 들어, 유형 데프 구조체 노드 그리고 그것은 정수 발로 정의됩니다 그리고 또 다른 구조체 노드를 가리 포인터를해야합니다., * 다음 구조체 노드에 있습니다. 그리고 우리는 노드 전화 할게. 이 구조체는 재귀입니다 구조체 노드의 정의는 내 포함되어 있으므로 구조체 노드에 대한 포인터. 우리가 구조체 노드 * 다음 말을해야한다는주의 구조체 노드의 정의의 내부, 유형 데프 허용 아직 완료되지 않았습니다 때문에 우리는이을 간단하게하기 단지 노드 * 옆에. 이와 비슷한 structs에 대한 자세한 내용을 알아 보겠습니다 때 연결 목록 및 나무 처리. 함수에서 structs에 대한 무엇입니까? 이것은 또한 완벽하게 유효합니다. 우리는 가질 수 func을 무효화 그 때문에 인자로 소요 학생의 그 학생이있는 무언가를하지 않습니다. 그리고 우리는 그렇게 같은 학생의 구조체로 전달할 수 있습니다. 이전의 S1의 Func. 구조체는 동작 정수는 함수에 전달 할 때를 정확하게. Func는 S1의 사본을 수신 그래서 S1 수정할 수 없습니다; 오히려, S.에 만 사본 저장 야 원하는 경우이 함수는 S1을 수정할 수에 func는 학생 * S를해야합니다 그리고 그렇게 같은 주소로 S1를 통과해야합니다. 학생 * S, func & S1. 여기 주소로 전달하는 또 다른 이유가 있습니다. 우리 구조체가 100 필드를 포함하면 어떨까요? 우리가 func에 학생을 전달 매번, 우리의 프로그램은 func의 인수 S에 그 100의 모든 필드를 복사 할 필요가 경우에도이 그 중 대부분을 사용하지 마십시오. func이 학생을 수정 계획하지 않더라도하면, 아직 주소에 의해 통과 할 가치 할 수 있습니다. 자, 우리가 구조체에 대한 포인터를 생성하려면 어떻게해야합니까? 우리는 같은 일을 할 수 학생 * S malloc와 동일 학생의 크기입니다. 아직 여기 일의 크기를 확인할 수 있습니다. 그럼 우리는 이제 세 멤버에 액세스하려면 어떻게해야하나요 블록의 S가 가리키는? 먼저해야 할 생각할 수 * S.age = 4, 하지만 꽤 작동하지 않습니다. 이건 정말로 해석되기 때문에 괄호 = 4 * S.age, 이는 심지어 컴파일되지 않습니다 S는 구조체에 구조체 나 대신 포인터 아니므로하면, 그래서 점은 여기에 작동하지 않습니다. 우리는 할 수 (* S). 세 = 4 하지만 괄호는 성가신과 혼란받을 수 있습니다. 다행히, 우리는 특별한 화살표 연산자를이 그 비슷한 거 S-> 세 = 4. 연령을 참조 이러한 두 가지 방법 동일 우리는 정말 어느, 화살표 연산자를 필요하지 않습니다 하지만 일이 보이는데 볼 수 있습니다. S는 구조체를 포함 메모리의 일부 블록에 대한 포인터이기 때문에하면, 포인터 화살표를 다음과 같이하면 S> 연령 생각할 수 그리고 연령 회원을 잡아. 그럼 왜 우리는 어느 structs를 사용해야합니까? 그것은 단지 원시 정수로 도망 확실히 가능 문자, 포인터와 같은 우리는에 사용하고 있는지, 대신에 S1과 S2 이전의, 우리는 age1, age2, NAME1 및 NAME2를 설계했을 텐데 별도의 변수에있는 모든. 이 단 2 학생들과 유효합니다 하지만 우리가 그들을 10가 있다면? 그리고 만약 대신에 단 2 분야 학생 구조체는 100 필드를 했어요? GPA, 코스, 머리 색, 성별, 등등. 대신 10 structs의, 우리는 1000 별도의 변수가 필요합니다. 또한, 기능을 고려 그는 만 인수로 100 필드 그 구조체 소요 모든 필드를 출력합니다. 우리는 구조체를 사용하지 않은 경우 우리가 그 함수를 호출 매번 우리는 모든 백 변수를 전달해야 우리는 학생 1 백 변수를 가지고 있다면, 100 학생 2 변수, 우리는 우리가 실수로 학생 1에서 몇 가지 변수를 전달하지 않도록 할 필요가 학생 2 몇 가지 변수. 그것은 구조체와 그런 실수를 불가능 모든 100 변수는 단일 패키지에 포함되어 있기 때문에. 최종 참고 그냥 몇 : 이 시점에 이르기까지까지, 훌륭한을 이해 한 경우. 비디오의 나머지는 완성도 '를 위해서입니다. structs는 포인터의 유형을 수용 할 수 있기 때문에하면, 그들은 또한 함수 포인터를 수용 할 수 있습니다. 당신은 객체 지향 프로그래밍에 익숙한 경우, 이 객체 지향 스타일로 프로그램을 structs를 사용하는 방법을 제공합니다. 다른 시간에 함수 포인터에 대한 자세한. 또한, 때로는 2 structs가있을 수 있습니다 그의 정의는 서로에 따라 달라집니다. 예를 들어, 우리는 구조체를 가질 수 어떤은 다음과 같이 정의됩니다 구조체의 B에 대한 포인터 구조체 B * X, 지금 우리는 구조체의 B 할 수 있습니다 어떤은 포인터로 정의됩니다 구조체에 구조체 A * Y. 하지만 이것은 컴파일되지 않습니다 구조체 B는 구조체가 컴파일되고있는 시간에 존재하지 않기 때문에. 그리고 우리는 구조체와 구조체를 교환하는 경우 B, 그리고 우리는 단지 같은 문제로 죽었을 거에요; 이번에는,와 기존의하지 구조체. 이러한 문제를 해결하기 위해, 우리는 작성할 수 있습니다 구조체 B; 구조체 A.의 정의 전 이것은 앞으로 선언이라고합니다. 이것은 단지 컴파일러가 알 수 있습니다 그 구조체 B 완전히 나중에 또는 다른 곳에 정의됩니다 유효한 유형입니다. 내 이름은 롭 보덴 있으며,이 CS50입니다. [CS50.TV]