<구조체 예제>

세 명의 정보를 입력받아 출력


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
#define _CRT_SECURE_NO_WARNINGS
 
#include<stdio.h>
#include<stdlib.h>
 
typedef struct student {
    int num;
    char name[10];
    char tell[15];
    int age, money;
}Student;
 
int main() {
    Student s1[3];
 
    for (int i = 0; i < 3; i++) {
        printf("번호 입력 :");
        scanf("%d"&s1[i].num);
        printf("이름 입력 :");
        scanf("%9s", s1[i].name);
        printf("전화번호 입력 :");
        scanf("%14s", s1[i].tell);
        printf("나이 입력 :");
        scanf("%d"&s1[i].age);
        printf("연봉 입력 :");
        scanf("%d"&s1[i].money);
    }
    
    printf("번호 \t 이름 \t 전화번호 \t 나이 \t 연봉\n");
    for (int i = 0; i < 3; i++) {
        printf("%d \t %s \t %s \t %d \t %d\n", s1[i].num,
 s1[i].name, s1[i].tell, s1[i].age,s1[i].money);
    }
    system("pause");
    return 0;
}
cs


'@C언어 : Layer7' 카테고리의 다른 글

Git 사용 보고서  (1) 2018.06.08
너의 타자소리가 들려  (0) 2018.05.23
구조체  (0) 2018.05.13
메모리 구조  (0) 2018.05.12
Codeup 100제  (0) 2018.04.13


구조체


구조체란 ?

구조체는 배열보다 발전된 개념으로 변수의 종류에 관계없이 '서로 관련된 데이터를 하나로 묶어 놓은 것'이다.


학생정보를 입력받는 배열을 만든다면 하나의 배열에 모두 담는다면 좋겠지만 학생의 이름은 int에 저장할 수 없으므로 따로 선언할 수 밖에 없다.


char name[10];   //이름

int score[4];       //학번, 국어 점수, 수학 점수, 영어 점수


그러나 구조체를 사용하면 이러한 문제를 해결할 수 있다.


struct student {        //구조체 student를 정의

int no;                     //학번

char name[10];         //이름

int kor, math, eng;    //과목별 점수

} ;


위의 코드는 student라는 이름의 구조체를 정의한 것으로, 학생의 여러 정보를 하나의 구조체로 묶었다.

구조체의 정의는 구조체의 구성요소에 대한 정보일 뿐 구조체를 정의한다고 저장공간이 생기는 것은 아니다.


struct student s1 ; // 구조체 변수 s1을 선언


위와 같이 구조체 변수를 선언해야 저장공간이 생기고 구조체 안에 선언된 순서대로 연속적인 저장공간이 마련된다.


int 형 4개 + char 형 10개 + 패딩 2 바이트  =  28 바이트


패딩이란 ?

시스템의  '정렬 제한'에 의해 구조체의 멤버 사이에 빈 공간이 생긴 것

모든 변수는 주소가 4의 배수인 곳에만 저장되도록 배치한다는 것이다.

 

구조체 정의와 선언


정의


struct 구조체이름{    //구조체 student를 정의

타입 멤버 이름;   //구조체의 멤버

타입 멤버 이름;

...

} ;   <-중괄호 뒤에 ' ; '를 붙여야 함


이 구조체의 정의는 새로운 타입을 정의한 것일 뿐, 아직 값을 저장할 공간이 마련되지 않았다.


선언

 구조체를 정의하면 struct '구조체 이름' 라는 타입이 새로 추가되고 구조체 타입의 변수를 선언하는 것은 기존의 변수 선언 방법과 다르지 않다.


예)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct student {
    int no;
    char name[10];
    int kor, math, eng;
}Student;
 
int main() {
    Student s1 = { 1,"KIM",100,100,100 };
 
    printf("%d %s %d %d %d\n", s1.no, s1.name,
 s1.kor, s1.math, s1.eng);
    system("pause");
    return 0;
}
cs



1
2
3
4
5
typedef struct student {
    int no;
    char name[10];
    int kor, math, eng;
}Student;
cs






