imported>sudalz |
|
| (11 intermediate revisions by 3 users not shown) |
| Line 1: |
Line 1: |
| === ZeroPage (새싹-날다람쥐) === | | === [[ZeroPage]] (새싹-날다람쥐) === |
| == Profile == | | == Profile == |
| 날다람쥐 | | 날다람쥐 |
| Line 7: |
Line 7: |
| C시험을 잘보자. | | C시험을 잘보자. |
| == 진행중 == | | == 진행중 == |
| | [http://wiki.zeropage.org/wiki.php/%EB%82%A0%EB%8B%A4%EB%9E%8C%EC%A5%90%206%EC%9B%949%EC%9D%BC] |
|
| |
|
| = 포인터(Pointer)에 대해서. =
| | (배열과 포인터의 기초)-> 6월 10일(수) 수업시간 전까지 읽고 물어볼거 생각해오기 |
| 포인터란?
| |
|
| |
|
| | [http://wiki.zeropage.org/wiki.php/%EC%83%88%EC%8B%B9-%EB%82%A0%EB%8B%A4%EB%9E%8C%EC%A5%90%206%EC%9B%94%2010%EC%9D%BC] |
|
| |
|
| 포인터란, 어떤 변수의 '주소'를 참조하는 변수이다.
| | (동적 할당에 대해서) -> 포인터를 공부한 후에 공부해야 한다. |
| 예)
| | == 질문과 답 == |
|
| | [http://wiki.zeropage.org/wiki.php/%EC%83%88%EC%8B%B9-%EB%82%A0%EB%8B%A4%EB%9E%8C%EC%A5%90-%EC%A7%88%EB%AC%B8] |
| | |
| {| class="wikitable"
| |
| |-
| |
| | 주소
| |
| |
| |
| | 변수
| |
| |
| |
| | 내용
| |
| |-
| |
| | 1000
| |
| |
| |
| | a
| |
| |
| |
| | 13
| |
| |-
| |
| | 1004
| |
| |
| |
| | b
| |
| |
| |
| | 14
| |
| |}
| |
| | |
| | |
| int a = 13;
| |
| int b = 14;
| |
| 이라는 선언을 통해 가능하며, 메모리 상의 어떤 주소에 있는 13 이라는 데이터는 a라는 변수의 이름을 통해서 나타내어진다.
| |
| 여기서 주소가 1000 이후에 1004 인 이유는 int가 4byte이기 때문이다.(여기서 주소는 예를 든 것임)
| |
| | |
| a = 14; 라는 명령어를 통해 a의 내용을 14로 바꿀 수 있다. 그리고 printf("%d", a); 라는 명령어를 통해 바뀐 것을 확인할 수 있다.
| |
| a라는 것은 a라는 변수가 나타내는 주소(1000)의 내용을 나타내주는 것이다.
| |
| a의 주소를 표현하는 방법에는 '&'을 붙이는 방법이 있다.
| |
| printf("%u", &a);의 결과값은 1000이다.(%u 맞나? ㅋㅋ 찾아보길. 맞을꺼야 %u는 주소값을 표현하는 표현식.)
| |
| | |
| 포인터는 *라는 문자를 통해서 표현하는데, 만약에 INT형의 주소를 나타내는 변수 IP를 선언하고 싶으면
| |
| int* ip;
| |
| 라고 표현하면 된다.
| |
| int *ip;
| |
| 도 가능한 표현이다.(이게 약간 더 옳은 표현.)
| |
| 예를 들어 int *ip, i;
| |
| 이렇게 하면 뒤의 i는 일반적인 int로, 앞의 ip는 포인터 INT형으로 선언이 된다.
| |
| | |
| 포인터가 가리키는 곳의 값을 쓸 때는 앞에 *을 붙인다.
| |
| 예)
| |
| int a = 13;
| |
| int* ap = &a;
| |
| printf("%d %d", a, *ap);
| |
| | |
| 결과값 : 13 13
| |
| | |
| 하지만 포인터를 왜'쓰는지 잘 모르는 경우가 많다.-_-;
| |
| 제일 많이 쓰이는 곳 :
| |
| | |
| 함수 내에서 값을 아무리 바꿔봤자 지역변수 의 내용은 바뀌지 않는다.
| |
| 이것을 어디서나 쓸 수 있게 하기 위해서.
| |
| | |
| 예)
| |
| void add(int a, int b, int* cp)
| |
| {
| |
| *cp = a + b; // cp라는 포인터가 가리키는 주소의 값을 a + b로 바꿔준다(main 함수 안의 c).
| |
| }
| |
| int main()
| |
| {
| |
| int a = 13, b = 14, c;
| |
|
| |
| add(a, b, &c); // a와 b의 값을, c의 주소를 넣는다.
| |
|
| |
| printf("%d", c); // 결과값 : 27
| |
| | |
| }
| |
| | |
| = 배열과 포인터 =
| |
| 배열은 여러개의 변수가 모인 형태이다.
| |
| {| class="wikitable"
| |
| |-
| |
| | 1000
| |
| |
| |
| | 3
| |
| |-
| |
| | 1004
| |
| |
| |
| | 4
| |
| |-
| |
| | 1008
| |
| |
| |
| | 2
| |
| |-
| |
| | 1012
| |
| |
| |
| | 1
| |
| |-
| |
| | 1016
| |
| |
| |
| | 8
| |
| |}
| |
| 은
| |
| int a[5] = {3, 4, 2, 1, 8};을 선언한 형태이다.
| |
| 여기서 주목할 점은 우리가 출력할 때 printf("%d", a[0]);와 같이 배열의 번지수를 적어주어야 한다는건데
| |
| 왜 printf("%d", a); 와 같이 적으면 안되는지 알아보자.
| |
| | |
| a == &a[0]
| |
| | |
| 이라는 것을 외우도록 하고
| |
| | |
| int* ap = a;
| |
| | |
| 라고 한다면 ap에는 a의 첫 번째 변수(a[0])의 주소가 들어가게 된다.
| |
| 물론 출력할 때는 printf("%d", *ap); 와 같이 a[0]을 출력할 수도 있다.
| |
| 이것은 캐릭터, 더블 등 다른 변수에도 모두 적용된다.
| |
| | |
| | |
| | |
| === 과제 ===
| |
| (편집 버튼을 누르면 수정할 수 있고, 자기 이름 밑에 쓰기. 위의 내용은 바꿔도 되지만 책임못짐 ㅋㅋ)
| |
| | |
| = 포인터를 이용한 간단한 프로그램 =
| |
| 이름과 반을 3개 입력받고 포인터를 이용해서 edit라는 함수 안에서 2번째 입력받은 사람을 수정한 후 다시 출력하기.
| |
| 예)
| |
| 유정석 1
| |
| | |
| 이지은 3
| |
| | |
| 김윤석 5
| |
| | |
| * 2번째 사람을 수정해 주세요 -
| |
| | |
| 장다예 4
| |
| | |
| * 결과 -
| |
| | |
| 유정석 1
| |
| | |
| 장다예 4
| |
| | |
| 김윤석 5
| |
| | |
| | |
| = 배열의 이동을 포인터로?! =
| |
| 바로 위의 배열을 모두 출력하는데, printf("%d", *(ap + @))의 형태로 출력해보자.
| |
| 여기서 모든 값들을 출력하려면 @에 각각 어떤 수가 들어가는지 직접 해보고 왜 그런지 설명하기.
| |
| | |
| | |
| | |
| | |
| | |
| == 김상훈 ==
| |
| | |
| == 김윤석 ==
| |
| | |
| == 이지은 ==
| |
| | |
| == 장다예 ==
| |
|
| |
|
| | -> 들어가서 질문하고 문자나 네이트온 |