프로그래밍/c언어

와! 구조체! 신세계! (짤막한 포인터) -C언어

량아이 2022. 7. 13. 16:07

현재 방학인 틈을 타 알고리즘 마스터가 되기를 원했지만, 프로그램밍 실력은 그저 작은 지식들을 돌린다고 만들어지는게 아닌지라 일단 기초 c 언어의 지식을 늘리기로 했다.

그래서 일단 가지고 있는 프로그램 교재를 한번 전체적으로 한 챕터씩 훑어보기로 했는데

이 전 챕터였던 포인터는 사용 방법을 잘 모르겠다.

 

포인터에 대해 이해한 내용이라곤 변수를 선언할때 앞에 *를 붙이고

ex) int *po, a=20;

      po=&a;

를 했을때

po = (a의 주소)

*po = 20

만약에 po++을 했을때

(a의 주소)+1이 되는게 아니라 int 메모리의 한칸의 용량인 +4되는것이다

이 이상은 포인터를 왜 사용하는지 이해가 잘 안되었다

 

그 이후에도 역경은 있었으니 바로 구조체였다.

처음 보는 문법에 도대체 이런것을 왜 사용하는 것일까 라는 생각이 들때쯤 굉장한것을 발견했으니

 

#include <stdio.h>
struct student{
    char name[10];
    char gender;
    int age;
};
int main (){
    struct student s1 = {"홍길동", 'm', 23}; //이부분이 진짜 유레카!
    struct student s2 = {"김가을", 'w', 20};
    
    printf("구조체 변수를 초기화하여 세 개의 필드를 출력하는 프로그램\n");
    printf("%8s %8s %8s\n","성명","성별","나이");//이렇게 쓸 수 있는거 몰랐다!!
    printf("-----------------------------\n");
    printf("%8s %6c %8d\n",s1.name,s1.gender,s1.age);
    printf("%8s %6c %8d\n",s2.name,s2.gender,s2.age);
}

위와같이 student라는 구조체를 선언해두면 main 안에 그저 

struct student (아무 구조체 이름) = {"홍길동", 'm', 23}; 

란 문장만 추가하게 되면 (구조체 명).(변수명)을 통해 언제든지 호출을 할 수 있고 이것을 배열처럼 여러개 선언할 수 있다는 것이다.

구조체 기본 사용

지금 당장 이것을 사용하여 프로그래밍을 만들일은 없겠지만 이런 데이터 저장방식은 너무 재미있고 마치 같이 공부하고 있는 sql을 사용하는것만 같았다.

 

거기에 저 코드 사이에 

s2 = s1;

를 대입하면?

구조체 대입

짜잔! 너무나도 간단하게 구조체를 복사를 할수 있다는게 흥미로웠다.

 

 

 

그 이후에도 위에 한번 비유했던대로 진짜로 배열처럼 사용할 수 있었으니

위의 코드에선 s1 과 s2를 따로 선언했었으나 이런식으로 배열로서 구조체 선언을 할 수 있었고 이런 새로운 방식은 반복문을 정말 좋아하는 나에게는 매우 흥미로웠다.

#include <stdio.h>
struct student{
    char name[10];
    char gender;
    int age;
};
int main (){
    struct student s1[3] = {{"홍길동", 'm', 23},{"김가을", 'w', 20},{"이겨례", 'm', 21}};
    int cnt;
    printf("구조체 배열을 사용하여 세 개의 필드를 출력하는 프로그램\n");
    printf("%6s \t%8s %8s %8s\n","순서","성명","성별","나이");
    printf("-----------------------------\n");
    for(cnt=0;cnt<3;cnt++){
        printf("%4d\t",cnt+1);
        printf("%8s %6c %6d\n",s1[cnt].name,s1[cnt].gender,s1[cnt].age);
    }
}

 

구조체 배열

 

 

구조체는 중첩도 할 수 있다.

여기까지도 이해하기 여렵지 않았으나. 

아직까지 이런 데이터를 사용하여 출력하는 문제를 풀었던 적이 없어서 그런가 실제로 사용하게 되면 좀 헷갈릴꺼같다.

#include <stdio.h>
struct first{
    int a,b;
};
struct second{
    struct first sa,sb; //first 구조체 변수 정의
};
int main(){
    struct second after;
    after.sa.a =10;
    after.sa.b =20;
    after.sb.a =30;
    after.sb.b =40;
    printf("중첩된 second 구조체 변수 after 출력\n");
    printf("after.sa.a의 값 ... [ %d ]\n",after.sa.a);
    printf("after.sa.b의 값 ... [ %d ]\n",after.sa.b);
    printf("after.sb.a의 값 ... [ %d ]\n",after.sb.a);
    printf("after.sb.b의 값 ... [ %d ]\n",after.sb.b);
}

 

 

 

 

구조체에는 포인터를 사용하는 것도 있었으나 역시 아직까지 포인터를 왜 사용하는가에 대해서는 의문이 풀리지 않았으니

여기서도 그냥 간단하게 사용법만 짚고 넘어갔다.

포인터 연산자와 변수를 사용하여 출력하는 방법은 두가지가 있는데

1. (*po).a 와 같이 변수를 사용하는 방법 괄호()는 꼭 붙여야 한다

2. po -> a를 사용하는 방법

아무래도 괄호를 쓰는게 번거롭다 보니 최근에는 -> 연산자를 사용하는 방법을 자주 사용한다고 한다.

 

 

이후에도 공용체라던가 비트필드 구조체 등 여러가지 사용법이 나와있었으나 많은 내용도 아니고 필요하게되면 언제든지 다시 공부할 수 있다고 생각하기에 지금은 넘어가기로 했다.

 

 

마치면서 정말로 구조체 사용방법이 매우 흥미로웠고 빠른 시일 내에 이것을 프로그래밍 안에 사용할 수 있는 날이 왔으면 좋겠다!