1. char *p = "ABCDEFG"의 형태일 때 각각의 차이점은 무엇인가?

① *( p+3 )

② ( *p ) +3

③ *p + 3

④ p + 3


< 1번 소스코드 >



< 실행 결과 >









< 설명 >


*p 는 "ABCDEFG" 의 주소값이다.

내가 위의 보기에서 1, 2, 3은 "ABCDEFG"의 주소값을 보니 5fbff808가 나왔는데,

여기에서 3을 더하면 5fbff80b가 되어 "D"가 출력되게 된다.

반면, 4번은 그냥 p에 3을 더했기 때문에 이상한 값이 나온다.



2. char *p = {"ABCDE","KBS","XYZ"}; 일 때 다음 명령어들의 차이점은 무엇인가?

① p++

② *p++

③ (*p)++



< 소스 코드 >


1번 소스코드 : 


2번 소스코드 :





3번 소스코드 : 



-> 1, 2 출력 결과      

 -> 3 출력 결과



< 설명 >



2번 문제를 설명하기 위하여 한가지 코드를 짜보았다.

위의 문제의 1, 2, 3번의 차이는 *연산자와 ++연산자의 우선순위 차이이다.

32비트 운영 체제의 경우에 주소가 0x4씩 커진다.


*p++ = p가 가진 주소가 0x10인 경우, 0x14로 바뀐다.

(*p)++ = p가 가진 주소가 0x10인 경우, 0x10에 1이라는 값을 가지는 경우, 주소 0x10의 값이 2로 바뀐다.

*(p++) = *p++


이런 차이가 있다.




3. 다음 프로그램의 출력 결과를 예측해보아라.



나는 *c 라는 것은 주소값을 가리켜야 하는데 가르켜야 할 주소값이 없으니 입력을 받고 출력을 하지 못할 것 같다고 생각했다.


< 결과 >



내 생각이 맞았다. 난 Xcode를 사용해서 다른데에서는 어떻게 반응할지는 모르겠지만, 에러가 났다.

.

.

코드를 수정하여 이 코드가 돌아갈 수 있도록 해 보았다.




*c 라는 포인트 배열이 input 이라는 배열을 가리키게 하여 코드가 실행될 수 있도록 하였다.

▼▼▼ 출력 결과 실행이 잘 된다  ▼▼▼





4. char * p[] = {"ABC","XY","BJW","JMLEE"}; 일 때 다음 각각의 포인터의 연산 결과를 구하여라.

① *p

② *p([2] + 1)

③ *(*(p + 3) + 2)



1번만 실행할 경우 A가 출력 되지만, 2~3번은 에러가 나며 출력되지 않는다.

내가 예상한 결과는 2번의 경우 p[2]는 "BJW" 이고 +1이니 J를 예상하였고,

3번의 경우 *(p+3)은 p[3]이고 여기에 +2이니 L을 예상하였는데 에러가 나서 당황하였다.




내가 포인터를 잘못 이해하고 있는건지 모르겠다.

▶ 제가 만약 잘못하고 있는게 있으면 댓글로 달아주면 감사하겠습니다.



5. 입력받은 문자열 거꾸로 출력하는 프로그램을 만들어라.




< 코드 설명 >


위의 코드는  p 포인터 배열을 만든 뒤, Input을 받고, p[i]을 NULL 전까지 주소값를 증가시켰다.

마지막으로 for문으로 NULL 전부터 0까지 출력하게 하여 거꾸로 출력하는 프로그램을 만들어 보았다.



< 출력 결과 >






6. a가 배열이고, b가 문자열의 포인터일 때 배열 a에 b 문자열을 복사하는 함수를 만들어라.





< 코드 설명 >


이 코드는 a 배열과 b 포인터 배열을 선언하여 a를 입력받고 strcpy를 사용하여 b에 a를 저장하여 Output으로 b를 출력하였다.

결과는 아래와 같이 제대로 되었다.





7. char c[]="ABCDE" 일 때, c++과 같은 명령을 사용할 수 없는 이유를 구하여라.