구조체 타입의 변수를 선언할 때 매번 struct를 붙이는 것이 불편할땐
typedef로 새롭게 정의할 수 있다. typedef struct student Student ; //struct student를 Student로 정의 Student s1 ; //struct student s1; 과 동일

구조체의 초기화

선언된 구조체 변수의 저장공간에 접근하려면 '구조체 변수이름. 멤버이름'의

형식을 사용해야 한다.

1

2

3

4

5

6

7

int main() {

    Student s1 = { 1,"KIM",100,100,100 };

 

    printf("%d %s %d %d %d\n", s1.no, s1.name, s1.kor, s1.math, s1.eng);

    system("pause");

    return 0;

}

Colored by Color Scripter

cs

구조체의 멤버에 접근할 때 사용하는 ' . '는 '멤버 접근 연산자'또는 간단히 '멤버 연산자'라고 한다.


struct student s1={ 1, "KLIDONG", 100,100,100} ;  

//구조체 변수를 선언과 동시에 조기화


struct student s1 = { 0 } ; 

//구조체 변수의 모든 멤버를 0으로 초기화




구조체의 중첩


구조체도 구조체의 멤버가될 수 있으며, 이렇게 하는 것을 구조체의 중이라고 한다.


 

1
2
3
4
5
6
typedef struct userScore {
    char uerId[8];         //사용자 id
     int score,rank;        //점수
    int iyear, imon, iday; //입력날짜
    int cyear, cmon, cday; //변경 날짜
}Userscore;
cs
4,5번째 줄을 보면 입력날짜와 변경날짜를 따로따로 입력해줘야 하는데 이것을 또하나의 구조체로 만들어 중첩시킨다면


1
2
3
4
5
6
7
8
9
10
struct date {
    int year, mon, day;
};
 
typedef struct userScore {
    char uerId[8];         //사용자 id
     int score,rank;        //점수
    struct date inputDate; //입력날짜
    struct date changeDate; //변경 날짜
}Userscore;
cs


이렇게 구조체 userScore가 더 간결해졌고, 코드의 중복이 제거되어 수정도 쉬워졌다. 또한 구조체 date는 다른 구조체를 작성할때도 재사용될 수 있을 것이다. 또한 구조체 자신을 중첩하는 것은 허용되지 않는다. 


중첩된 구조체의 멤버에 접근하려면 ' . '연산자를 한번 더 사용해야한다.

s1. inputDate. year   = 2016;

s1. inputDate.mon    = 1;

s1. inputDate.day     = 6;


중첩된 구조체 변수의 선언과 초기화를 함께 할 때는 다음과 같이 괄호를 중첩한다. 

s1=userScore s1 = {"myId",100 ,1 , { 2016, 1, 31 },{ 2016 , 2, 2 }};





구조체의 배열

같은 타입의 구조체 변수들을 하나로 묶어서 배열로 선언할 수 있다.

배열 요소의 타입 구조체라는 것만 제외하면 일반 배열과 다르지 않으므로 그동안 배열을 다뤄왔던 것과 똑같이 하면 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef struct student {
    int no;
    char name[10];
    int kor, math, eng;
}Student;    
 
int main() {
    Student stuArr[] = {
        {1,"KIM",100,100,10},
        {2,"LEE",90,90,90},
        {3,"CHOI",80,80,80},
        {4,"PARK",100,100,100}
    };
    return 0;
}
cs


int no ,char name[10] ,int kor ,math, eng를 멤버로 갖고있는 구조체 Student형인 배열 stuArr를 4개 선언하고 선언과 동시에 초기화 시켰다. 구조체 배열을 초기화 하는 것은 2차원 배열을 초기화 하는 것과 동일하다.



구조체의 포인터

구조체 변수 역시 포인터로 다룰 수 있으며, 다루는 방법은 같다.

struct student s = { 1, "홍길동", 100, 100, 100 } ;

struct student *p = &s ; //구조체 변수 s의 주소를 포인터 p에 저장


포인터로 구조체의 멤버에 접근할 때는 '*'연산자와 '.'연산자를 같이 사용한다.

