반응형

구조체

- 하나 이상의 변수(포인터와 배열 포함)를 묶어서 새로운 사용자정의 자료형

- 실존하는 정보를 데이터화 하는 추상화 작업

  ※ class와의 차이점은 접근지시자를 사용하지 않을시 struct는 public, class는 private으로 설정된다.

//type 1
struct example
{
    int a;
    char arr[10];
};

void main()
{
    struct example exam = { 10, "test" };
    printf("%d, %s", exam.a, exam.arr);
    
    //결과 10, test
}

 

typedef 선언

- typedef는 기존의 자료형의 이름에 새 이름(별명)을 부여하는 것을 목적으로 선언된다.

  ※ typedef int INT : int의 또 다른 이름 INT를 부여.

//type 2
struct example
{
    int a;
    char arr[10];
};

typedef struct example Example;

//type 3
typedef struct example
{
    int a;
    char arr[10];
}Example;

void main()
{
    Example exam = { 10, "test" };
    printf("%d, %s", exam.a, exam.arr);
    
    //결과 10, test
}

  ※ type 2와 같이 구조체 선언 후 typedef로 지정하는 법과 type 3과 같이 선언과 동시에 지정하는 방법이 있다.

 

구조체 변수와 포인터

- 기존 포인터와 선언 형식 및 접근의 방법이 다르지 않다.

typedef struct example
{
    int a;
    char arr[10];
}Example;

void main()
{
    Example exam = { 10, "test" };
    Example* exptr = &exam;
	
    printf("%d, %s", (*exptr).a, (*exptr).arr);
    
    //결과 10, test
}

  ※ 접근을 위해 포인터 변수를 대상으로 *연산을 하는것은 동일하다. 다만 구조체 포인터이기 때문에 변수에 접근하기위해 .연산을 추가해야한다.

  ※ *연산과 .연산을 하나의 ->연산으로 대체가 가능하다.

typedef struct example
{
    int a;
    char arr[10];
}Example;

void main()
{
    Example exam = { 10, "test" };
    Example* exptr = &exam;
	
    printf("%d, %s", exptr->a, exptr->arr);
    
    //결과 10, test
}

 

반응형

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

C 중간 활용 : 학생 관리 시스템 만들기  (0) 2021.08.24
C 파일 입출력  (0) 2021.08.24
C 동적할당  (0) 2021.08.22
C 포인터, 배열  (0) 2021.08.22
반응형

포인터

- 포인터 : 주소값을 저장하기 위한 변수

- 포인터 size : 4byte(32bit), 8byte(64bit)

- 포인터형 : (자료형)* 변수명

   ※ 포인터형도 자료형 범주에 포함시키기도 한다.

   ※ *연산자의 위치는 상관없다.

   ※ 포인터에 형이 없으면 *연산을 통한 메모리 접근은 불가능하다.

- 포인터 변수의 자료형은 해당 주소의 자료형과 동일해야 한다.

- 포인터의 형이 존재하는 이유는 메모리 공간을 참조하는 기준이 된다.

  ※ int* ptr : 해당 변수에 저장되어있는 주소값으로 가서 sizeof(int)(4byte)를 읽어들여 정수로 해석한다.

- NULL 포인터 : 아무데도 가리키지 않는다.

   ※ int* ptr = 0 or NULL

 

#include<stdio.h>

void main()
{
    int a = 10;
    int* ptr = &a;
    
    //ptr은 주소값을 가지므로 ptr == &a
    printf("var a address : %p, pointer ptr value : %d", ptr, *ptr);
}

 


배열

- 배열의 이름은 포인터이다.

  ※ 단, 값을 바꿀 수 없는 '상수 형태의 포인터'이다.

  ※ 배열의 이름도 포인터이기 때문에 배열의 이름을 피연산자로 하는 *연산이 가능하다.

  포인터 변수 배열 이름
이름 유무
저장하는 값 주소 값 주소 값
주소 값 변경 가능한가? 가능(변수) 불가능(상수)

 

- 포인터 변수를 배열로 사용하기

#include<stdio.h>
#define MAX 3

void main()
{
    //포인터에 배열의 이름을 넣어 배열처럼 사용 가능
    int arr[3] = {0, 1, 2};
    int* ptr = arr or &arr[0];

    for(int i = 0; i < MAX; i++)
    {
        ptr[i] += 1;
        printf("%d", ptr[i]);
    }
    
    //결과 1 2 3
}

 

 

- 배열의 다른 표현방법

#include<stdio.h>
#define MAX 3

void main()
{
    int arr[3] = {0, 1, 2};
    int* ptr = arr or &arr[0];

    for(int i = 0; i < MAX; i++)
    {
        *(ptr + i) += 1;
        printf("%d", *(ptr + i));
    }
    
    //결과 1 2 3
}

  ※ int형 포인터를 대상으로 1을 증가시키면 4가 증가한다.

  ※ int 형 포인터를 대상으로 +-n => +-n * sizeof(int)

  ※ 결론 arr[i] == *(arr + i)

 

- 활용

#include<stdio.h>

//배열도 포인터이기 때문에 인수를 char str[]로 사용해도 무방하다.
void ConvertLowercase(char* str)
{
    for (int i = 0; str[i] != NULL; i++)
        if (str[i] >= 'A' && str[i] <= 'Z')
            str[i] += 32;
}

void main()
{
    char arr[3] = "AB";
    ConvertLowercase(arr);
    printf("%s", arr);
    
    //결과 ab
}

  ※ char 배열의 마지막은 NULL(\0)로 채워지므로 for문 조건문에 NULL을 사용할 수 있다.

 


포인터 배열

- 포인터 변수로 이뤄진, 주소 값의 저장이 가능한 배열을 가리킨다.

#include<stdio.h>
#define MAX 3

void main()
{
    int a = 10, b = 20, c = 30;
    int* arr[3] = {&a, &b, &c};

    for(int i = 0; i < MAX; i++)
        printf("%d", *arr[i]);
    
    //결과 10 20 30
}
반응형

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

C 중간 활용 : 학생 관리 시스템 만들기  (0) 2021.08.24
C 파일 입출력  (0) 2021.08.24
C 구조체, 구조체 포인터  (0) 2021.08.22
C 동적할당  (0) 2021.08.22

+ Recent posts