c[]는 일반 배열이기 때문에 문자여서 c++를 하면 오류가 나게된다.

하지만 char *c[]를 하여 포인트 배열로 만들면 주소값의 형태를 띄게 되어 c++를 하면 주소값+1이 되어,

A의 주소값 +1 = B가 되어 BCDE가 출력되게 된다.

'Programming > C' 카테고리의 다른 글

함수 포인터  (0) 2015.08.27
[ Project ] Wild!  (0) 2015.08.27
[ Project ] Stack_Linked List  (0) 2015.08.27
연결 리스트 ( Linked List )  (0) 2015.08.27
구조체 ( Struct )  (0) 2015.08.27
함수 포인터 Programming/C 2015. 8. 27. 10:32

Ⅰ. 함수 포인터 


함수 포인터를 정의 내리기 전에 먼저 포인터에 대해 다시 한번 생각해 보도록 합시다.

포인터란 특정 변수에 대한 메모리 주소를 담을 수 있는 변수를 포인터 변수라고 합니다.


그렇다면 함수 포인터는 무엇일까요?  

함수 포인터란, 특정 함수에 대한 메모리 주소를 담을 수 있는 것입니다.


🃟 함수 포인터를 사용하는 이유는 무엇일까요?


🀱 프로그램 코드가 간결해 집니다.

🀲 함수 포인터를 배열에 담아서도 사용이 가능하므로 중복되는 코드를 줄일 수 있습니다.

🀳 상황에 따라 해당되는 함수를 호출 할 수 있어 유용합니다.




​Ⅱ. 함수 포인터의 사용

 

함수 포인터의 모양은 자료형 (*함수 포인터 이름) (자료형) 의 형식으로 사용합니다.

만약 함수들이 아래와 같은 경우


int (*FuncPtr) (int a, int b);

int add(int a,int b);

double div(double a,double b);


1. FuncPtr = add 

2. FuncPtr = &add

3. FuncPtr = div

4. FuncPtr = add()


다음 중 한가지 경우로 사용한다면, 1번과 2번은 괜찮은 방법이나 3번은 자료형이 다르기 때문에,

4번은 결과 값이 함수의 리턴 값이 되므로 안됩니다.



​Ⅲ. 함수 포인터 예제 




#include <stdio.h>



typedef int (*calcFuncPtr)(int, int);




int plus (int first, int second)

{

    return first + second;

}


int minus (int first, int second)

{

    return first - second;

}


int multiple (int first, int second)

{

    return first * second;

}


int division (int first, int second)

{

    return first / second;

}


int calculator (int first, int second, calcFuncPtr func)

{

    return func (first, second);

}


int main(int argc, char** argv)

{

    calcFuncPtr calc = NULL;

    int a = 0, b = 0;

    char op = 0;

    int result = 0;

    

    printf("Input : ");

    scanf ("%d %c %d", &a, &op, &b);

    

    switch (op)

    {

        case '+' :

            calc = plus;

            break;

            

        case '-':

            calc = minus;

            break;

            

        case '*':

            calc = multiple;

            break;

            

        case '/':

            calc = division;

            break;

    }

    

    result = calculator (a, b, calc);

    

    printf ("result : %d", result);

    

    return 0;

}



위의 코드는 함수 포인터를 사용한 계산기 코드입니다.


<실행 결과>







다음과 같이 정상적으로 작동 합니다.


 



'Programming > C' 카테고리의 다른 글

[ 선린 ] Pointer 과제  (0) 2015.08.31
[ Project ] Wild!  (0) 2015.08.27
[ Project ] Stack_Linked List  (0) 2015.08.27
연결 리스트 ( Linked List )  (0) 2015.08.27
구조체 ( Struct )  (0) 2015.08.27
[ Project ] Wild! Programming/C 2015. 8. 27. 10:29

프로젝트 명 : Wild!


< 프로젝트 설명 >


