[정처기 필기] 「4」 | 프로그래밍 언어 활용 - (2.5) 포인터, 구조체

728x90

[정처기 필기] 4」 | 프로그래밍 언어 활용 - (2.5) 포인터, 구조체

「1」 소프트웨어 설계

「2」 소프트웨어 개발

「3」 데이터베이스 구축

> 「4」  프로그래밍 언어 활용

- 서버 프로그램 구현, > 프로그래밍 언어 활용, 응용 SW 기초 기술 활용

「5」  정보시스템 구축 관리

 

1 데이터 타입

2 변수

3 연산자

4 데이터 입 / 출력

5 제어문

6 반복문

7 배열과 문자열

> 8 포인터

> 9 구조체

10 Python의 기초

11 Python의 활용

12 스크립트 언어

13 라이브러리

14 예외 처리

8. 포인터

포인터와 포인터 변수

 

포인터변수의 주소, C언어에서는 주소를 제어할 수 있는 기능을 제공하는데 변수의 주소를 저장할 때 사용하는 변수포인터 변수라고 함

 

- 포인터 변수를 선언할 때는 자료형을 먼저 쓰고, 변수명을 앞에 간접연산자(*)를 붙임

- 포인터 변수에 주소를 저장하기 위해 변수의 주소를 알아낼 때 변수 앞에 번지연산자(&)를 붙임

- 포인터 변수에 간접연산자(*)를 붙이면 해당 포인트 변수가 가리키는 곳의 값을 말함

- 포인터 변수는 필요에 의해 동적으로 할당되는 메모리영역인 힙 영역에 접근하는 동적 변수

- 포인터 변수의 용도

  : 연결된 자료 구조를 구성

  : 동적으로 할당된 자료 구조를 지정

  : 배열을 인수로 전달

  : 문자열을 표현

  : 요소를 효율적으로 저장

  : 메모리에 직접 접근

 

ex)

a 변수에 100을 저장, a 변수의 주소를 포인터 변수 b에 기억시킴

 

    메모리
    주소  
       0              
a  ▷
   4      100  
  ↑       8              
  ↑      12             
 
b  ▷     50       4    

 

// a : 메모리의 4번지에 대한 이름, 변수의 주소는 4, 변수에 100이 기억되어 있음

// &a : a 변수의 주소, 4

// b : 포인터 변수, a 변수의 주소를 기억

// *b : b에 저장된 주소가 가리키는 곳의 값, 100, *b의 값을 변경하면 a의 값도 변경됨

 

포인터와 배열

 

배열을 포인터 변수에 저장한 후 포인터를 이용해 배열의 요소에 접근할 수 있음

 

- 배열 위치를 나타내는 첨자를 생략하고, 배열의 대표명만 지정하면 배열의 첫 번째 요소의 주소를 지정하는 것과 같음

- 배열 요소에 대한 주소를 지정할 때 일반 변수와 동일하게 & 연산자 사용

- 배열의 요소가 포인터인 포인터형 배열을 선언할 수 있음

 

ex)

int a[5], *b

// b = a : 배열의 대표명이므로 a 배열의 시작 주소인 a[0]의 주소를 b에 저장, &a처럼 입력하지 않음

// b = &a[0] : a 배열의 첫 번째 요소인 a[0]의 주소를 b에 저장,

// a[0] = *(a + 0), a[1] = *(a + 1), a[2] = *(a + 2), 정수형 자료의 크기가 4Byte이기 때문에 포인터 1 증가하면 물리적인 주소는 4Byte 증가, 문자형 자료의 크기는 1Byte이므로 1Byte씩 증가

9. 구조체

구조체의 개요

 

자료의 종류가 다른 변수의 모임, struct를 사용하여 정의

 

- int나 char같은 자료형을 하나 만드는 것을 의미

 

struct sawon {
  char name[10];
  char jikwi[10];
  int pay;
};

 

- struct : 구조체를 정의하는 예약어

- sawon : 구조체의 이름, 'sawon'이라는 자료형이 생긴 것

- 멤버 : 일반 변수를 선언하는 것과 동일하게 필요한 필드들을 임의로 선언

 

구조체 변수 선언

 

구조체를 사용하려면 먼저 정의한 구조체에 대한 변수를 선언해야 함

 

