공부/C programming

10. 포인터

natom_ 2016. 5. 17. 14:44
반응형

1. 포인터의 개념, 선언방법


포인터의 개념은 주소만 저장하는 변수는 포인터 변수라고한다. 

포인터 변수를 줄여 포인터로 말한다. 

포인터를 제대로 사용하기 위해 세가지 과정이 필요하다.

① 포인터 변수도 일반 변수처럼 선언을 해야 사용할 수 있다.

② 포인터 변수가 특정 기억장소를 가리키게 하려면 가리키고 싶은 기억장소의 주소를 대입해야한다.

③ 포인터 변수에 저장된 주소를 이용해 다른 기억장소를 참조하려면 특별한 연산자인 간접연산자 '*'를 이용해야한다.


<포인터 변수 선언> 

자료형 *포인터변수명;

* : 정확히는 간접 참조 연산이지만 여기서는 선언하는 변수가 일반 변수가 아니라 단순히 포인터 변수임을 표시하는 기호라고 생각하자.

자료형 : 포인터 변수가 가리키는 기억장소에 저장될 자료의 형이다. 

   



2. 배열을 포인터로 전달받기. 프로그램 10-8


<소스코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <stdio.h>
#include <stdlib.h>
#define N 4
 
void print_arr(int *arr); 
void percentage(int *arr);
 
 
int main(int argc, char *argv[]) {
    
    
    int count[N] = {42378333};
    
    printf("인원수 >> ");
    print_arr(count);        //배열 이름 = 시작 주소
     
    
    
    printf("\n\n백분율 >> ");
    percentage(count);
    print_arr(count);
    
    return 0;
}
 
 
void print_arr(int *arr)
{    
    int i;
    
    for(i=0;i<N;i++)
        printf("%3d",*(arr+i));        //arr[i] = *(arr+i)
        
        
}
 
 
void percentage(int *arr)
{
    int i, total = 0;
    
    for(i=0;i<N;i++)
        total += *(arr+i);        //total += arr[i];
        
    for(i=0;i<N;i++)
        *(arr+i) = (int)((double)*(arr+i)/total*100);
   
        
}
 
cs


<실행결과>



3. 포인터 변수의 교환으로 두 문자열 교환하기. 프로그램 10-10


<소스코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
 
int main(int argc, char *argv[]) {
    
    
    char *first = "GilDong"*last = "Hong";        //이름과 성을 주소로 선언해주었다. 
    char *temp;        //문자열 주소를 임시로 저장할 포인터 변수 
    
    
    printf("Before Name : %s %s\n",first,last);
        
    //포인터 변수에 저장된 두 주소를 교환해 두 포인터가 가리키는 문자열 교환하기 
    temp = first;
    first = last;
    last = temp;
    
    printf("After Name : %s %s\n",first,last);
        
    return 0;
}
cs






<실행 결과>




4. char형 배열을 이용한 두 문자열의 교환. 프로그램 10-11


<소스코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>
#include <string.h>        //strcpy함수를 위한 헤더파일 
 
int main(int argc, char *argv[]) {
    
    char first[10= "GilDong", last[10= "Hong";        //이름과 성 
    char temp[10];        //문자열을 임시로 저장할 배열 
    
    printf("Before Name : %s %s\n",first, last);
    
    //배열의 내용을 직접 교환하여 두 문자열을 교환하기
    strcpy(temp,first);        //first배열의 문자열을 temp배열에 복사하기 
    strcpy(first,last);        //last 배열의 문자열을 first배열에 복사하기 
    strcpy(last,temp);         //temp 배열의 문자열을 last 배열에 복사하기 
    
    printf("Last Name : %s %s\n",first,last); 
 
    
    return 0;
}
cs


<실행결과>


5. char형 2차원 배열을 이용한 문자열 저장 및 정렬. 프로그램 10-15


<소스코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>
#include <stdlib.h>
#include <string.h>        //strcmp,strcpy 함수를 위한 헤더파일 
#define SIZE 5            //배열의 원소수 
 
int main(int argc, char *argv[]) {
    
    
    int i, pass;
    char temp[10];         //문자열 한 개를 임시로 저장할 배열 
    char silver[5][10= {"나태희""유빈""나원빈""문건영""소지법"};
    
    printf(" *** 은메달 리스트 : ");
    
    
    for(i=0;i<SIZE;i++)        //정렬 전 재열내용출력하기 
        printf("%s, ",silver[i]);
        
    printf("\b\b ** \n");        //\b를 이용하여 마지막 이름 뒤의 , 지우기 
    
    
    //버블 정렬을 이용하여 이름을 가나다순으로 정렬하기 
    for(pass = 1; pass<SIZE; pass++)
        for(i=0;i<SIZE-pass;i++)
            if(strcmp(silver[i],silver[i+1])>0)
            {
                strcpy(temp,silver[i]);
                strcpy(silver[i],silver[i+1]);
                strcpy(silver[i+1],temp);
            }    
    
       printf(" *** 정렬한 리스트 : ");
       
       for(i=0;i<SIZE;i++)        //정렬 후 배열 내용 출력하기 
        printf("%s, ",silver[i]);
                
    printf("\b\b ** \n");    //\b를 이용하여 마지막 이름 뒤의 , 지우기 
        
 
    
    return 0;
}
cs


<실행 결과>



6. char형 포인터배열을 이용한 문자열 저장 및 정렬. 프로그램 10-16


<소스코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
#include <stdlib.h>
#include <string.h>        //strcmp,strcpy 함수를 위한 헤더파일 
 
int main(int argc, char *argv[]) {
    
    
    char *gold[] = {"한빛""성춘향""이몽룡""사공민국""황해"};
    int i, j, size;        //배열에 저장된 문자열의 수 
    char  *temp;        //문자열 주소를 임시로 저장할 포인터 
    size = sizeof(gold) / sizeof(gold[0]);    
    printf("** 금메달 리스트 **\n");
    
    
    for(i=0; i<size; i++)        //정렬 전 배열 내용 출력하기 
        printf("%s, ", gold[i]);
        
    printf("\b\b**\n\n");         //\b를 이용하여 마지막 이름 뒤의 , 지우기 
    
    
    //교환 정렬을 이용하여 이름을 가나다순으로 정렬하기 
    for(i=0; i<size-1; i++)
        for(j=i+1; j<size; j++)
            if(strcmp(gold[i], gold[j])>0)
            {
                //문자열의 시작주소를 저장한 gold[i]와 gold[j]를 교환 
                temp = gold[i];
                gold[i] = gold[j];
                gold[j] = temp;
            }
            
    printf("** 정렬한 리스트 : \n");
    
    for(i=0; i<size; i++)        //정렬 후 배열 내용 출력하기 
        printf("%s ,", gold[i]);
        printf("\b\b ** \n\n");        //\b를 이용하여 마지막 이름 뒤의 , 지우기 
        
 
    
    return 0;
}
cs


<실행결과>


반응형

'공부 > C programming' 카테고리의 다른 글

  (0) 2016.06.02
11. 구조체  (0) 2016.05.24
9. 변수의 참조 영역과 지속기간  (0) 2016.05.13
dd  (0) 2016.05.12
8. 함수  (0) 2016.05.10