Difference between r1.1 and the current
@@ -1,133 +1,180 @@
=== ZeroPage (새싹-날다람쥐) ===
=== ZeroPage (새싹-날다람쥐 6월 9일) ===
[http://wiki.zeropage.org/wiki.php/%EC%9C%A0%EC%A0%95%EC%84%9D]
-> 홈으로
= 포인터(Pointer)에 대해서. =
포인터란?
|| 주소 |||| 변수 |||| 내용 ||
포인터란, 어떤 변수의 '주소'를 참조하는 변수이다. 예)
|| 주소 |||| 변수 |||| 내용 ||
|| 1000 |||| a |||| 13 ||
|| 1004 |||| b |||| 14 ||
int a = 13;
int b = 14;
이라는 선언을 통해 가능하며, 메모리 상의 어떤 주소에 있는 13 이라는 데이터는 a라는 변수의 이름을 통해서 나타내어진다.
int a = 13; int b = 14; 이라는 선언을 통해 가능하며, 메모리 상의 어떤 주소에 있는 13 이라는 데이터는 a라는 변수의 이름을 통해서 나타내어진다.
a = 14; 라는 명령어를 통해 a의 내용을 14로 바꿀 수 있다. 그리고 printf("%d", a); 라는 명령어를 통해 바뀐 것을 확인할 수 있다.
a라는 것은 a라는 변수가 나타내는 주소(1000)의 내용을 나타내주는 것이다.
여기서 주소가 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; 도 가능한 표현이다.(이게 약간 더 옳은 표현.)
예를 들어 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
}
= 배열과 포인터 =
배열은 여러개의 변수가 모인 형태이다.
배열은 여러개의 변수가 모인 형태이다.
||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 + @))의 형태로 출력해보자. 여기서 모든 값들을 출력하려면 @에 각각 어떤 수가 들어가는지 직접 해보고 왜 그런지 설명하기.
== 김상훈 ==
김윤석 5
== 김윤석 ==
배열의 이동을 포인터로 :
#include <stdio.h>
int main()
{
int a[5] = {3,4,2,1,8};
int* ap = a;
printf("%d\n", *ap);
printf("%d\n", *(ap+1));
printf("%d\n", *(ap+2));
printf("%d\n", *(ap+3));
printf("%d\n", *(ap+4));
return 0;
}
//정석: 여기서 ap+1 에서의 1 은 1byte의 1이 아니라 sizeof(int) * 1 의 1이다. 따라서 for문 형태로 작성할 때는 ap + i로 하면 된다.
포인터를 이용한 간단한 프로그램 :
#include <stdio.h>
void edit(char *NameC, int *NumC)
{
printf("\n두번째 입력한 이름과 숫자를 바꿉니다. : ");
scanf("%s %d", NameC, NumC);// 포인터이므로 '&' 를 붙이지 않는다.
}
int main()
{
char Name1[10], Name2[10], Name3[10];//이름
char *NameC;//변환될 이름
int Num1, Num2, Num3;//숫자
int *NumC;//변환될 숫자
printf("첫번째 사람의 이름과 숫자를 입력해주세요 : ");
scanf("%s %d", Name1, &Num1);
printf("\n두번째 사람의 이름과 숫자를 입력해주세요 : ");
scanf("%s %d", Name2, &Num2);
printf("\n세번째 사람의 이름과 숫자를 입력해주세요 : ");
scanf("%s %d", Name3, &Num3);
NameC = Name2;//배열도 일종의 포인터이므로 Name2 앞에 '&' 을 붙이지 않는다.
NumC = &Num2;//Num2는 포인터가 아니므로 '&' 을 앞에 붙여야 한다.
edit(NameC, NumC);// NameC 와 NumC, 즉 주소를 edit함수로 전달.
printf("\n바뀐 결과 : %s %d %s %d %s %d\n", Name1, Num1, Name2, Num2, Name3, Num3);
return 0;
}
== 이지은 ==
== 장다예 ==
포인터(Pointer)에 대해서. ¶
포인터란?
포인터란, 어떤 변수의 '주소'를 참조하는 변수이다. 예)
주소 | 변수 | 내용 | ||
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 *ip; 도 가능한 표현이다.(이게 약간 더 옳은 표현.)
결과값 : 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
}
배열과 포인터 ¶
과제 ¶
(맨 밑의 고치기 버튼을 누르면 수정할 수 있고, 자기 이름 밑에 내용 쓰기. 위의 내용은 바꿔도 되지만 책임못짐 ㅋㅋ)
포인터를 이용한 간단한 프로그램 ¶
이름과 반을 3개 입력받고 포인터를 이용해서 edit라는 함수 안에서 2번째 입력받은 사람을 수정한 후 다시 출력하기. 예) 유정석 1
이지은 3
김윤석 5
- 2번째 사람을 수정해 주세요 -
장다예 4
- 결과 -
유정석 1
장다예 4
김윤석 5
이지은 3
김윤석 5
- 2번째 사람을 수정해 주세요 -
장다예 4
- 결과 -
유정석 1
장다예 4
김윤석 5
배열의 이동을 포인터로?! ¶
바로 위의 배열을 모두 출력하는데, printf("%d", *(ap + @))의 형태로 출력해보자. 여기서 모든 값들을 출력하려면 @에 각각 어떤 수가 들어가는지 직접 해보고 왜 그런지 설명하기.
김상훈 ¶
김윤석 ¶
배열의 이동을 포인터로 :
#include <stdio.h>
int main()
{
//정석: 여기서 ap+1 에서의 1 은 1byte의 1이 아니라 sizeof(int) * 1 의 1이다. 따라서 for문 형태로 작성할 때는 ap + i로 하면 된다.
{
int a5 = {3,4,2,1,8};
int* ap = a;
printf("%d\n", *ap);
printf("%d\n", *(ap+1));
printf("%d\n", *(ap+2));
printf("%d\n", *(ap+3));
printf("%d\n", *(ap+4));
return 0;
}int* ap = a;
printf("%d\n", *ap);
printf("%d\n", *(ap+1));
printf("%d\n", *(ap+2));
printf("%d\n", *(ap+3));
printf("%d\n", *(ap+4));
return 0;
//정석: 여기서 ap+1 에서의 1 은 1byte의 1이 아니라 sizeof(int) * 1 의 1이다. 따라서 for문 형태로 작성할 때는 ap + i로 하면 된다.
포인터를 이용한 간단한 프로그램 :
#include <stdio.h>
int main()
{
{
char Name110, Name210, Name310;//이름
char *NameC;//변환될 이름
int Num1, Num2, Num3;//숫자
int *NumC;//변환될 숫자
printf("첫번째 사람의 이름과 숫자를 입력해주세요 : ");
scanf("%s %d", Name1, &Num1);
printf("\n두번째 사람의 이름과 숫자를 입력해주세요 : ");
scanf("%s %d", Name2, &Num2);
printf("\n세번째 사람의 이름과 숫자를 입력해주세요 : ");
scanf("%s %d", Name3, &Num3);
NameC = Name2;//배열도 일종의 포인터이므로 Name2 앞에 '&' 을 붙이지 않는다.
NumC = &Num2;//Num2는 포인터가 아니므로 '&' 을 앞에 붙여야 한다.
edit(NameC, NumC);// NameC 와 NumC, 즉 주소를 edit함수로 전달.
printf("\n바뀐 결과 : %s %d %s %d %s %d\n", Name1, Num1, Name2, Num2, Name3, Num3);
return 0;
}char *NameC;//변환될 이름
int Num1, Num2, Num3;//숫자
int *NumC;//변환될 숫자
printf("첫번째 사람의 이름과 숫자를 입력해주세요 : ");
scanf("%s %d", Name1, &Num1);
printf("\n두번째 사람의 이름과 숫자를 입력해주세요 : ");
scanf("%s %d", Name2, &Num2);
printf("\n세번째 사람의 이름과 숫자를 입력해주세요 : ");
scanf("%s %d", Name3, &Num3);
NameC = Name2;//배열도 일종의 포인터이므로 Name2 앞에 '&' 을 붙이지 않는다.
NumC = &Num2;//Num2는 포인터가 아니므로 '&' 을 앞에 붙여야 한다.
edit(NameC, NumC);// NameC 와 NumC, 즉 주소를 edit함수로 전달.
printf("\n바뀐 결과 : %s %d %s %d %s %d\n", Name1, Num1, Name2, Num2, Name3, Num3);
return 0;