이 프로젝트는 C로 게임을 만들어 놓은 것으로, 조건문을 많이 써서 만들었습니다.

게임 밸런스라던가 난이도가 이상하고, 배운 것을 제대로 사용해 보지도 않아서 아쉬운 점이 많습니다.

다음에 다시 보완해볼 생각입니다.


< 소스 코드 >


#include <stdio.h>

#include <stdlib.h>


unsigned int choose=0,EXP=1000,boss;

unsigned int atk=25,hp=70,e_atk,g_exp=0,postion=3;

int bhp,e_hp;


void hunt(void)

{

    boss=rand()%100;

    if(boss>=95)

    {

        printf("_____________________________________________________\n\n");

        printf("BOSS 야생 짐승이 나타났습니다!!!!!!\n\n");

        getchar();

        e_hp=(rand()%(hp*3)+120)*3;

        e_atk=(rand()%atk+atk)*3;

        printf("명칭 : \n체력 : %d\n공격력 : %d\n\n",e_hp,e_atk);

        bhp=hp;

        atk=atk+(rand()%10-5);

    }

    else{

        printf("______________________________________________________\n\n");

        printf("야생의 짐승이 나타났다!!!\n\n");

        getchar();

        e_hp=hp+(rand()%hp-rand()%(hp/2));

        e_atk=atk+(rand()%atk-rand()%(atk/2));

        printf("명칭 : 야생짐승\n체력 : %d\n공격력 : %d\n\n",e_hp,e_atk);

        bhp=hp;

        atk=atk+(rand()%10-5);

    }

    while(1)

    {

        printf("_______________________적의 ______________________\n\n\n");

        getchar();

        bhp-=e_atk;

        if(bhp<0)

            bhp=0;

        printf("야생 짐승에게서 %d 데미지를 입었다.\n남은 HP : %d\n\n",e_atk,bhp);

        if(bhp==0&&postion>0)

        {

            printf("고기를 먹겠습니까? (남은 수량 : %d)(YES : 1, NO : 0) :",postion);

            scanf("%d",&choose);

            if(choose==1)

            {

                bhp+=rand()%10+1;

                postion-=1;

            }

        }

        getchar();

        if(bhp==0)

        {

            printf("사냥에 실패하였습니다.\n보금자리로 돌아가 몸을 추스리십시오.\n");

            getchar();

            break;

        }

        else{

            printf("____________________나의 ____________________\n\n\n");

            getchar();

            e_hp-=atk;

            if(e_hp<0)

                e_hp=0;

            printf("야생 짐승에게 %d 데미지를 입혔다.\n남은 적의 HP : %d\n\n",atk,e_hp);

            getchar();

            if(e_hp==0)

            {

                if(boss>95){

                    g_exp=rand()%9000+100;

                }

                else

                    g_exp=rand()%100+100;

                printf("사냥에 성공하였습니다.\n획득 경험치 : %d",g_exp);

                getchar();

                EXP+=g_exp;

                break;

            }

        }

    }

}


void UPgrade(void)

