구조체 (struct)

: 서로 다른 종류의 변수들을 하나로 묶어서 새로운 자료형을 정의 하는 것

 

 

구조체 정의 ∙ 선언

  • 구조체 정의
// struct 구조체이름
struct phone{
	// 자료형 변수명;
	char name[10];
	int number;
	double sound;
}; // 꼭 세미콜론(;) 붙이기
  • 구조체 선언
int main(void){
	// struct 구조체이름 변수명;
	struct phone p;
	return 0;
}

typedef 키워드

: 이미 존재하는 타입에 새로운 이름을 붙일 때 사용

  • typedef 사용한 구조체 정의
// typedef struct (구조체이름)
typedef struct phone{
	// 자료형 변수명;
	char name[10];
	int number;
	double sound;
}PHONE; 
// 구조체의 새로운 이름;
// 꼭 세미콜론(;) 붙이기
구조체의 정의와 typedef 선언을 동시에 할 경우 구조체의 이름 생략 가능
  • typedef 사용한 구조체 선언
int main(void){
	// 구조체의새로운이름 변수명;
	PHONE p;
	return 0;
}

 

 

 

구조체 변수 초기화 ⋅ 멤버 접근

int main(void){
	struct phone p = {"jaksim", 3, 1.4};
	struct phone ph = {.name = "miskaj", .number = 0};
    
	printf("name : %s | num : %d | sound : %lf \n", p.name, p.number, p.sound);
	printf("name : %s | num : %d | sound : %lf \n", ph.name, ph.number, ph.sound);
    
	return 0;
}
name : jaksim | num : 3 | sound : 1.400000 
name : miskaj | num : 0 | sound : 0.000000 

 

변수 초기화

  1. struct phone p = {"jaksim", 3, 1.4}; 
    • struct 구조체이름 변수명 = {멤버변수1의 초깃값, 멤버변수2의 초깃값, ...}
    • 멤버 변수가 정의된 순서에 따라 차례대로 초깃값 설정
    • 초깃값 설정이 되지 않은 멤버 변수는 0으로 초기화
  2. struct phone ph = {.name = "miskaj", .number = 0};
    • struct 구조체이름 변수명 = {.멤버변수1이름 = 초깃값, .멤버변수2이름 = 초깃값 , ...}
    • 원하는 멤버 변수만 초깃값 설정
    • 멤버 변수가 정의된 순서와 초기화 순서는 아무런 상관 없음
    • 초깃값 설정이 되지 않은 멤버 변수는 0으로 초기화

멤버 변수 접근

  • p.name
    • 구조체변수이름.멤버변수이름 

 

 

구조체 배열 선언

int main(void){
	struct phone pArr[3] = {
		{"jaksim", 3, 1.4},
		{"three", 2, 2.4},
		{"day", 1, 3.4},
	};
    
	printf("name : %s | num : %d | sound : %lf \n", pArr[0].name, pArr[1].number, pArr[2].sound);
    
	return 0;
}
name : jaksim | num : 2 | sound : 3.400000

: 구조체 배열에서 각 배열 요소로 접근하는 방법과 일반 배열의 접근 방법은 동일

 

 

구조체를 가리키는 포인터

int main(void){
	struct phone p = {"jaksim", 3, 1.4};
	struct phone* ptr_p;
    
	ptr_p = &p;
    
	printf("name : %s | num : %d | sound : %lf \n", (*ptr_p).name, (*ptr_p).number, (*ptr_p).sound);
	printf("name : %s | num : %d | sound : %lf \n", ptr_p->name, ptr_p->number, ptr_p->sound);
    
	return 0;
}
name : jaksim | num : 3 | sound : 1.400000 
name : jaksim | num : 3 | sound : 1.400000

 

구조체 포인터 선언

  • struct phone* ptr_p; 
    • struct 구조체이름* 구조체포인터이름

포인터에 할당

  • ptr_p = &p;
    • 배열과는 달리 구조체 이름은 주소가 아님
      => 반드시 주소연산자(&)를 사용하여 포인터에 할당.

멤버 변수 접근

  1.  참조 연산자(*) 이용하는 방법 : (*ptr_p).name
    • (*구조체포인터).멤버변수이름
    • 참조 연산자(*) 사용시 멤버 연산자(.)보다 우선순위가 낮아 반드시 괄호()를 사용해야함
  2. 화살표 연산자(->)를 이용하는 방법 : ptr_p -> name
    • 구조체포인터 -> 멤버변수이름
    • 일반적으로 포인터 사용 시 화살표 연산자가 많이 사용됨.

출처: 

https://tcpschool.com/c/c_struct_pointer (강추) <<
https://studyc.tistory.com/23

https://dream-and-develop.tistory.com/10

https://dev-hyonie.tistory.com/49#dt01

https://dev-hyonie.tistory.com/47


 

오늘 백준 풀다가 이건 정리하고 싶어서 새벽에 급발진으로 자료 정리해서 작성해봄

포인터 정리 찐으로 할거임 ㄱㄷ..ㅎ

