현재 방학인 틈을 타 알고리즘 마스터가 되기를 원했지만, 프로그램밍 실력은 그저 작은 지식들을 돌린다고 만들어지는게 아닌지라 일단 기초 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를 사용하는 방법
아무래도 괄호를 쓰는게 번거롭다 보니 최근에는 -> 연산자를 사용하는 방법을 자주 사용한다고 한다.
이후에도 공용체라던가 비트필드 구조체 등 여러가지 사용법이 나와있었으나 많은 내용도 아니고 필요하게되면 언제든지 다시 공부할 수 있다고 생각하기에 지금은 넘어가기로 했다.
마치면서 정말로 구조체 사용방법이 매우 흥미로웠고 빠른 시일 내에 이것을 프로그래밍 안에 사용할 수 있는 날이 왔으면 좋겠다!
'프로그래밍 > c언어' 카테고리의 다른 글
퀵소트를 이용한 구조체 정렬(아직임) (2) | 2022.11.14 |
---|---|
응용 프로그램 작성 (배열 차순 정렬) -c언어 (0) | 2022.07.27 |
파일 입출력 라이브러리 (0) | 2022.07.26 |
표준 입출력 함수와 문자열 함수(엔터키 무시, 외울 함수 많음) -C언어 (0) | 2022.07.25 |
표준 라이브러리의 선행 처리기 -C언어 (0) | 2022.07.13 |