{

    int meet;

    printf("_____________________ _____________________\n\n");

    printf("1. 할퀴기 : 1000EXP\n2. 물어뜯기 : 3000EXP\n3. 숨통끊기 : 5000EXP\n4 (Special) . 흉폭화 : 10000EXP\n\n");

    printf("5.  육체 : 1000EXP\n6. 질긴 가죽 : 3000EXP\n7. 강인함 : 5000EXP\n8 (Special) . 거대화 : 10000EXP\n9. 고기 : 75EX\n\n0. 나가기\n\n");

    printf("입력 : "); scanf("%d",&choose);

    switch(choose)

    {

        case 1: if(EXP>=1000) {EXP-=1000; atk+=5;} else printf("EXP 부족합니다. \n\n"); break;

        case 2: if(EXP>=3000) {EXP-=3000; atk+=17;} else printf("EXP 부족합니다. \n\n"); break;

        case 3: if(EXP>=5000) {EXP-=5000; atk+=33;} else printf("EXP 부족합니다. \n\n"); break;

        case 4: if(EXP>=10000) {EXP-=10000; atk*=2;} else printf("EXP 부족합니다. \n\n"); break;

        case 5: if(EXP>=1000) {EXP-=1000; hp+=15;} else printf("EXP 부족합니다. \n\n"); break;

        case 6: if(EXP>=3000) {EXP-=3000; hp+=50;} else printf("EXP 부족합니다. \n\n"); break;

        case 7: if(EXP>=5000) {EXP-=5000; hp+=100;} else printf("EXP 부족합니다. \n\n"); break;

        case 8: if(EXP>=10000) {EXP-=10000; hp*=2;} else printf("EXP 부족합니다. \n\n"); break;

        case 9: printf("\n 개를 구매하시 겠습니까? "); scanf("%d",&meet);

                if(postion+meet>20)

                    printf("최대 한도 개수를 초과 하였습니다. \n\n");

                else

                {

                    if(EXP>=75*meet)

                    {

                        postion+=meet; EXP-=75*meet;

                    }

                    else

                        printf("EXP 부족합니다. \n\n");

                } break;

        default:;

    }

}


void SELECT(void)

{

    while(1)

    {

        printf("_____________________ _____________________\n\n");

        printf("\n\n1. 사냥\n2. 업그레이드\n\nEXP : %d\nATK : %d\nHP : %d\n고기 개수 : %d\n\n선택 : ",EXP,atk,hp,postion);

        scanf("%d",&choose);

        if(choose==1)

            hunt();

        else if(choose==2)

            UPgrade();

        else

            printf("재선택");

    }

    

}


int main (void)

{

    char name[20];

    printf("PRESS ENTER\n\n");

    getchar();

    while(choose==0)

    {

        printf("캐릭터 명은 무엇입니까?\t");

        scanf("%s",name);

        printf("\n%s () 맞습니까? (Yes : 1, NO : 0)  ",name);

        scanf("%d",&choose);

    }

    printf("\n\n__________________GAME START__________________\n\n");

    SELECT();

    

    return 0;

 

}

'Programming > C' 카테고리의 다른 글

[ 선린 ] Pointer 과제  (0) 2015.08.31
함수 포인터  (0) 2015.08.27
[ Project ] Stack_Linked List  (0) 2015.08.27
연결 리스트 ( Linked List )  (0) 2015.08.27
구조체 ( Struct )  (0) 2015.08.27

프로젝트 명 : Stack_Linked List


< 프로젝트 설명 >


이 프로젝트는 스택과 Linked List를 같이 써서 구현한 프로젝트입니다.

이 프로젝트를 통해 스택과 Linked List가 어떻게 돌아가는 지 볼 수 있습니다.


< 소스코드 >


#include <stdio.h>


#include <stdlib.h>




typedef struct NODE


{

    

    int data;

    

}NODE;




NODE* node;


int length=0;


int range=0;




void RANGE(void);


void push(int n);


void pop(void);


void PRINT(void);




int main(void)


{

    

    int i;

    

    RANGE();

    

    for(i=0;i<20;i++)

        

    {

        

        push(i);

        

    }

    

    PRINT();

    

    for(i=0;i<=20;i++)

        

    {

        

        pop();

        

    }

    

    PRINT();

    

    

    

}




void push(int n)


{

    

    if(range<=length)

        

    {

        

        printf("OVER FLOW\n");

        

    }

    

    

    

    else

        

    {

        

        length++;

        

        node=(NODE*)realloc(node,sizeof(NODE)*length);

        

        node[length-1].data=n;

        

    }

    

}




void pop()


{

    

    if(length!=0)

        

    {

        

        length--;

        

        node=(NODE*)realloc(node,sizeof(NODE)*length);

        

    }

    

    else

        

        printf("EMPTY\n");

    

}




void PRINT (void)


{

    

    int i;

    

    for(i=0;i<length;i++)

        

        printf("%d 번째 출력 : %d\n",i+1,node[i]);

    

    printf("\n");

    

}