파이썬에 디렉터리랑 자바의 클래스참조(?) 요런 느낌이랑 비슷한 같다고 안함 느낌을 받음.
아마 C언어도 클래스 참조가 있지 않나

 

공부할거 드릅게 많음 ;; ㅋ

ㅂㅇ

C언어의 문자열 입력함수

  • 공백문자 = 띄워쓰기 = NULL = \0 
  • 줄바꿈 = 엔터 = \n

 

scanf("%s", str)

: scanf()함수로 문자열을 입력 시, 공백단위(\0) or 로 문자열 입력 받음 

#include<stdio.h>

int main(void) {
	char str[100];

	scanf("%s", str);
	printf("%s", str);

	return 0;
}

입력 : hello world!

출력 : hello

인덱스 0 1 2 3 4 5
str[] h e l l o \0
  • 한 단어만 저장 가능

 

gets(str)

: gets()함수로 문자열을 입력 시, 줄바꿈(\n) 단위로 문자열 입력 받음 (저장 시 \0로 저장)

#include<stdio.h>

int main(void) {
	char str[100];

	gets(str);
	printf("%s", str);

	return 0;
}

입력 : hello world!

출력 : hello world!

인덱스 0 1 2 3 4 5 6 7 8 9 10 11 12
str[] h e l l 0   w o r l d ! \0
  • 공백 ' ' 은 아스키코드 32로 배열에 저장
  • 한 문장을 저장 가능.

'언어 > C언어' 카테고리의 다른 글

C언어의 구조체 (struct)  (1) 2025.08.19
C언어의 세그멘테이션 오류 (Segmentation Fault)  (0) 2025.07.03
C언어의 자료형 (Data Type)  (1) 2025.07.02
C언어의 기본  (1) 2025.07.01

세그멘테이션 오류 (Segmentation Fault)

: 메모리에 접근하려고 할 때 허용되지 않는 메모리 영역을 접근하려고 시도할 때 발생하는 오류

  • 운영체제 수준에서 잘못된 메모리 접근을 막는 것

 

특징

  • C or C++에서 발생
    - 두 언어는 포인터와 배열을 사용하여 메모리에 직접적으로 접근할 수 있는 기능 제공
    ^ 메모리 관리를 프로그래머가 해야 함

 

발생 원인

  1. 잘못된 포인터 접근 : 포인터를 잘못 사용하여 유효하지 않은 메모리 주소에 접근하는 경우
    • null 포인터 접근
    • 존재하지 않는 메모리 영역 접근
  2. 메모리 범위 초과 접근 
    • 배열 인덱스 초과 
    • 할당 메모리 밖으로 접근 (백준 14581 내가 틀렸던 오류)
  3. read-only 메모리 영역에 쓰기 시도하는 경우
  4. 스택 오버플로우 : 스택 메모리를 너무 많이 사용해서 스택 영역을 벗어나는 경우

∴ 잘못된 메모리 접근 

 

 

출처:

https://velog.io/@ceusun0815/%EC%84%B8%EA%B7%B8%EB%A9%98%ED%85%8C%EC%9D%B4%EC%85%98-%EC%98%A4%EB%A5%98Segmentation-Fault%EB%9E%80-C%EC%96%B8%EC%96%B4

https://adnoctum.tistory.com/387

https://codingfriend.tistory.com/18


흠냐 흠냐

미루고 미뤘지만 이제 더 이상 미룰 수 없을 것 같다...ㅜㅎ

다음엔 무조건 포인터 정리를 해야겠다..!

'언어 > C언어' 카테고리의 다른 글

C언어의 구조체 (struct)  (1) 2025.08.19
C언어의 문자열 입력 함수 scanf(), gets()  (1) 2025.07.30
C언어의 자료형 (Data Type)  (1) 2025.07.02
C언어의 기본  (1) 2025.07.01

자료형 (Data Type) 

: 저장되는 데이터의 종류에 따른 형태

 

특징

  • 저장되는 값의 종류범위에 따라 다르게 표현
  • 메모리(RAM)에 데이터를 어떤 종류인지 지정해 주기 위해 존재
  • 사용할 데이터의 형태와 크기에 따라 적절한 자료형에 담아 사용 (메모리 낭비 최소)
  • 범위를 벗어날 경우 정상적인 작동 불가 (ex. char에 한글 넣기 / (한글 : 2byte))
  • 기본 자료형비표준 자료형으로 나뉨 (__ << 이렇게 시작하는 게 비표준 자료형)

 

기본 자료형 종류

    • 논리형 :  bool / true(참), false(거짓)  (stdbool.h 헤더 파일 추가, C99 표준)
    • 정수형 : signed, unsigned (부호 기준)  + short, int, long, longlong (범위 기준)
    • 문자형 : signed, unsigned (부호 기준)  + char
    • 실수형 : float, double, long double (범위, 정밀도) << 정수형과 달리 표현이 무한대 (부동소수점)
    • void : 데이터가 없다는 것을 의미 (매개 변수에 사용될 경우 : 반환 값이 없다를 의미)

 

 

 

  • signed : 부호 있음 (+,-)
    : 음수 표현 O 
  • unsigned : 부호 없음 (+)
    : 음수 표현 X / but signed의 양수 범위보다 2배 큰 양수를 표현가능
  • int : CPU의 데이터 처리 단위인 워드(Word)와 int의 워드의 크기와 동일  (32bit CPU 기준)
    - 메모리 제약이 없다면 short 보단 int가 연산이 더 빠름!
  • 부동소수점 : 소수점 위치를 고정시키지 않고 유동적으로 사용 (IEEE 754 표준)

 

