[정처기 필기] 「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 기본서 (길벗알앤디)
'💠기타 > 자격증' 카테고리의 다른 글
[정처기 필기] 「4」 | 프로그래밍 언어 활용 - (2.7) 스크립트 언어, 라이브러리, 예외 처리 (0) | 2024.02.16 |
---|---|
[정처기 필기] 「4」 | 프로그래밍 언어 활용 - (2.6) Python의 기초, 활용 (생략) (1) | 2024.02.15 |
[정처기 필기] 「4」 | 프로그래밍 언어 활용 - (2.4) 제어문, 반복문, 배열과 문자열 (생략) (0) | 2024.02.14 |
[정처기 필기] 「4」 | 프로그래밍 언어 활용 - (2.3) 데이터 입 / 출력 (2) | 2024.02.14 |
[정처기 필기] 「4」 | 프로그래밍 언어 활용 - (2.2) 연산자 (0) | 2024.02.13 |