void RANGE(void)


{

    

    printf("STACK 크기는 몇으로 지정하시겠습니까? : ");

    

    scanf("%d",&range);

    

 

}

'Programming > C' 카테고리의 다른 글

함수 포인터  (0) 2015.08.27
[ Project ] Wild!  (0) 2015.08.27
연결 리스트 ( Linked List )  (0) 2015.08.27
구조체 ( Struct )  (0) 2015.08.27
Stack과 Queue  (0) 2015.08.26

연결 리스트란 각 노드가 데이터와 포인터를 가지고 한 줄로 연결되어 있는 방식이다.



Ⅰ. 연결 리스트의 구성 



연결 리스트는 노드로 이루어져 있다. 노드란 자료 하나를 담고있는 것을 말한다.


노드는 자기 자신의 값과 다음 노드를 가리키는 노드 포인터로 구성된다.

( 처음 부분의 노드를 Head 마지막 부분의 노드를 Tail 이라고 한다 )


아래 그림들의 연보라 색과 하늘색과 같이 각 노드는 값을 가지고 그 옆에 다음 노드로 가는 주소값을 가져 서로 연결되게 된다.( 연보라 부분이 값을 담는 부분, 하늘색 부분이 다음 노드로 넘어가는 주소 부분이다)


노드를 연결한 방법에 따라 단순 연결 리스트, 이중 연결 리스트, 원형 연결 리스트로 구분된다.



  ① 단순 연결 리스트



위의 그림과 같이 각 노드에 자료 공간과 한 개의 포인터 공간이 있고, 각 노드의 포인터는 다음 노드를 가리킨다.




② 이중 연결 리스트



위의 그림과 같이 단순 연결 리스트와 비슷하지만, 포인터 공간이  앞과 뒷 부분에 2개가 있어 

각각의 포인터는 앞의 노드와 뒤의 노드를 가리킨다.


③ 원형 연결 리스트 



위의 그림과 같이 일반적인 연결 리스트에 마지막 노드와 처음 노드를 연결시켜 원형으로 만든 구조 이다.




Ⅱ. 링크드 리스트 구현 


#include <stdio.h>

#include <stdlib.h>


typedef struct member

{

    char name[20];

    int age;

    struct node *NEXT;

}MEM;


int main(void)

{

    int nop=0,i;

    printf("사람은  명입니까? : ");

    scanf("%d",&nop);

    MEM* name=(MEM*)malloc(sizeof(MEM));

    MEM* age=(MEM*)malloc(sizeof(MEM));

    

    for(i=0;i<nop;i++)

    {

        printf("%d번째 사람의 이름은? : ",i+1);

        scanf("%s",name[i].name);

        printf("%d번째 사람의 나이는? : ",i+1);

        scanf("%d",&age->age);

        printf("\n\n\n이름 : %s\n나이: %d\n\n\n",name[i].name,age->age);

    }

 

}

'Programming > C' 카테고리의 다른 글

[ Project ] Wild!  (0) 2015.08.27
[ Project ] Stack_Linked List  (0) 2015.08.27
구조체 ( Struct )  (0) 2015.08.27
Stack과 Queue  (0) 2015.08.26
Call-by-value 와 Call-by-reference  (0) 2015.08.26
구조체 ( Struct ) Programming/C 2015. 8. 27. 10:10

구조체란 서로 관련있는 하나 이상의 변수들을 묶어 사용하는 것을 말합니다.

예를 들면 변수 중에 신원 정보를 파악할 수 있도록 이름, 나이, 성별등을 입력하는 변수들을 하나로

묶어 사용하는 것을 말합니다.

 


Ⅰ.  구조체 정의


 구조체를 정의 할때의 형식은 아래와 같은 형식으로 정의합니다.


struct identity{

    int age;

    char name[20];

    char gender[6];

};


identity란 구조체 명을 의미하고 안에 있는 변수들은 identity라는 구조체에 포함된 변수들입니다.

 



Ⅱ. 구조체의 선언