서식 지정자

 

 

예시

#include <stdio.h> 
int main (void) 
{ 
	int a = 30; 
	float b = 3.14; 
	char c = 'A';
    
    return 0;
}
  • int a = a라는 변수에 10진 정수를 저장하기 위해 4byte의 메모리를 할당 >> 10진수에서 2진수로 변환되어 a에 저장

 

출처

https://m.blog.naver.com/yujuit/222990731631

https://ittrue.tistory.com/51

https://opentutorials.org/module/3921/23515

https://edu-coding.tistory.com/3

https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%8B%A4%EC%88%98-%ED%91%9C%ED%98%84%EB%B6%80%EB%8F%99-%EC%86%8C%EC%88%98%EC%A0%90-%EC%9B%90%EB%A6%AC-%ED%95%9C%EB%88%88%EC%97%90-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0#%EB%B6%80%EB%8F%99_%EC%86%8C%EC%88%98%EC%A0%90_%EB%B0%A9%EC%8B%9D

 


참고로 내가 공부하기 위해 내가 보고 싶은 것이랑 알고 싶은 것만 정리하는 것..!
1학년때 배웠던 거지만,, 한 번도 제대로 정리해 본 적도 없고,, 그냥 그렇구나 넘어갔는데
백준 1271번 C언어로 풀다가 계속 틀리길래 한 번 인터넷 쳐보니까 10^1000은 longlong으로도 표현 안된다길래... 엉???? 하면서 자료형 범위 찾아보다가 정리 겸 공부도 했네... 
ㅎ 10^1000이 이만큼 큰 줄 몰랐다 ㅎㅎㅅㅎㅎ 멍청했네 ㅎㅎ....

1271 번은 조금 나중에 익숙해지면 다시 풀어봐야징..ㅜㅜ!!

 

#include <stdio.h>
 
int main(void)
{
    int result;
    int num1, num2;
 
    printf("첫번째 정수를 입력하세요 : ");
    scanf("%d", &num1);
    printf("두번째 정수를 입력하세요 : ");
    scanf("%d", &num2);
 
    result = num1 + num2;
    printf("%d + %d = %d", num1, num2, result);
    return 0;
}
  1. # include <stdio.h>
  2. int main(void)
  3. printf()
  4. scanf()
  5. return 0;
  6. 기타

1. #include <stdio.h>

stdio.h = Standard Input/Output library

: 표준 입출력과 관련된 모든 내용들이 들어가 있는 표준 라이브러리

 

2. int main (void)

: C언어로 구현된 모든 프로그램은 반드시 main() 함수를 가지고 있어야 함

  • C 프로그램이 실행되면 컴퓨터는 제일 먼저 main() 함수를 찾아서 호출!!
  • 출력 형태 : int
  • 입력 형태 : void(형태가 없는 자료형)

 

3. printf()

: C언어의 표준 출력 함수 

#include <stdio.h>
 
int main(void)
{
    printf("안녕하세요?\n");
    printf("제 나이는 %d살입니다.\n", 21);
    return 0;
}
  • printf() 를 쓸 땐 stdio.h 필요
  • \n  : 줄 바
  • %d :  데이터를 10진수 형채로 출력 
  • \(백슬래쉬)를 print할라면 \\이렇게 하면 \ 하나만 나옴

(예시) 백준 1809

int main(void){
    printf("(___)\n(o o)____/\n @@      \\n  \ ____,/\n  //   //\n ^^   ^^");
}

int main(void){
    printf("(___)\n(o o)____/\n @@      \\\n  \ ____,/\n  //   //\n ^^   ^^");
}

 

4. scanf()

: C언어의 표준 입력 함수

#include <stdio.h>
 
int main(void)
{
    int num1;
    scanf("%d", &num1);
    return 0;
}

 

  • printf() 를 쓸 땐 stdio.h 필요
  • 입력된 데이터를 저장할 변수의 이름 앞에 &(주소 연산자)를 붙여야 함!!!!!! 
  • &(주소 연산자) : 변수의 메모리 주소를 의미

 

5. return 0;

: 프로그램 종료 상태를 알리는 용도로 사용

(0 = 정상적인 종료의 상황에서 전달하는 값)

 

6. 기타

1. 주석 

  • // : 한 줄 주석 
  • /* 1줄
    2줄 */ : 여러 줄 주석

2. 중괄호 

{} : 코드의 범위

 

3. 들여쓰기 

: 코드를 읽기 쉽도록 일정한 가격을 띄워 작성하는 방법

 

 

출처 : 

https://sejong-kr.libguides.com/c.php?g=942233&p=6822319

+ Recent posts