포인터로 구조체의 멤버에 접근하려면, 두개의 연산자에 괄호까지 더해야 해서 불편하다. 그래서 제공되는 연산자가 '->'이다.

'->'포인터가 가리키는 구조체의 멤버에 저장된 값을 반환한다.

                            

     s . kor = 90 ;                                 

                              (*p). kor = 90 ;

                              p -> kor = 90 ;



구조체의 배열의 포인터


구조체 배열을가리키는 포인터의 타입은 구조체의 타입에 '*'을 붙인 것이다.

struct student stuArr[4];

struct student *pArr = stuArr;







'@C언어 : Layer7' 카테고리의 다른 글

너의 타자소리가 들려  (0) 2018.05.23
구조체 예제  (0) 2018.05.15
메모리 구조  (0) 2018.05.12
Codeup 100제  (0) 2018.04.13
문자열 함수 구현  (0) 2018.04.11

메모리 구조


프로그램이 실행되면, 프로세스가 된다. OS는 프로세스가 작업을 수행하는데 사용할 수 있는 메모리를 제공한다. 메모리의 저장 공간은 세분화하여 5가지 영역으로 나뉘어져 있다.



1. 코드 영역(Code segment)

프로그램을 실행하면, 프로그램 파일( .exe)의 내용이 여기에 저장된다. 이 영역에 저장된 내용을 변경할 수 없고, 읽기만 가능하다. 나머지 영역들은 읽기와 쓰기가 모두 가능하다.




2. 데이터 영역(Data segment)

전역 변수와 정적 변수(static)가 할당되는 영역이다. 초기화된 전역변수는 Data영역에 할당되고 초기화 되지 않은 전역변수는 BSS에 할당되어 0으로 초기화 된다.




3. BSS 영역(Block Stated Symbol)

초기화 되지 않은 전역변수가 할당되어 0으로 초기화 된다.


1
2
3
4
5
6
7
8
9
#include<stdio.h>
int a = 3//Data 영역
int b; //BSS영역
int main() {
 
    int c; //Stack 영역
    printf("%d %d %d\n", a, b, c); // 3 0 쓰레기 값 
    return 0;
}
cs


int a = 3//Data 영역
int b; //BSS영역
int c; //Stack 영역



4. Stack 영역

함수가 작업을 수행하는데 사용하는 메모리 공간이다. 함수가 호출되면 스택에 호출된 함수를 위한 메모리가 할당되며, 이 메모리는 함수가 작업을 수행하는 동안 지역 변수를 저장하는데 사용된다.

그리고 함수가 작업을 마치면 할당되었던 메모리는 반환되어 해당 함수의 지역변수는 자동으로 메모리에서 제거된다.



5. Heap 영역

프로그램 실행 중에 동적으로 메모리를 할당받아 사용할 수 있는 영역이다. 필요할 때 할당 받아서 사용하고, 다 사용한 후에는 반환 할 수 있다. 힙은 스택과 달리 자동으로 메모리가 반환되지 않으므로, 동적할당 받은 메모리는 사용 후에 반드시 메모리를 반환하는 함수를 호출해야 한다.



5-1. 동적할당

함수 내에 지역적으로 선언된 변수나 배열은 합수가 종료되면 메모리에서 사라지기 때문에 여러 함수에서 사용하기에 부적합 하다. 그렇다고 전역적으로 선언된 변수나 배열은 여러 함수에서 사용하기 좋지만 프로그램이 종료될때까지 메모리를 점유해서 메모리 공간을 비효율 적으로 사용하게 된다. 필요할 때만 메모리를 할당받아 사용하기 위한 방법이 바로 동적할당이다.


동적 메모리 할당 : 실행 중에 원하는 기간 동안 필요한 만큼의 메모리를 할당받는 것


malloc( ) 

동적으로 메모리를 할당 받으려면 malloc( ) 이라는 함수를 사용해야 하는데  이 함수를 호출하면 메모리 할당 요청이 OS에게 전달된다. 그러면 OS는 힙(heap)에서 사용중이지 않은 영역을 찾아 할당해준다. 할당 받은 메모리는 사용한 후에 free( )를 호출해서 반환한다.