구조체를 선언하는 방식에는 여러가지의 방법들이 있습니다. 



struct identity{

    int age;

    char name[20];

    char gender[6];

} iden;




struct identity{

    int age;

    char name[20];

    char gender[6];

};

    struct identity iden;




struct identity{

    int age;

    char name[20];

    char gender[6];

};

typedef struct identity IDEN;

IDEN iden;




typedef struct identity{

    int age;

    char name[20];

    char gender[6];

}IDEN;

IDEN iden;



위와 같이 여러가지의 선언 방법이 있습니다.

③번과 ④번에 나온 typedef라는 것은 구조체 뿐만 아니라 다른 곳에서도 유용하게 널리쓰입니다.

 

typedef의 기능은 변수를 선언할 때 자료형의 이름을 사용자의 임의대로 바꿔줄 수 있습니다.

예를 들어 unsigned int * 와 같이 긴 자료형을 일일이 칠려면 귀찮기도 하고 불편합니다.

이때 typedef unsigned int* P_UNIT; 를 입력하여 unsigned int*을 P_UNIT로 

바꿔줄 수 있습니다. 


위와 같이 typedef를 사용하실 때에는 typedef (변경할 자료형)(변경후 자료형)형식으로 사용 합니다.





Ⅲ. 구조체 사용 


구조체를 사용할 때는 아래와 같이 사용 합니다.


#include <stdio.h>


struct identity{ // 구조체의 

    int age;

    char name[20];

    char gender[6];

} iden; // 구조체의 식별자


int main (void){

struct identity iden; // 구조체 변수의 선언

    printf("Name? : "); scanf("%s",iden.name); 

// 구조체를 사용할 때는 구조체 .변수  으로 사용

    printf("Age? : "); scanf("%d",&iden.age);

    printf("Gender? : "); scanf("%s",iden.gender);


 

}


의 주석에서의 설명과 같이 다른 함수내에서 사용하기 위해 구조체를 선언 해줍니다.

main 함수에서 iden.name 같은 형식은 구조체를 사용하기 위한 형식으로 (구조체 명.변수명)으로 

사용합니다.


★ 구조체를 사용하여 함수의 인자로 전달과 반환 대입연산은 가능하지만 사칙연산은 안됩니다. 




'Programming > C' 카테고리의 다른 글

[ Project ] Stack_Linked List  (0) 2015.08.27
연결 리스트 ( Linked List )  (0) 2015.08.27
Stack과 Queue  (0) 2015.08.26
Call-by-value 와 Call-by-reference  (0) 2015.08.26
2차원 배열  (0) 2015.08.26
Stack과 Queue Programming/C 2015. 8. 26. 23:41

Ⅰ. Stack


Stack 은 LIFO ( Last In First Out ) 으로 늦게 들어온 게 먼저 나오는 형태입니다. 

(Ex) 1, 2, 3 순으로 들어가면 3, 2, 1 순으로 나온다.


< 코드 설명 >

1. Stack 에서 데이터를 넣는 것을 푸시 ( Push ) , 빼내는 것을 팝 ( Pop ) 이라고 합니다. 

2. Top 이라는 위치에서 데이터의 입력과 출력이 일어납니다.


< Stack 예제 >




< 실행 결과 >





Ⅱ. Queue


Queue FIFO ( First In First Out )  으로 먼저 들어온 게 먼저 나오는 형태입니다.

(Ex) 1, 2, 3 순으로 들어가면 1, 2, 3 순으로 나온다.


Stack는 입력을 받는 곳에서 출력이 되지만 Queue 입력을 받는 곳과 출력을 하는 곳이 다르기 때문에 

Rear에서 입력이,  Front에서 출력이 됩니다.


< Queue 예제 > 



전에 만들어 놓은 코드의 Push() 함수 부분에 큰 오류가있어서 다시 만들었습니다..


< 출력 결과 >




구분하기 쉽게 " . " 으로 구분할 수 있게 하였습니다.


