E D R , A S I H C RSS

날다람쥐 6월9일

ZeroPage (새싹-날다람쥐 6월 9일)

포인터(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 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


}


배열과 포인터

배열은 여러개의 변가 모인 형태이다.
10003
10044
10082
10121
10168

은 int a5 = {3, 4, 2, 1, 8};을 선언한 형태이다.
여기서 주목할 점은 우리가 출력할 때
printf("%d", a0);
와 같이 배열의 번지를 적어주어야 한다는건데
왜 printf("%d", a); 와 같이 적으면 안되는지 알아보자.
a == &a0
이라는 것을 외우도록 하고
int* ap = a;

라고 한다면 ap에는 a의 첫 번째 변(a0)의 주소가 들어가게 된다.
물론 출력할 때는 printf("%d", *ap); 와 같이 a0을 출력할 도 있다.
이것은 캐릭터, 더블 등 다른 변에도 모두 적용된다.


과제

(맨 밑의 고치기 버튼을 누르면 정할 있고, 자기 이름 밑에 내용 쓰기. 위의 내용은 바꿔도 되지만 책임못짐 ㅋㅋ)

포인터를 이용한 간단한 프로그램

이름과 반을 3개 입력받고 포인터를 이용해서 edit라는 함 안에서 2번째 입력받은 사람을 정한 후 다시 출력하기. 예) 유정석 1
이지은 3
김윤석 5
- 2번째 사람을 정해 주세요 -
장다예 4
- 결과 -
유정석 1
장다예 4
김윤석 5

배열의 이동을 포인터로?!

바로 위의 배열을 모두 출력하는데, printf("%d", *(ap + @))의 형태로 출력해보자. 여기서 모든 값들을 출력하려면 @에 각각 어떤 가 들어가는지 직접 해보고 왜 그런지 설명하기.




김상훈


김윤석

배열의 이동을 포인터로 :

#include <stdio.h>

int main()
{
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;
}
//정석: 여기서 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 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);// NameCNumC, 즉 주소를 edit함로 전달.

printf("\n바뀐 결과 : %s %d %s %d %s %d\n", Name1, Num1, Name2, Num2, Name3, Num3);

return 0;
}

이지은


장다예



Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:28:53
Processing time 0.0293 sec