>> [음악 재생]
>> DOUG 로이드 : 포인터, 여기에 우리가 있습니다.
이것은 아마도에 가고 가장 어려운 화제
우리는 CS50에 대해 이야기하는 것이.
그리고 당신이 읽은 경우 포인터에 대해 아무것도
당신은 조금있을 수 있습니다 전에 협박이 비디오로 전환.
그것은 포인터 사실 당신에게 능력을 허용합니다
아마 망치 꽤 심하게 당신이있을 때
변수 및 데이터 작업, 당신의 프로그램이 충돌을 일으키는.
하지만 실제로는 정말 유용하다 그리고 그들은 우리에게 정말 좋은 방법 허용
다시 데이터를 전달하고, 앞으로 기능과,
것을 우리는 그렇게 할 수 없습니다.
>> 그래서 우리 정말 기차가 여기에 수행 할
당신은 좋은 포인터 훈련, 그래서하기 당신은 효과적으로 포인터를 사용할 수있는
당신의 프로그램이 훨씬 더 확인합니다.
내가 말했듯이 포인터는 우리에게 다른 줄 방법은 함수 사이에 데이터를 전달합니다.
지금 당신은 기억 경우 이전 비디오, 때
우리에 대해 얘기했다 변수 범위, 내가 언급
우리가 사이를 통과하는 모든 데이터 C 함수는 값에 의해 전달됩니다.
그리고 나는 것을 사용하지 않았을 수 있습니다 용어는 내가 거기에 의미, 무엇을
우리는 데이터의 사본을 전달하는 것이 었습니다.
우리가 함수에 변수를 전달하면, 우리는 실제로 변수를 전달하지 않을
함수에, 오른쪽?
우리의 사본을 전달하는 함수에 데이터.
이 기능은 무엇을 의지합니까 그것은 어떤 값을 산출하고,
어쩌면 우리는 그 값을 사용 그것을 다시 줄 때.
>> 하나의 예외가 발생했습니다 값으로 전달이 규칙,
우리는 무엇을 그에게 돌아올 것이다 이 비디오에 나중에 조금.
우리는 대신 포인터를 사용하는 경우 변수를 사용하여,
또는 변수를 사용하는 대신 자신이나 변수의 사본,
우리는 지금 주변의 변수를 전달할 수 있습니다 다른 방법으로 함수 사이.
이것은 우리가 만들면 것을 의미한다 하나의 기능의 변화,
그 변화는 실제로 소요됩니다 다른 기능에 영향을.
다시, 이것은 뭔가입니다 우리는 이전에 할 수 없었다
당신은 이제까지을 교환하려고 한 경우 함수에서 두 변수의 값,
이 문제가 나타났습니다 들어온다의 종류, 오른쪽?
>> 우리는 X와 Y, 그리고 우리를 교체하려면 스왑라는 함수에 전달,
함수의 내부를 스왑 변수는 환율 값을한다.
하나는 두 가지가되고, 두된다 하나, 그러나 우리는 실제로하지 않습니다
원래 아무것도 변경 함수를 호출한다.
때문에 우리가 할 수없는, 우리가있어 단지 이들의 사본과 함께 작동합니다.
하지만 포인터, 우리는 할 수 실제로 함수에 X와 Y를 전달합니다.
그 기능을 수행 할 수 있습니다 그들과 함께 무엇인가.
그리고 그 변수 값 실제로 변경할 수 있습니다.
그래서 상당히 변화입니다 데이터로 작업 할 수있는 능력.
>> 우리는에 뛰어 전에 포인터, 나는 그것이 가치가 있다고 생각
몇 분을 복용 여기에 다시 기초로 이동합니다.
그리고 방법을 살펴있다 컴퓨터 메모리 작동
이 두 과목이 진행되기 때문에 실제로 꽤 상호합니다.
당신은 아마 알다시피, 컴퓨터 시스템에
하드 드라이브를하거나 아마도 솔리드 스테이트 드라이브,
파일 저장 위치의 일종.
그것은 보통의 어딘가에 2백50기가바이트의 이웃
지금 테라 바이트의 아마 몇합니다.
그리고 그것의 위치를​​ 모두의 당신의 파일은 궁극적으로, 라이브
컴퓨터가 종료되는 경우에도 오프, 당신은 다시 전원을 켜십시오 수 있습니다
당신은 당신의 파일이 찾을 수 다시 당신은 당신의 시스템을 재부팅 할 때.
하지만, 하드 디스크 드라이브 등의 디스크 드라이브, 하드 디스크 또는 솔리드 스테이트 드라이브, SSD,
바로 저장 공간입니다.
>> 우리는 실제로으로 아무것도 할 수 없습니다 하드 디스크에 데이터,
또는 솔리드 스테이트 드라이브에.
실제로 변경하려면 데이터하거나 이동할,
우리는 그것을 이동해야 RAM, 랜덤 액세스 메모리.
이제 RAM, 당신은 많이 컴퓨터에서의 적은.
당신은 어딘가에있을 수 있습니다 512메가바이트의 이웃
당신은 오래된 컴퓨터를 사용하는 경우, 아마에 2, 4, 8, 16,
어쩌면 조금 이상, RAM의 기가 바이트.
그래서 훨씬 작은,하지만 그건 여기서 휘발성 데이터 모두가 존재한다.
우리가 상황을 타개 할 수 있습니다 곳이다.
그러나 우리는 우리의 컴퓨터의 전원을 켤 때, RAM에 모든 데이터가 파괴된다.
>> 우리는 하드 디스크가 필요 왜 그렇게 그건 그것의 더 영구적 인 위치,
이 exists- 있도록 그것은 것 정말 나쁜 경우마다 우리
우리의 컴퓨터를 끌 때마다 우리의 시스템에서 파일이 말소되었다.
그래서 우리는 RAM의 내부에서 작업.
그리고 때마다 우리에 대해 얘기하고 메모리, 거의, CS50에서,
우리는 RAM이 아닌 하드 디스크에 대해 얘기하고.
>> 그래서 우리는 메모리에 물건을 이동할 때, 그것의 일부 공간을 차지한다.
데이터 유형의 모든 우리는 함께 일한지
최대 다른 걸릴 RAM의 공간의 양.
그래서 때마다 당신은 정수를 만들 메모리의 변수, 4 바이트
당신 때문에 RAM에 따로 설정 그 정수로 작업 할 수 있습니다.
당신은 정수를 선언 할 수 있습니다, 변경, 할당
증가 값 10 하나, 등등 등등으로.
에 일어날 필요가있는 모든 RAM, 당신은 4 바이트를 얻을
모든에 대한 작업을하려면 사용자가 만든 정수입니다.
>> 모든 문자 당신에게 생성 한 바이트를 가져옵니다.
즉 공간이 얼마나이다 문자를 저장하는 데 필요한.
모든 플로트, 실제 수, 4 바이트를 가져옵니다
그것은 이중 않는 한 정밀도 부동 소수점
당신을 수 수, 더 정확한 이상의 숫자가
소수점 정밀도를 잃지 않고,
이는 메모리의 8 바이트를 차지합니다.
긴 걷고, 정말 큰 정수, 또한 메모리의 8 바이트를 차지합니다.
얼마나 많은 메모리 바이트 문자열을 차지합니까?
음의 그 질문에 핀을 넣어 보자 지금, 그러나 우리는 다시 돌아올 것이다.
>> 그래서 다시 메모리의이 아이디어로에 바이트 크기의 셀들의 큰 어레이.
즉, 정말 모든, 그것은이다 세포의 단지 거대한 배열,
단지 다른 배열과 같은 그 당신이 익숙하고 참조
모든 요소를​​ 제외하고 하나의 바이트 폭이다.
그냥 배열과 같은, 모든 요소는 주소를 가지고 있습니다.
배열의 모든 요소 인덱스, 우리가 있습니다
소위 할 그 인덱스를 사용할 수 있습니다 배열에 랜덤 액세스.
우리는 시작하지 않아도 어레이의 시작,
모든 반복 하나의 요소 그,
우리가 원하는 것을 찾을 수 있습니다.
우리는 단지 내가 도착하고 싶은 말을 할 수 있습니다 15 요소 또는 100 번째 요소입니다.
그리고 당신은 그 수에 전달할 수 있습니다 당신이 찾고있는 값을 얻을.
>> 마찬가지로 모든 위치 메모리에 주소가 있습니다.
그래서 당신의 기억은 수도 이 같은 모습.
여기서 매우 작은 청크이다 메모리는,이 메모리는 20 바이트이다.
처음 20 바이트 때문에 내 맨 아래에있는이 주소
3, 2, 1, 0이며, 그래서 19까지의 모든 길에.
그리고 변수를 선언 할 때와 나는 그들과 함께 일을 시작할 때,
시스템 설정하는 것입니다 나를 위해 옆으로 일부 공간
이 메모리에서 작동합니다 내 변수.
그래서 문자 C가 자본에 해당 말할 수 있습니다 H. 그리고 무슨 일이 일어날?
음 시스템에가는 나 하나의 바이트 따로 설정합니다.
이 경우는 바이트 수를 선택한 네, 주소 네의 바이트,
그리고 저장할 것 나를 위해 거기에 편지 자본 H.
그때 INT 속도를 말한다면 제한이있어, 65 같음
옆으로 네 가지를 설정하는 것 나를 위해 메모리의 바이트.
그리고 그것은 사람들을 치료하는거야 하나의 단위로 4 바이트
우리가 최선을 다하고 무엇 때문에 와 여기에 정수입니다.
그리고 거기에 65을 저장하는 것입니다.
>> 지금 이미 나는 가지 해요 당신에게 거짓말의 조금을 말하고,
바로, 우리는 것을 알고 있기 때문에 컴퓨터는 바이너리에서 작동합니다.
그들은 이해하지 않는다 반드시 자본 H가 무엇인지
또는 (65)는 그들 만, 무엇인가 이진, 0과 1을 이해합니다.
그리고 실제로 무엇을 우리는 거기에 저장하고
편지 H와 수 (65)는 아니다 오히려 이진 표현
그 어느 봐 이 같은 작은 선물.
그리고 특히에 정수 변수의 맥락
그것은 단지 그것을에 침 않을거야 그것은 1 ~ 4로 처리하지 않을 것
바이트 청크 반드시, 실제로거야
4 대 1 바이트 청크로 치료하기 위해, 이는 다음과 같을 수 있습니다.
심지어이 아니다 완전히 사실 하나,
라는 뭔가 때문에 우리가하지 않은 엔디안,
지금에 들어갈 예정이지만 당신에 대한 호기심이 있다면,
당신은 작은에서 읽을 수 있습니다 큰 엔디안.
그러나이 인수를 위해, 이 동영상을 위해,
그냥 그에서, 가정하자 사실, 어떻게 수 (65)는 것
표현 될 모든 시스템의 메모리,
그것은 전혀 사실이 아니다 있지만.
>> 그러나의 사실 그냥하자 완전히 모든 이진 제거,
단지 H와 같은 생각 65, 그것은 훨씬 쉽게
같은 그것에 대해 생각합니다 인간으로서 그.
좋아, 그것은 또한 같다 그래서 아마 작은 임의의 그 I've- 내 시스템
바이트 5, 6, 7 나를 포기하지 않았다, 및도 8은 정수를 저장한다.
그 이유는, 너무, 거기에있는 우리는 지금에 들어가,하지만 충분하지 않습니다
그것은 그 어떤 대답 컴퓨터가 여기하고있다
아마 그 부분에서 좋은 움직임이다.
나에게 메모리를 제공하지 않으려면 반드시 다시 다시.
지금은 그것을 할 것이지만 내가 다른 문자열을 얻으려면,
성 (姓)라고, 내가 원하는 거기에 로이드을 넣어.
나는 하나에 맞게 필요 해요 문자는, 그 각각의 편지입니다
하나를 요구하는 것 캐릭터, 1 바이트 메모리.
내 배열로 로이드를 넣을 수 그래서 만약 이 같은 난 지금, 갈 꽤 좋은거야?
무엇을 누락?
>> 모든 문자열 우리가 일하는 것을 기억하십시오 C는 백 슬래시 0으로 종료에와,
우리는 하나, 여기에 생략 할 수 없습니다.
우리는 옆으로 한 바이트를 설정해야 메모리 그래서 우리는 그것을 잡아
우리의 문자열이 종료 할 때 알고있다.
그래서 다시 배치 방식 것들
메모리 세력에 표시 약간 무작위
하지만 실제로 어떻게 대부분의 시스템이 설계되어 있습니다.
배수에 그들을 줄을 네, 이유 다시
우리는 할 필요가 없습니다 지금에 들어갈.
그러나 이것은, 그렇게 말할를 충분 코드의이 세 가지 라인 후,
이 메모리의 모양 것입니다.
나는 메모리 위치가 필요한 경우 4, 8, 12, 내 데이터를 보유 할
이 내 기억의 모양 것입니다.
>> 그냥 특히 수 여기서, 현학적
우리는 메모리에 대해 얘기하고 주소 일반적으로 우리
그래서 진수 표기법을 사용하여이 작업을 수행.
그런데 왜 우리는이 모두를 변환하지 않습니다 16 진수로 진수에서
그냥 일반적 왜냐하면 우리가 어떻게 메모리를 참조하십시오.
그래서 그 대신 0 ~ 인의 19, 우리가해야하는 것은 제로
제로 X1 세를 통해 X 제로.
사람들은 메모리의 20 바이트가 우리 또는 우리는이 이미지에서 찾고있다
바로 여기에.
>> 그래서이 말했다되고 모두의하자 두 번째 메모리에서 멀리 단계
다시 포인터에.
다음은 가장 중요하다 일이 기억
우리는 포인터와 함께 작업을 시작으로.
포인터는 아무것도 아니다 주소보다.
나는 다시 그것 때문에 말 것 그것은, 그 중요
포인터는 아무것도 아니다 주소보다.
포인터 위치에 주소입니다 메모리에 변수가 사는 곳.
그것은 희망이되고 있음을 알고 쉽게 약간은 그들과 함께 작업합니다.
내가 좋아하는 또 다른 것은 할 것은 일종의 것입니다
시각적으로 무엇을 나타내는 다이어그램 코드의 다양한 라인 일어나고.
그리고 우리는이 몇 할거야 포인터의 시간,
우리는 동적에 대해 이야기 할 때 메모리 할당뿐만 아니라.
나는 이들도 있다고 생각하기 때문에 특히 도움이 될 수 있습니다.
>> 내가 예를 들어 말을 그래서 경우, INT의 K 내 코드에서, 무슨 일입니까?
그럼 기본적으로 무엇을한다 일어나고 나는, 나를 위해 따로 설정 메모리를 받고 있어요
하지만 난 싫어 나는 그렇게 생각해
상자처럼 생각하고 싶다.
나는 상자를 가지고 있고 그것은이다 컬러 녹색 나는 때문에
녹색 상자에 정수를 넣을 수 있습니다.
이것은 문자 I 있었다면 파란색 상자가있을 수 있습니다.
내가 만드는거야하지만 난 항상 말 정수를 보유 할 수있는 상자
그 상자가 녹색으로 채색된다.
그리고 영구 마커을 나는 그것의 측면에 케이 물품.
그래서, K라는 상자가 되는 나는 정수를 넣을 수 있습니다.
내가 INT의 K를 말할 때, 그건 무슨 일이 내 머리에 발생합니다.
나는 K 다섯 같다 말한다면, 내가 무엇을하고 있는가?
글쎄, 난 다섯을 걸었습니다 상자에서 마우스 오른쪽.
이 경우, 매우 간단 나는 INT의 K는 K라는 상자를 만들 말한다.
경우에 나는, k는 5와 동일한 말 상자에 다섯했습니다.
바라건대 그 도약을 너무 많이하지 않습니다.
상황이 갈 곳 여기 하지만 흥미로운 작은.
내가 INT의 *의 PK를 말한다면, 잘 나는하지 않더라도 이 반드시 무엇을 의미하는지 알고,
그것은 분명히 뭔가 있어요 정수로 할 수 있습니다.
그래서 색상을거야 녹색 틱이 상자,
나는 무언가를 가지고 알고 정수 함께 할 수있는,
그러나 정수 자체가 아니라, 그것은 INT 스타이기 때문.
뭔가 약간있다 그것에 대해 다른.
그래서 정수의 참여, 하지만 그렇지 않은 경우이다
에서 너무 차이가 우리는 무엇에 대해 얘기했다.
그것은 상자의 그는 레이블을 가지고 이 레이블 PK를 입고,
그것은 유지할 수있어 사람들은 어떤 INT 별,.
그들은 할 수있는 뭔가가 정수와, 분명히.
여기에 마지막 줄 생각이다.
내가 말할 경우 PK = K, 워, 무슨 일이 바로, 무슨 일?
그래서이 임의의 숫자, 겉으로는 무작위 수는이 상자에 던져됩니다.
입니다 모든, PK입니다 K의 주소를 가져옵니다.
k는 메모리에 사는 곳 그래서 고집하고있어, 그 주소의 바이트의 주소.
내가 뭘 모든 말인지입니다 그 값은 내가 갈거야 무엇인가
내 상자라는 PK의 내부에 넣어.
그리고이 일이 있기 때문에 포인터, 찾고 있기 때문에
제로 X 같은 문자열에서 여덟 제로 C 일곱 4 ~ 8
두 제로는 아마 매우 의미가 없습니다.
우리가 일반적으로 포인터를 시각화 할 때, 우리는 실제로 포인터로 이렇게.
PK는 우리에게 정보를 제공합니다 우리는 메모리에 K를 찾을 필요가있다.
그래서 기본적으로 PK가에 화살표가 있습니다.
그리고 우리는 길이를 걸 으면 그 화살표의 상상
그것은 당신이 걸을 수 뭔가, 우리의 경우 화살표의 길이를 따라 산책,
그 화살표의 가장 끝에서, 우리 메모리의 위치를​​ 찾을 수
여기서 k는 살고있다.
그리고 정말 중요합니다 k는 사는 곳 우리가 아는 한 번 때문에,
우리는 데이터로 작업을 시작할 수 있습니다 그 메모리 위치의 내부.
우리는 조그마한를 얻고 있지만 지금은 앞서 자신의 비트.
>> 그래서 포인터는 무엇인가?
포인터는 그 데이터 항목이며 값은 메모리 주소이다.
즉이었다 제로 X 팔 제로 물건이 일, 즉 메모리 주소했다.
즉 메모리에 위치했다.
및 포인터의 형식 종류를 설명
데이터의 당신은에서 확인할 수 있습니다 그 메모리 주소.
그래서 INT 스타 부분 오른쪽이있다.
내가 그 화살표를 따라 경우의 위치로 나를 이끌 것.
그리고 그 위치, 내가 내 예를 들어 거기에 발견 할 것이다,
녹색 컬러 상자입니다.
그것은 그 무엇이다, 정수의 I 내가 그 주소로 가면 찾을 수 있습니다.
데이터 형식 포인터가 무엇인지를 설명
해당 메모리 주소에서 찾을 수 있습니다.
그래서 여기하지만 정말 멋진 일이다.
포인터는 우리가 통과 할 수 있도록 기능 사이의 변수.
실제로 변수를 전달 그 중 사본을 통과하지.
우리가 알고있는 경우 때문에 정확히 어디에 메모리에서 변수를 찾기 위해,
우리의 복사본을 만들 필요가 없습니다 그것은, 우리는 단지 해당 위치로 갈 수있다
그 변수와 함께 작동합니다.
본질 포인터에 따라서 종류 의 컴퓨터 환경을
더 많은 현실 세계처럼, 좋아.
>> 그래서 여기에 비유입니다.
이 전 노트북을 가지고 있다고 가정 해 봅시다, 바로, 그리고 노트의 전체입니다.
그리고 나는 당신이 그것을 업데이 트하려는.
당신은 함수이다 그 업데이트 노트, 좋아.
길에서 우리는 봤는데 지금까지 일하고, 무엇을
당신이 내 노트북​​을 취할 것입니다 일, 당신은, 복사 가게에 갈거야
당신의 제록스의 복사본을 만들 수 있습니다 노트북의 모든 페이지.
당신은 나의 노트북을 떠날거야 내 책상에 당신이 완료되면,
당신이 가서 물건을 교차합니다 내 날짜 또는 잘못된 벗어 노트북,
그리고 당신은에 다시 전달합니다 나 제록스 페이지의 스택
그건 내 노트북​​의 복제본입니다 당신이 그것에 변경 한.
그리고 그 시점에서, 그것은으로 나에게 달려 호출하는 함수, 호출자,
당신의 메모를하기로 결정하고, 내 노트로 다시 통합 할 수 있습니다.
그래서 많은 단계가있다 여기에 참여, 권리.
마찬가지로 더 나은되지 않을 것 난 그냥 말한다면,이 봐, 당신은 할 수 있습니다
내 노트북​​을 업데이트 나, 당신이 내 노트북​​을 손으로
당신이 물건을 가지고와 문자 그대로 그들을 교차
내 노트북​​에 내 노트를 업데이트합니다.
그리고 나에게 내 노트북​​을 다시 제공합니다.
즉 어떤 종류의 무엇 포인터는, 우리가 할 수 있도록
그들은이 환경을 많이 만들어 우리가 현실에서 어떻게 작동하는지와 같은 더.
>> 그래서 모든 권리는 무엇입니까 포인터,의 얘기하자됩니다
포인터는 C에서 작동, 및 방법에 대한 어떻게 우리가 그들과 함께 작업을 시작할 수 있습니다.
그래서 아주 간단한 포인터가있다 C에서 널 포인터를했다.
아무것도 널 포인터를 가리 킵니다.
이처럼 이것은 아마 보인다 실제로없는 매우 유용한 것은,
하지만 우리가 표시됩니다으로 나중에 조금, 사실
이 널 포인터가 존재하는지 실제로 정말 유용하게 사용할 수 있습니다.
그리고 당신은 포인터를 만들 때마다,과 당신은 그 값의 immediately-을 설정하지
설정 예 그 값을 즉시
다시 몇 슬라이드를 할 것이다 나는, PK는 & K에 해당 말했다 곳
PK는 다음과 같이, K의 주소를 가져옵니다 우리는, 그게 무슨 뜻인지 볼 수 있습니다
우리는 그것을 코딩하는 방법을 볼 수 있습니다 shortly- 우리는 뭔가에 값을 설정하지 않는 경우
즉시 의미, 당신은 항상해야
null로 가리 키도록 포인터를 설정합니다.
당신은 아무것도를 가리 키도록 설정해야합니다.
>> 즉보다 매우 다르다 그대로 그냥 값을 떠나는
다음 선언 포인터와 그냥 가정
그것은 거의 사실 때문에이 널 (null)입니다.
그래서 당신은 항상 설정해야합니다 포인터의 값
당신은 그것의 값을 설정하지 않는 경우 null로 바로 의미있는 뭔가.
확인할 수 있습니다 포인터의 값 여부 항등 연산자를 사용하여 null 인
(==), 당신이 어떤 정수를 비교 좋아 값이나 문자 값 사용 (==)
뿐만 아니라.
이 상수의 특별한 종류의 당신이 테스트하는 데 사용할 수있는 값입니다.
그래서 아주 간단한이었다 포인터, 널 포인터.
또 다른 방법은 만드는 방법 포인터를 추출하는 것입니다
변수의 주소 당신이 이미 만든,
당신은 &이 사용하여이 작업을 수행 운영자 주소 추출.
어떤 우리는 이미 이전에 본 적이 첫 번째 그림의 예에서 나는 나타났다.
x는 우리가했습니다 변수 있다면 이미 정수 유형의 생성,
다음 및 X는 정수를 가리키는 포인터이다.
및 X는 -, 추출하는 것입니다 기억 오른쪽에있는 물건의 주소입니다.
그리고 포인터 그냥 주소이기 때문에, 이상 및 x는 정수에 대한 포인터입니다
값이 어디 메모리 X의 삶입니다.
그것은 X의 주소입니다.
그래서 및 X는 X의 주소이다.
의이 한 단계 보자 더 뭔가에 연결
나는 이전 비디오에서 언급.
도착은​​ 복식의 배열은, 경우 및 도착 대괄호는 내가 포인터
이중에.
그래.
나는, 경우 대괄호를, 언 도착은​​, 두 배의 배열입니다
그럼이 대괄호를, 언 해당 배열의 i 번째 요소,
및 대괄호, 언 난 곳이다 메모리 도착의 i 번째 요소가 존재한다.
>> 그래서 의미는 여기에 무엇입니까?
배열 이름, 의미 이 모든 일의,
배열의 이름이 있다는 것이다 실제로 자체에 대한 포인터.
당신은 일한지 모두 함께 포인터
당신이 배열을 사용했습니다 때마다.
예로부터 기억 변수 범위에,
I 제시 비디오의 끝 근처 우리는 기능을 가지고 예
라는 설정 INT와 기능 세트 배열했다.
그리고 당신의 도전은 결정 여부, 또는 무엇
우리가 인쇄 된 값 함수의 단부,
메인 프로그램의 끝.
>> 당신은 예로부터 회수하는 경우 또는 당신이 비디오를 시청 한 경우,
당신은 호출을 당신은 - 때 알고 설정 INT는 효과적으로 작동하지 않습니다.
그러나 통화가 배열이하는 설정합니다.
그리고 나는 종류의 이유를 통해 호도 그 당시 사건이​​었다.
난 그냥 잘, 그것은 배열의 것, 말했다 특별한, 당신은 알고있다, 이유가있다.
그 이유는 어레이의 인 이름은, 정말 그냥 포인터입니다
이 특별있다 대괄호 구문이
작업 할 일이 많은 멋진합니다.
그리고 그들은의 생각을 훨씬 덜 위협적 포인터
그들은 일종의있어 이유입니다 그 방법으로 제시했다.
하지만 실제로는 배열은 포인터.
그리고 그 이유는 때를 상기 배열의 변화를 만들어
우리는 매개 변수로 배열을 통과 할 때 함수 또는 인수로
어레이의 기능, 컨텐츠 실제로 두 수신자 변경
호출자에.
모든 다른 종류의 어떤 우리가 본 변수는 그렇지 않았다.
그래서해야 할 단지 뭔가 당신이 포인터와 함께 작업 할 때 마음,
하다의 이름 배열 실제로 포인터
그 어레이의 첫 번째 요소이다.
>> 확인을 그래서 지금 우리는 모든이 사실,의​​ 오른쪽 계속 할 수 있습니다.
왜 우리가 상관이야 여기서 뭔가 살고있다.
내가 말한 자처럼, 그것은 꽤입니다 무언가가 사는 곳을 알고 유용
그래서 당신은 가서 변경할 수 있습니다.
함께 작업하고 실제로 일이 당신을
그 변수 테이크 효과에하고 싶은, 그리고 그것의 일부 복사본에 적용됩니다.
이는 역 참조라고합니다.
우리는 참조로 이동 우리는 거기에 값을 변경합니다.
우리가 포인터를 가지고 있다면 그것은이라고 PC와 그 캐릭터를 가리키는,
우리는 * PC와 * PC가 말할 수 있습니다 우리가 갈 경우 우리가 확인할 수있는 것들의 이름
주소 PC에.
우리가 찾을 것은 문자와 * PC는 우리가에서 데이터를 참조하는 방법입니다
위치.
그래서 우리는 같은 것을 말할 수 있습니다 * PC = D 또는 같은,
그는 것을 의미한다 무엇이든 메모리 주소의 PC에 있었다
어떤 문자는 이전했다 우리가 PC = D를 * 말한다면 거기에, 지금 D입니다.
>> 그래서 여기에 우리가 다시 간다 이상한 C 물건, 좋아.
그래서 우리는 것으로 이전에 * 본 적이 여하튼 데이터 타입의 일부
그리고 지금은 사용되고있어 약간 다른 상황
위치 데이터에 액세스한다.
나는 조금 혼란 알고 그 사실이 전체의 일부
같은, 왜 포인터는이 신화를 주위에 너무 복잡되는 등,
정직하게, 구문 문제 일종이다.
* 그러나 두 상황에서 사용되며, 두 유형 이름의 일부로서,
우리는 조금 볼 수 있습니다 너무 다른 나중에 뭔가.
그리고 바로 지금이다 참조 연산자.
그래서 기준으로 간다 이것은 데이터를 액세스
포인터의 위치에와 당신이 의지를 조작 할 수 있습니다.
>> 지금 이것은 매우 유사하다 네 이웃을 방문, 맞아.
당신이 알고있는 경우에 무엇을 당신을 이웃이있어, 살고
이웃과 함께 놀고 없습니다.
당신은 당신이 어떻게 알고 그들이 살고있는 곳을 알고,
그러나 그것은에 의해 그 의미하지 않는다 그 지식을 갖는 미덕
당신은 그들과 상호 작용한다.
당신이 그들과 상호 작용하려면, 당신은 그들의 집에 가야
당신은 그들이 살고있는 곳으로 이동해야합니다.
그리고 그렇게되면, 당신은 상호 작용할 수 있습니다
그들과 함께 당신이 원하는 것 좋아한다.
그리고 마찬가지로 변수, 당신은 자신의 주소로 이동해야합니다
당신이 그들을 상호 작용하려면, 그냥 주소를 알 수 없다.
그리고 당신이 주소로 이동 방법입니다 * 참조 연산자를 사용합니다.
당신이 일에 대해 어떻게 생각하십니까 우리가 시도하고 역 참조하는 경우
값이 포인터가 null?
널 리콜 포인터는 아무것도 가리 킵니다.
당신이 시도하고 역 참조 그래서 경우 아무것도 주소 아무것도를 방문하거나,
당신은 무슨 생각하세요?
그럼 당신이 추측하는 경우 분할 흠, 당신은 잘 될 것입니다.
당신이 시도하고 역 참조하는 경우 널 포인터,
당신은 분할 고통 잘못. 그러나, 대기
나는, 당신을 말하지 않았다 당신이하지 않을 경우
당신의 값을 설정하는 방법 의미있는 포인터,
당신은 null로 설정해야합니까?
내가 그랬어 실제로 분할 장애는 좋은 행동 종류이다.
>> 혹시 변수를 선언하고 있으 바로 그 값을 할당하지?
그래서 당신은 INT X를 말한다; 당신은하지 않습니다 실제로 아무것도에 할당
다음 나중에 코드에서, 당신은, x의 값을 출력
아직 필요 아무것도에 할당.
자주 당신은 얻을 것이다 제로, 그러나 때때로 당신
어떤 임의의 수를 얻고, 수 당신은 온 아무 생각이 없습니다.
마찬가지로 일을 할 수 포인터 일어난다.
당신은 포인터를 선언 할 때 INT * 예를 들어, PK,
당신은, 값에 할당하지 않습니다 당신은 메모리의 4 바이트를 얻을.
의 무엇이든간에 4 바이트 시스템 메모리는 수
일부 의미있는 값을 찾으십시오.
그리고이되었을 수 있습니다 이미 뭔가
다른 필요로하지 않습니다 더 이상 기능, 당신은 그냥 그래서
어떤 데이터가 있었다.
>> 당신은 무엇을 역 참조 할 시도하는 경우 당신이 거기에 있었다 안되는데 일부 주소
이미 바이트 및 정보 거기에, 그 포인터에 지금입니다.
당신이하려고하면 그 포인터 역 참조 당신은 일부 메모리 덤비는 수 있습니다
당신은 의도하지 않았다 모두 엉망이다.
그리고 사실 당신은 할 수 정말 엄청난 일,
같은 다른 프로그램을 중단, 또는, 다른 기능을 깰
또는 악의적 인 일을 당신은 전혀 할 의도하지 않았다.
그 이유 그리고 그건 실제로 좋은 생각
당신의 경우는 null하려면 포인터를 설정합니다 의미있는 뭔가를 설정하지 마십시오.
그것은에 아마 더 낫다 프로그램의 오늘의 끝
이 수행하는 다음 충돌합니다 뭔가 그 나사까지
다른 프로그램이나 다른 기능.
그 동작은도 아마 다만 충돌보다 이상적입니다.
그 이유 그리고 그건 실제로 좋은 습관
당신의 포인터를 설정에 들어가 당신이 그 (것)을 설정하지 않으면 null로
의미있는 값 당신이 알고 즉시 값
그리고 당신은 역 참조 안전하게 할 수 있습니다.
>> 그럼 이제 다시 오게하고 봐 상황에서 전반적인 구.
내가 INT의 * p를 말한다면 ;, 난 그냥 무슨 짓을 한거야?
내가 무슨 짓을했는지하는 것은 이것이다.
I는 P의 값은 어드레스이다 알고 모든 포인터는 단지이기 때문에
주소.
내가 할 수있는 역 참조 P * 연산자를 사용하여.
바로 여기 이러한 맥락에서, 상단 *이 유형의 일부입니다 기억합니다.
INT * 데이터 타입이다.
하지만 역 참조 할 수 * 연산자를 사용하여 (P),
내가 그렇게한다면, 나는 그 주소로 이동하는 경우, 그 주소에서 찾을 것인가?
나는 정수를 찾을 수 있습니다.
그래서 INT의 * p를 기본적 말, p는 주소입니다.
내가 할 수있는 페이지 역 참조하고있는 경우 내가, 내가 정수를 찾을 수
해당 메모리 위치.
>> 확인 그래서 다른이했다 별 성가신 일
여기 어디에있어 별 성가신 일이다.
혹시 선언하려고 노력 동일한 유형의 여러 변수
코드의 같은 줄에?
그래서 잠시, 그 선을 척 내가 실제로 녹색이 가지고있는 코드
이 아니며 단지 INT의 X, Y, Z라고 ;.
무슨 할 것이 실제로 만들 수있다 당신을 위해 세 개의 정수 변수
하나라는 X, 하나라는 Y, 하나는 Z했다.
그것은하지 않고 할 수있는 방법 세 줄에 분할 할 필요.
>> 별을 얻을 경우 여기 하지만 다시 성가신,
* 실제로 일부이기 때문에 두 종류의 이름과 부분의
변수 이름의.
그래서 내가 말한다면 INT의 *의 PX, PY, PZ, 내가 실제로 얻을 수는 정수의 포인터이다
PX와 두 개의 정수, PY 및 PZ했다.
그리고 그것은 아마 무엇을의 우리는이 좋지 않아, 할 수 있습니다.
>> 나는 여러 포인터를 만들려면 이렇게 동일 행에서, 동일한 유형의,
내가 실제로 필요로하는 무슨과 별, 할 * PB, * PC, INT의 * 파 말할 수 있습니다.
지금 막 말​​했다 데 지금, 당신이 말하는
아마 당신은이 작업을 수행하지 않습니다.
그리고, 솔직히 아마 좋은 일 당신이 실수로 수 있기 때문에
스타, 그런 일을 생략합니다.
그것은 어쩌면 선언 아마 최선의 각각의 라인에 포인터,
그러나 그것은 또 다른 하나 그 성가신 구문
확인 별 일 작업하기 매우 어려운 포인터.
그냥이 구문이기 때문에 엉망 당신을 통해 일해야한다.
연습은하지 않습니다 정말 제 2의 천성이된다.
나는 아직도 여전히 그것으로 실수를 10 년 동안 프로그래밍 후,
뭔가 일이 생기면 너무 당황하지 말고 당신에게, 그것은 솔직히 꽤 일반적입니다.
그것은 종류의 정말 구문의 결함.
>> 확인 그래서 나는 가지 약속 우리는 다시 방문 할 것
얼마나 큰의 개념은 문자열입니다.
그럼 난 당신을 말한 경우 문자열, 우리는 종류의 정말했습니다
당신에게 모든 시간을 거짓말.
라는 데이터 유형이 없습니다 문자열, 사실 나는
중 하나로이 언급 한 우리의 데이터 유형에 대한 최초의 비디오,
그 문자열은 데이터 유형였습니다 CS50.h.에 당신을 위해 만들었습니다
당신은 #include를해야 그것을 사용하기 위해 CS50.h.
>> 그런데 캐릭터는 정말 무엇인가에 대한 별칭
, 숯불 *라는 문자의 포인터.
그럼 포인터, 리콜, 단지 주소입니다.
그래서 크기는 무엇인가 문자열의 바이트?
그럼이 4 개 또는 8입니다.
그리고 그 이유는 내가 말을 네 개 8 명은 때문에 실제로
당신이 사용하는 경우, 시스템에 따라 달라집니다 CS50의 IDE는, 숯불 *는 문자의 크기
*는 64 비트 시스템의 여덟이다.
메모리의 모든 주소는 64 비트 길이입니다.
당신은 CS50 어플라이언스를 사용하는 경우 또는 32 비트 시스템을 사용하여,
당신은 그 용어 32 비트를 들었습니다 기계, 32 비트 시스템은 무엇입니까?
그럼 그냥 모든 것을 의미합니다 메모리의 주소는 32 비트 길이입니다.
그리고 32 비트는 4 바이트입니다.
그래서 숯불 *는 4 개 또는 8입니다 시스템에 따라 바이트.
그리고 실제로 모든 데이터 유형, 어떤 데이터에 대한 포인터
모든 포인터는 단지이기 때문에, 입력 주소는 4 개 또는 8 바이트이다.
그럼이를 다시 보자 다이어그램과의이 결론을 내릴 수 있습니다
여기에 약간의 운동이 비디오.
그래서 여기에 우리가 중단 된 그림이다 비디오의 처음에.
내가 * PK = 35 말한다면 이제 어떻게?
그래서 * PK = 35, 내가 말할 때 무엇을 의미합니까?
두 번째를 가져 가라.
* PK.
여기 문맥에서, *는 참조 연산자.
그래서 때 역 참조 연산자는, 사용
주소는 지적에 우리가 간다 PK에 의해, 우리는 우리가 무엇을 발견 변경합니다.
그래서 * PK = 35 효과적으로 사진에이 작업을 수행합니다.
그래서 구문 기본적이다 의 동일은 K = 35 말했다 데.
>> 하나 더.
내가 INT 분을 말한다면, 내가 만들 M이라는 새로운 변수입니다.
새로운 상자, 그것은 녹색 상자 때문에이다 그것은 정수를 개최 것,
그리고 M을 표시합니다.
나는 M = 4를 말한다면, 내가 넣어 그 상자에 정수.
말은 PK = & M, 방법을 수행하는 경우 이 그림의 변화?
PK = & M, 당신은 무엇을 기억 할 & 연산자는 않습니다 또는라고?
그 및 일부 변수 이름을 기억 변수 이름의 주소입니다.
그래서 우리가 말하고있는 것은 PK는 M의 주소를 가져옵니다.
그리고 효과적으로 무슨 일이 도면은 더 이상 점이다 PK
M에,하지만 포인트를 케이합니다.
>> 다시 포인터는 매우이다 작업하기 까다로운
그들은 많이 걸릴 연습,하지만 때문에
당신을 허용 할 수있는 능력의 함수 사이에 데이터를 전달하는
실제로 사람들이 변경 사항이 적용,
주위에 당신의 머리를 점점 정말 중요합니다.
그것은 아마도 가장 복잡 우리가 CS50 논의 주제,
하지만 값을 당신을 포인터를 사용에서 얻을
지금까지 합병증을 상회 그 그들을 학습에서 온다.
그래서 나는 당신에게 최고의 소원 운이 포인터에 대한 학습.
내가 더그 로이드 해요,이 CS50입니다.