사용법은 이러하다.

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
#include<stdlib.h>
int main() {
    //동적 할당받은 공간의 주소를 포인터 pi에 저장
    int* pi = (int*)malloc(sizeof(int)); 
    //동적 할당받은 공간에 값을 저장
    *pi = 10;
    //동적 할당받은 공간에 저장된 값을 출력
    printf("%d\n"*pi);
free(pi);
    system("pause");
    return 0;
}
cs

동적으로 할당받은 저장공간은 오직 포인터를 통해서만 접근할 수 있다.

ex)   *(p+0) = 1;

       *p = 1;

  p[0] = 1;

위 세줄은 모두 같은 의미이다.



malloc( )의 반환값은 타입이 'void*' 이므로, 이 값을 어떠한 타입의 포인터에 저장해도 된다. = 할당 받은 공간을 어떠한 용도로든 자유롭게 사용할 수 있다.

동적으로 할당받은 공간은 주로 배열로 쓰인다. 그리고 이 공간을 배열로 사용하는 것은 배열을 포인터로 다루는 것과 완전히 동일하다. 



memset 

힙도 스택처럼 초기화 없이 덮어쓰기만 하므로 malloc( )을 통해 할당받은 메모리는 이전 데이터 값(쓰레기 값)이 그대로 남아있다. 초기화가 필요하면, memset로 초기화 할 수있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main() {
    //동적 할당받은 공간의 주소를 포인터 pi에 저장
    int* pi = (int*)malloc(sizeof(int)); 
    //동적 할당받은 공간을 0으로 초기화
    memset(pi, 0sizeof(int));
    //동적 할당받은 공간에 초기화된 값을 출력
    printf("%d\n"*pi);
free(pi);
    system("pause");
    return 0;
}
fㄹcs




free( ) 

동적으로 할당받은 메모리는 사용한 후에 반드시 할당을 해제해야 한다. 그렇지 않으면 메모리 누수가 발생한다. 또한 free( )를 한 후에 해당 메모리에 접근하는 댕글링 포인터를 조심해야한다.


*메모리 누수 : 프로그램에 메모리를 할당 후, 해제하지 않아서 시스템의 메모리를 고갈시키는 소프트웨어 오류

*댕글링 포인터 : 해제된 메모리를 가리키는 포인터


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main() {
    //동적 할당받은 공간의 주소를 포인터 pi에 저장
    int* pi = (int*)malloc(sizeof(int)); 
    //동적 할당받은 공간을 0으로 초기화
    memset(pi, 0sizeof(int));
    //동적 할당받은 공간에 초기화된 값을 출력
    printf("%d\n"*pi);
    //동적 할당받은 공간의 사용이 다하면 메모리를 해제
    free(pi);
    system("pause");
    return 0;
}
cs



calloc( ) 

calloc( )은 다음과 같이 정의 되어 있다.

void *calloc(size_t n , size_t size) ;


calloc은 매개변수가 2개 이다. 타입의 크기와 개수를 따로 받는다.


iArr = malloc(100 * sizeof(int));

iArr = calloc(100, sizeof(int));


위의 두 문장은 모두 int타입의 값을 100개 저장할 수 있는 메모리를 할당받는다.

(malloc 과 calloc의 차이점은 calloc은 malloc과 다르게 할당받은 메모리는 모두 0으로 자동 초기화 된다)



realloc( ) 


동적 할당받은 메모리가 부족하게 된 경우에는 추가로 malloc을 사용할 수도 있지만 두 메모리의 주소가 연속적이라는 보장이 없기 때문에 사용하는데 어려움이 있다. 그래서 이럴땐 realloc( )을 사용하면 된다.


realloc은 다음과 같이 정의 되어 있다.

void *realloc(void *memblock, size_t newSize) ;


첫 번째 매개변수 :동적 할당받은 메모리의 주소

두 번째 매개변수 :변경하고자 하는 메모리의 크기

첫 번째 매개변수의 값이 NULL이면 malloc과 같은 역할을