'Programming > C' 카테고리의 다른 글

연결 리스트 ( Linked List )  (0) 2015.08.27
구조체 ( Struct )  (0) 2015.08.27
Call-by-value 와 Call-by-reference  (0) 2015.08.26
2차원 배열  (0) 2015.08.26
동적 할당  (0) 2015.08.26

Ⅰ. Call-by-value

 

- 함수를 호출 할 때 단순히 값을 전달하는 형태의 함수호출


< 예제 >


#include <stdio.h>

void change(int n1, int n2){

    int temp= n1;

    n1=n2;

    n2=temp;

    printf("(After) Number 1 : %d, Number 2 : %d \n",n1,n2);

}

int main(void){

    int num1=10;

    int num2=20;

    printf("(Before) Number 1 : %d, Number 2 : %d \n",num1,num2);

    change(num1,num2);

    //printf("Number 1 : %d, Number 2 : %d \n",num1,num2);

    -> 사용시 num1과 num2가 바뀌지 않는다 (위에 함수를 int형으로 바꾼뒤 return n1,n2;)

    return 0;

 

}


< 출력결과 >


(Before) Number 1 : 10, Number 2 : 20 

 

(After) Number 1 : 20, Number 2 : 10



 

Ⅱ.Call-by-reference 


- 모리의 접근에 사용되는 주소 값을 전달하는 형태의 함수 호출 


< 예문 > 


#include <stdio.h>

void change(int *ptr1, int *ptr2){

    int temp = *ptr1;;

    *ptr1 = *ptr2;

    *ptr2 = temp;

}

int main(void){

    int num1=10;

    int num2=20;

    printf("Number 1 : %d, Number 2 : %d \n",num1,num2);

    change(&num1,&num2);

    printf("Number 1 : %d, Number 2 : %d \n",num1,num2);

    return 0;

 

}


< 출력 결과 >


Number 1 : 10, Number 2 : 20 

 

Number 1 : 20, Number 2 : 10 






sourced by "윤성우 열혈 C 프로그래밍 강의" 



'Programming > C' 카테고리의 다른 글

구조체 ( Struct )  (0) 2015.08.27
Stack과 Queue  (0) 2015.08.26
2차원 배열  (0) 2015.08.26
동적 할당  (0) 2015.08.26
[ Project ] Pascal  (0) 2015.08.26
2차원 배열 Programming/C 2015. 8. 26. 22:51

2차원 배열 

- 2차원 배열은 1차원 배열과는 다르게 첨자 2 개를 사용하는 배열이다. 같은 데이터형의 변수가 

  행( row )과 열( column )을 나타내는 데 , 첫 번째 첨자는 행을, 두 번째 첨자는 열을 나타낸다.




 Ⅰ. 행과 열

    

 1차원 배열에서는 변수이름 [ 열 ]로 표현했지만 , 2차원 배열에선 변수 이름 [행] [열] 로 표현한다. 옆에 그림과 같이 표현한다.       



Ⅱ.  2차원 배열의 크기


변수이름 [i:n][j:m] 의 크기는 i와 j 가 첫 번째 요소의 행과 열의 첨자이고, n과 m은 마지막 요소의 행과 열의 첨자이다. 

따라서, 배열의 크기를 구하는 공식은 ( n-i+1) x ( m-j+1) 이다.

 

 (ex) 위의 그림 처럼 첫 번째 요소의 행과 열은 [0][0]이므로 i 와 j 는 0이고, 마지막 요소의 행과 열은 [2][1]이므로 n은 2, 

        m은 1이다. 따라서 위의 그림의 배열의 크기는 (2-0+1) x (1-0+1) 으므로 3x2는 6이되어, 

        위 그림의 2차원 배열의 크기는 6이다.



Ⅲ. 2차원 배열의 저장 방식 


2배원 배열에는 행 중심 저장 방식과 열 중심 저장 방식이 있다. 행 중심 저장 방식은 1번째 행,