struct sawon ansan, *seuol;

 

- strcut : 구조체 변수를 선언하는 예약어

- sawon ansan : 정의한 구조체 sawon 자료형으로 변수를 선언하는 데 변수의 이름이 ansan

- *seuol : 구조체의 포인터 변수

 

구조체 멤버의 지정

 

모든 요소들이 개별적인 이름을 가지고 있으므로, 구조체 변수와 함께 멤버 이름을 지정

 

// '.'의 의한 지정 : 구조체 일반 변수를 이용하여 지정
ansan.name = "김한국";
ansan.jikwi = "대리";
ansan.pay = 4000000;

// '->'의 의한 지정 : 구조체 포인터 변수를 이용하여 지정
seoul->name = "홍길동";
seoul->jikwi = "과장";
seoul->pay = 5000000;

// 포인터 변수의 의한 지정 : *를 사용하여 지정
(*seoul).name = "홍길동";
(*ansan).jikwi = "과장";
(*ansan).pay = 5000000;

 

구조체의 활용

 

#include <stdio.h>
struct jsu {
  char nae[9];
  int os, db, hab, hhab;
};

int main() {
  struct jsu st[3] = { {"데이터1", 95, 88}, {"데이터2", 84, 91}, {"데이터3", 86, 75} };
  struct jsu *p;
  p = &st[0];
  (p + 1)->hab = (p + 1)->os + (p + 2)-> db;
  (p + 1)->hhab = (p + 1)->hab + p->os + p->db;
  printf("%d", (p + 1)->hab + (p + 1)->hhab);
}

 

// 구조체 jsu의 구조

 

  nae[0] nae[1] nae[2] ... nae[8]
char nae[9]                                             
int os                 
int db                 
int hab                 
int hhab                 

 

nae[9] os db hab hhab
9byte        
1byte 1byte 1byte 1byte 1byte 1byte 1byte 1byte 1byte 4byte 4byte 4byte 4byte
                                                                                                                    

 

// 구조체 jsu의 자료형으로 3개짜리 배열 st 선언

 

  char nae[9] int os int db int hab int hhab
st[0]  st[0].nae[0] ~ st[0].nae[8]   st[0].os   st[0].db   st[0].hab   st[0].hhab 
st[1]  st[1].nae[0] ~ st[1].nae[8]   st[1].os   st[1].db   st[1].hab   st[1].hhab 
st[2]  st[2].nae[0] ~ st[2].nae[8]   st[2].os   st[2].db   st[2].hab   st[2].hhab 

 

  char nae[9] int os int db int hab int hhab
st[0]  '데'   '이'   '터'    1    '\0'          95   88               
st[1]  '데'   '이'   '터'    2    '\0'          84   91               
st[2]  '데'   '이'   '터'    3    '\0'          86   75               

 

// 문자열 끝에 널문자(\0)가 추가로 저장, 영문, 숫자는 1Byte, 한글은 2Byte

// 구조체 jsu의 포인터 변수 p 선언

// p에 st 배열의 첫 번째 요소의 주소를 저장

 

  주소      
  0000      
  ...     nae        os  db hab hhab     nae       os  db hab hhab     nae       os  db hab hhab
p1000 1000 "데이터1"   95   88                 "데이터2"   84   91                  "데이터3"   86   75                 
    p p + 1 p + 2
    &st[0] &st[1] &st[2]
  ...      
  9999      

 

// p + 1이 가리키는 곳의 멤버 hab에 p + 1이 가리키는 곳의 멤버 os와 p + 2가 가리키는 곳의 멤버 db을 더한 후 저장

// st[1]의 hab에 84 + 75 = 159를 저장

// p + 1이 가리키는 곳의 멤버 hhab에 p + 1이 가리키는 곳의 멤버 hab과 p가 가리키는 곳의 멤버 os와 db을 더한 후 저장

// st[1]의 hhab에 95 + 88 = 342를 저장

// p + 1이 가리키는 곳의 멤버 hab와 hhab의 값을 더한 후 정수로 출력, 159 + 342 = 501

 

 

 

 

 

 

 

출처 | <시나공> 정보처리기사 필기 2024 기본서 (길벗알앤디)

728x90