두 번째 매개변수의 값이 0이면 free( )처럼 동작하여 해당 메모리는 해제된다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main() {
    int* Arr;
    Arr = (int*)malloc(sizeof(int* 10);
    *(Arr + 5= 10;
    printf("%d %d\n",Arr[5],Arr[15]);
    //동적할당된 Arr의 크기가 10이어서 10을 넘으면 쓰레기 값이 출력된다.
    Arr = (int*)realloc(Arr, sizeof(int* 10 * 2);
    //기존의 동적할당 되었던 Arr의 크기를 2배로 늘리고 값을 할당하였다.
    Arr[15= 10;
    printf("%d  %d\n"*(Arr+5),Arr[15]);
    system("pause");
    return 0;
}
cs


'@C언어 : Layer7' 카테고리의 다른 글

구조체 예제  (0) 2018.05.15
구조체  (0) 2018.05.13
Codeup 100제  (0) 2018.04.13
문자열 함수 구현  (0) 2018.04.11
함수 문제풀이  (0) 2018.04.09


'@C언어 : Layer7' 카테고리의 다른 글

구조체  (0) 2018.05.13
메모리 구조  (0) 2018.05.12
문자열 함수 구현  (0) 2018.04.11
함수 문제풀이  (0) 2018.04.09
수업 문제풀이  (0) 2018.04.09


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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#define _CRT_SECURE_NO_WARNINGS
 
#include <stdio.h>
#include<stdlib.h>
size_t strlen(const char *str)
{    //문자열 길이 출력
    int a = 0;
    while (str[a] != '\0') {
        ++a;
    }
    return a;
}
 
int strcmp(const char *str1, const char *str2)
{        //문자가 서로 다른곳 까지의 아스키코드 합을 비교함
    int i;
    for (i = 0; (str1[i] != NULL|| (str2[i] != NULL); i++) {
        if (str1[i] == str2[i])
            continue;
        else if (str1[i] > str2[i]) {
            return 1;
        }
        else if (str1[i] < str2[i]) {
            return -1;
        }
    }
    return 0;
}
 
char * strcpy(char * destination, const char * source)
{    //문자열 복사
    int i;
    for (i = 0; source[i] != NULL; i++) {
        destination[i] = source[i];
    }
    destination[i] = '\0';
    return destination;
}
 
int main()
{
    int result[32];
    int index = 0;
    char arr[32];
 
    result[index++= strcmp("asdf""asdfg");
    result[index++= strcmp("asdf""asdf");
    result[index++= strcmp("asdg""asdf");
    result[index++= strcmp("asdf""asdf");
    result[index++= strcmp("00""0011");
    result[index++= strcmp("00""100");
    result[index++= strcmp("00"" 00");
    result[index++= strcmp("0"" 0");
    result[index++= strcmp("0""0 ");
    result[index++= strcmp("0""0");
    result[index++= strcmp(" "" ");
 
    strcpy(arr, "asdf1234!@#$");
    result[index++= strcmp("asdf1234!@#$", arr);
    strcpy(arr, "");
    result[index++= strcmp("asdf1234!@#$", arr);
    result[index++= strcmp("", arr);
 
    result[index++= strlen("");
    result[index++= strlen(" ");
    result[index++= strlen(" \t");
    result[index++= strlen(" \t\r\n\"");
    result[index++= strlen("asdf");
    result[index++= strlen("asdf  ");
    result[index++= strlen("  asdf");
    result[index++= strlen("  asdf  ");
    result[index++= strlen("  asdf  \t");
 
    for (int i = 0; i < index; i++)
    {
        printf("%d : %d\n", i, result[i]);
    }
    system("pause");
    /*
    Expected Result:
    0 : -1
    1 : 0
    2 : 1
    3 : 0
    4 : -1
    5 : -1
    6 : 1
    7 : 1
    8 : -1
    9 : 0
    10 : 0
    11 : 0
    12 : 1
    13 : 0
    14 : 0
    15 : 1
    16 : 2
    17 : 5
    18 : 4
    19 : 6
    20 : 6
    21 : 8
    22 : 9
    */
}
cs





'@C언어 : Layer7' 카테고리의 다른 글

메모리 구조  (0) 2018.05.12
Codeup 100제  (0) 2018.04.13
함수 문제풀이  (0) 2018.04.09
수업 문제풀이  (0) 2018.04.09
포인터 보고서  (0) 2018.04.09

//1610

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
#include<stdio.h>
 
char *mysubstr(char *str, int start, int count);
 
int main() {
 
    char arr[101];
    int start,count;
    scanf("%s"&arr);
    scanf("%d %d"&start, &count);
    printf("%s\n", mysubstr (arr, start, count));
    
    return 0;
}
 
char *mysubstr(char *str, int start, int count)
{
    int i;
    char a[1000];
    for (i = start; i < count+start; i++) {
        a[i] = str[i];
    }
    a[i] = '\0';
 
    return &a[start];
}
cs




//1620

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
#include<stdio.h>
#include<stdlib.h>
 
int su;
 
int hap(int su);
 
int main() {
    scanf("%d"&su);
    printf("%d", hap(su));
    return 0;
}
int hap(int su) {
    int sum = 0, num, i;
    while (1) {
        sum = 0;
        while (su != 0) {
            num = su % 10;
            sum += num;
            su = su / 10;
            printf("num : %d\nsum : %d\n", num, sum);
        }
        su = sum;
        num = 0;
        if (sum <= 9)
            break;
    }
    return sum;
}
cs


//2601


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
#include<stdio.h>
#include<stdlib.h>
 
int pibo(int num);
 
int main() {
    int num;
    scanf_s("%d"&num);
    printf("%d", pibo(num));
    system("pause");
    return 0;
}
 
int pibo(int num) {
    int i,num2;
    int arr[100];
    for (i = 0; i < 100; i++) {
        arr[i] = i; //arr[0]=1 arr[1]=1
    }
    arr[0= 1;
    for (i = 2; i < num; i++) {
        arr[i] = arr[i-2+ arr[i - 1];
    }
    return arr[num-1];
}
cs


'@C언어 : Layer7' 카테고리의 다른 글

Codeup 100제  (0) 2018.04.13
문자열 함수 구현  (0) 2018.04.11
수업 문제풀이  (0) 2018.04.09
포인터 보고서  (0) 2018.04.09
함수 보고서  (0) 2018.04.06


//1405


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
#include<stdio.h>
#include<stdlib.h>
int main() {
    int num[1000];
    int num1,num2,i,j=0,temp=0;
    scanf_s("%d"&num1); //5
    
    for (i = 0; i < num1; i++) {
        scanf_s("%d"&num2);
        num[i] = num2;
    }
    
    for (i = 0; i < num1; i++) {
        printf("%d ", num[0]);
        temp = num[0]; //0
        for (j = 1; j < num1; j++) {
            num[j-1= num[j];
            printf("%d ", num[j]);
        }
        num[num1-1= temp; //4
        printf("\n");
    }
 
    system("pause");
    return 0;
}
cs


//1409

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
#include<stdlib.h>
int main() {
    int arr[10];
    int num,num1,i;
    for (i = 0; i < 10; i++) {
        scanf_s("%d"&num);
        arr[i] = num;
    }
    scanf_s("%d"&num1);
    printf("%d", arr[num1 - 1]);
 
    system("pause");
    return 0;
}
cs

//1566

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include<stdlib.h>
int a, n;
 
long long int pow(int a, int n);
 
int main()
{
    scanf_s("%d%d"&a, &n);
    printf("%lld\n", pow(a,n));
    system("pause");
}
long long int pow(int a, int n) {
    long long int expo = 1,i;
    for (i = 1; i <= n; i++) {
        expo *= a;
    }
    return expo;
}
cs

//1580

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
#include<stdlib.h>
 
float circle(int banzi);
 
int main() {
    float banzi;
    scanf_s("%f"&banzi);
    printf("%.2f", circle(banzi));
    system("pause");
    return 0;
}
 
float circle(int banzi) {
    float banzi2=0;
    banzi2 = (float)banzi * banzi*3.14;
    return banzi2;
}
cs


'@C언어 : Layer7' 카테고리의 다른 글

문자열 함수 구현  (0) 2018.04.11
함수 문제풀이  (0) 2018.04.09
포인터 보고서  (0) 2018.04.09
함수 보고서  (0) 2018.04.06
오름차순 문제  (0) 2018.04.04

포인터 보고서


3-1. 포인터란 ?

어떤 대상을 가리키는 것

포인터는 메모리에 저장된 것을 가리키기 위한 것이다. 가리킨다는 것은 포인터가 어떤 대상의 주소를 저장하고 있다는 것을 의미한다.

포인터는 메모리 주소를 저장하기 위한 변수이다.


3-2. 포인터를 사용하는 이유


1) 함수로 하나 이상의 값을 리턴하기 위해


2) 메모리의 정보를 쉽게 다루기 위해서


3) 메모리의 공간을 효율적으로 사용하기 위해서


3-3. 포인터 선언법

     

타입 *포인터명; //지정된 차입의 값을 가리키기 위한 포인터를 선언


int * ptr ;

ptr : 포인터의 이름

int * : 포인터의 타입

int : 포인터의 대상타입(포인터가 가리키는 대상의 타입

ptr가 가리키는 대상의 타입이 'int'이고, ptr의 타입은 'int*'이다.


3-4. 포인터 사용법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
 
int main() {
    int i = 5;
    int *= &i;
 
    printf("i =%d\n", i);
    //변수 i에 저장된 수
    printf("&i =%p\n"&i);
    //변수 i의 주소
    printf("p =%p\n", p);
    //포인터에 저장된 주소
    printf("&p=%p\n"&p);
    //포인터 p의 주소
 
    return 0;
}
cs

변수 i의 값, 변수 i의 주소, 포인터에 저장된 주소, 포인터 p의 주소를 출력



3-5. &연산자와 *연산자

1)   '&'연산자 = 주소 연산자 : 피연산자의 주소를 반환한다.

int i = 1;

int *ptr = &i;  //변수 i의 주소를 포인터 ptr에 저장


2)  '*'연산자 = 역참조 연산자 : 지정된 주소에 저장된 값을 반환한다.


포인터가 가리키는 대상에 저장된 값을 가져올 때는 '*'연산자 사용한다.  피연산자(포인터)가 가리키는 주소에 저장된 값을 읽어서 반환한다. 

int i=200 ;

int *ptr = &i ;  //포인터 ptr이 변수 i를 가리키게 된다.


3-6. Call by value 와 Call by reference

Call by value: 

main 함수에서 선언한 변수 n에 10을 넣어주고 값을 받아서 func함수에서 다시 20을 넣어주는데 main함수에서의 n=10과 func함수에서의 n=20은 메모리상 다른 위치에 상주해 있으므로 다시 main함수로 넘어오면 수정했던 값이 없어진다.


Call by reference:

변수 n의 주소를 함수 func의 n에게 넘겨주었으므로 func에서 넣은 20이 그대로 n에 들어가게 된다.(둘은 같은 주소를 공유하고 있으므로)



3-7. Swap 함수 구현 및 설명


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
#include<stdlib.h>
void swap_r(int *a, int *b);
 
int main() {
    int a, b;
    swap_r(&a, &b);
    printf("%d %d\n", a, b);  //주소를 이용하여 바꾸어줌
    system("pause");
    return 0;
}
void swap_r(int *a, int *b) {
    int temp;
    temp = *a;
    *= *b;
    *= temp;
}
cs

설명 :

main함수에서 &a,&b를 이용하여 swap_r함수에 값을 전달했기 때문에 두 함수의 a,b는 같은 주소를 공유하고 있다.

swap_r함수에서 변수 temp를 선언하여 a->temp / a=b / b=temp로 두 a,b값을 바꿔주고 값을 main에서 출력하면 바뀐 두 값이 정상적으로 출력된다.

'@C언어 : Layer7' 카테고리의 다른 글

함수 문제풀이  (0) 2018.04.09
수업 문제풀이  (0) 2018.04.09
함수 보고서  (0) 2018.04.06
오름차순 문제  (0) 2018.04.04
달팽이 배열  (0) 2018.04.04

+ Recent posts