2번째 행 .. 순으로 저장하고 열 중심 저장 방식은 마찬가지로 1번째 열, 2번째 열.. 식으로 저장 한다.


[그림 7-7] 2차원 배열 요소의 주소

 

☞ 2차원 배열 arr[n][m]에서 첫 번째 요소의 행과 열의 첨자가 a이고 시작주소가 base, 요소의 크기가 size라고 할 때 ,

    arr[i][j]의 주소를 구하는 공식은 다음 과 같다


① 행 중심 저장 방식 

   arr[i][j] 의 주소 = base + (m x (j-a)) x size


② 열 중심 저장 방식 

   arr[i][j] 의 주소 = base + (n x (j-a)) x size


(ex) 위의 사진을 예로 들면 시작 주소는 200이고 각 요소의 크기는 4이니.. ▼


① 행 중심 저장 방식의 arr[2][0]

   200 + (2 x (2-0) + (0-0)) x 4 = 216


② 열 중심 저장 방식의 arr[2][0]

   200 + (3 x (0-0) + (2-0)) x 4 = 208


두 결과 모두 원하는 결과를 출력하고 있다.




                                                                                   sourced by "NAVER"

'Programming > C' 카테고리의 다른 글

Stack과 Queue  (0) 2015.08.26
Call-by-value 와 Call-by-reference  (0) 2015.08.26
동적 할당  (0) 2015.08.26
[ Project ] Pascal  (0) 2015.08.26
포인터 ( Pointer )  (0) 2015.06.14
동적 할당 Programming/C 2015. 8. 26. 12:51
동적 할당

- 컴파일을 실행하기 전에 메모리의 크기가 정해져 할당되어 있는 정적 할당과 달리 프로그램 실행 중에 
  메모리의 크기를  임의로 정할 수 있는 할당을 동적 할당이라 한다.
 
   ☞ 동적 할당을 쓰는 이유는 정적 함수를 쓸데보다 좀 더 효율 적으로 메모리를 활용 하기 위해서이다.

Ex) 1 ~ 100을 입력하는 배열에서는 크기를 100으로 줘야 하는데 그럼 20을 입력하면 80이 쓸데없게 된다. 
    이러한 메모리를 효율적으로 사용하기 위해 동적 할당을 사용한다.


I. 동적 할당에서 사용하는 함수
 
※아래의 함수를 사용하기 위해선 헤더파일에 #include <stdlib>를 선언해 주어야 한다. ( standard library의 약자 )

1. malloc 함수

- Memory Allocation의 약어로 "메모리 할당" 이라는 뜻이다. 메모리의 크기를 설정 하기 위해 사용 한다.

형식 : 포인터 변수명 = (자료형 *) malloc ( sizeof( 자료형 ))

2. calloc 함수 

- Clear Allocation의 약어로 "깔끔한 할당" 이라는 뜻이다. 메모리의 크기를 초기화 한 뒤 메모리의 
  크기를 설정 할 수 있다.

형식 : 포인터 변수명 = (자료형 *) calloc ( 메모리에 곱할 수, sizeof( 자료형 ))
 
Ex) num = (int *) calloc (5, sizeof(int))의 메모리의 크기는 5x(int의 자료형의 크기 4) 이니 20 이다.

3. realloc 함수

- Re Allocation의 약자로 "재할당"이라는 뜻이다. 동적 메모리 할당을 해제하지 않고 다시 설정하여 
  이어서 사용이 가능하다.

형식 : 포인터 변수명 = (자료형 *) realloc  ( 재설정할 변수 명 , sizeof( 자료형 ))


II. 동적 할당을 끝낼 땐..

- 동적 할당을 끝내고 싶을 땐 free (포인터 변수)를 입력하면 된다.



'Programming > C' 카테고리의 다른 글

Stack과 Queue  (0) 2015.08.26
Call-by-value 와 Call-by-reference  (0) 2015.08.26
2차원 배열  (0) 2015.08.26
[ Project ] Pascal  (0) 2015.08.26
포인터 ( Pointer )  (0) 2015.06.14