í�¬ì�¸í„°(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
}
ë°°ì—´ê³¼ í�¬ì�¸í„° ¶
배열� 여러개� 변수가 모� 형태�다.
ì�€ int a5 = {3, 4, 2, 1, 8};ì�„ ì„ ì–¸í•œ 형태ì�´ë‹¤.
와 ê°™ì�´ ë°°ì—´ì�˜ 번지수를 ì �어주어야 한다는건ë�°
ì�´ë�¼ëŠ” 것ì�„ 외우ë�„ë¡� 하ê³
int* ap = a;
| 1000 | 3 | |
| 1004 | 4 | |
| 1008 | 2 | |
| 1012 | 1 | |
| 1016 | 8 | |
ì�€ int a5 = {3, 4, 2, 1, 8};ì�„ ì„ ì–¸í•œ 형태ì�´ë‹¤.
여기서 ì£¼ëª©í• ì �ì�€ 우리가 ì¶œë ¥í• ë•Œ
printf("%d", a0);와 ê°™ì�´ ë°°ì—´ì�˜ 번지수를 ì �어주어야 한다는건ë�°
ì�´ë�¼ëŠ” 것ì�„ 외우ë�„ë¡� 하ê³
int* ap = a;
ê³¼ì œ ¶
(맨 ë°‘ì�˜ ê³ ì¹˜ê¸° 버튼ì�„ 누르면 ìˆ˜ì •í• ìˆ˜ ìžˆê³ , ìž�기 ì�´ë¦„ ë°‘ì—� ë‚´ìš© 쓰기. 위ì�˜ ë‚´ìš©ì�€ 바꿔ë�„ ë�˜ì§€ë§Œ 책임못ì§� ã…‹ã…‹)
í�¬ì�¸í„°ë¥¼ ì�´ìš©í•œ 간단한 프로그램 ¶
ì�´ë¦„ê³¼ ë°˜ì�„ 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>
void edit(char *NameC, int *NumC)
{
{
printf("\në‘�번째 ìž…ë ¥í•œ ì�´ë¦„ê³¼ 숫ìž�를 바꿉니다. : ");
scanf("%s %d", NameC, NumC);// ��터�므로 '&' 를 붙�지 않는다.
}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);// 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;









