Search

LV09 포인터 복습, 구조체 포인터 변수

포인터 타입 변수

숫자를 저장하고 싶다. 어떤 타입 -> int 타입 변수를 사용한다. 글자를 저장하고 싶다. → char 타입 변수를 사용한다. 주소 값을 저장할수 있는 타입을 포인터 타입 변수라고 한다.
int main() { //포인터 타입 복습 unsigned int addressNumber = 0; //주소는 숫자니까 사실 인트에 저장해도 상관이 없다. int a = 0; addressNumber = (unsigned int)&a; // 포인터 변수에 * 을찍어서 // 해당 주소에 위치(변수)로 이동할수 있다. // 또는 가르킨다 라고 한다. return 0; }
C++
복사
포인터 배열
int a, b, c; int* pArr[10] = { &a, &b, &c};
JavaScript
복사
구조체,클래스 타입의 변수도 결국 자료형이기 떄문에 포인터 타입으로 선언이 가능하다.
일반적으로 참조 연산자(*)는 포인터의 이름이나 주소 앞에 사용하여, 포인터에 가리키는 주소에 저장된 값을 반환합니다.
C언어에서 '*'기호는 사용하는 위치에 따라 다양한 용도로 사용됩니다.
이항 연산자로 사용하면 곱셈 연산으로 사용되며, 포인터의 선언 시나 메모리에 접근할 때도 사용됩니다.
다만 참조연산자는 *을 찍고 괄호를 치고 구조체이면 ,을 이용해 접근해야 하기 때문에 사용방법이
까다롭거나 또는 불편하다.
그래서 → 화살표 연산자로 편리하게 대체 사용이 가능하다.
// 구조체 포인터 선언 보자 struct Vector2 { int x; int y; }; Vector2 p1; Vector2* vp = &p1; (*vp).x = 100; (*vp).y = 100; //*(vp.x) = 200; // .연산자가 *연사자보다 우선순위가 높기 떄문에 // 제대로 구조체 변수에 접근할수 없다. // -> 포인터 연산자 (*vp).x = 100; vp->x = 100;
C++
복사
동적할당
동적 메모리 할당 또는 메모리 동적 할당은 컴퓨터 프로그래밍에서 실행 시간 동안 사용할 메모리 공간을 할당하는 것을 말한다. 사용이 끝나면 운영체제가 쓸 수 있도록 반납하고 다음에 요구가 오면 재 할당을 받을 수 있다. 이것은 프로그램이 실행하는 순간 프로그램이 사용할 메모리 크기를 고려하여 메모리의 할당이 이루어지는 정적 메모리 할당과 대조적이다.
동적으로 할당된 메모리 공간은 프로그래머가 명시적으로 해제하거나 쓰레기 수집이 일어나기 전까지 그대로 유지된다. C/C++와 같이 쓰레기 수집이 없는 언어의 경우, 동적 할당하면 사용자가 해제하기 전까지는 메모리 공간이 계속 유지된다. 동적 할당은 프로세스의 영역에서 할당하므로 프로세스가 종료되면 운영 체제에 메모리 리소스가 반납되므로 해제된다. 그러나 프로세스가 계속 실행될 때에는 동적할당 된 영역은 유지되므로 프로그램이 정해진 힙 영역의 크기를 넘는 메모리 할당을 요구하면 할당되지 않는다. 따라서 사용이 완료된 영역은 반납하는 것이 유리한데, 프로그래머가 함수를 사용해서 해제해야 한다.
동적 할당은 함수가 종료되거나 변수 영역을 벗어나면 자동으로 공간 해제가 이루어지는 스택을 사용한 자동 변수와 대조적이다. 프로세스의 정적 메모리 할당은 프로세스가 시작할 때 이미 정해진 메모리량으로 한정되어있기 때문에, 프로세스가 시작할 때부터 끝날 때까지 유지되는데 반해, 동적 할당은 프로세스의 실행 과정 중에 필요한 메모리를 운영체제에 요구해 할당받고 해제하는 것이 가능하다.
위에서 배운내용을 활용하기 위해서 다음과 같이
구조체 포인터 변수안에 같은 구조체의 주소를 저장할수 있는 포인터타입을 선언하여
각 객체를 연결시켜 보자.
int main() { //추가 확장이 매우 편리해진다. // 유지보수 편리성 struct Status { int hp; //int mp; }; Status stat; stat.hp = 100; //stat.mp = 100; struct Node { int data; Node* next; }; //구조체 변수 끼리 연결하기 Node* head; Node n1; Node n2; Node n3; head = &n1; n1.next = &n2; n2.next = &n3; n1.data = 1; n2.data = 2; n3.data = 3; std::cout << head->data; std::cout << head->next->data; std::cout << head->next->next->data; return 0; }
C++
복사

연습문제

이제부터는 많은 자료구조를 배우기 시작합니다.
대표적인 자료구조인 링크드리스트로 시작을 합니다.
이제, 구조체와 포인터를 활용하여 코딩 할 때가 되었습니다.
널가리키며
문제 1번
아래그림과 같이 구성되어 있는 변수들이 있습니다.
다음 소스코드를 copy해서 ㅁ 네모칸 에 알맞은 답을 적어 제출하세요.
(16진수는 대문자로 입력해주세요)
#include <iostream> using namespace std; int main() { cout << "0xB6" << endl; // a의 값 <--- 예시정답 cout << "0xㅁ" << endl; // k의 값 cout << "0xㅁ" << endl; // t의 값 cout << "0xㅁ" << endl; // c의 주소 cout << "0xㅁ" << endl; // *a cout << "ㅁ" << endl; // **p cout << "0xㅁ" << endl; // &k cout << "0xㅁ" << endl; //*p return 0; }
C++
복사
아침드라마 심슨
문제 2번
인기쟁이 심슨은 다섯명과 연애중입니다.
a ~ e 까지의 변수에 그녀들의 나이를 입력 받아주세요.
그리고 for문을 돌려
가장 '나이가 많은 사람' '어린 사람의 나이'를 찾아 출력해주세요.
simData는 포인터 배열이고, 각각 a, b, c, d, e 를 가리켜야 합니다.

입력 예제

35
72
40
25
120

출력 결과

MAX:120
MIN:25
내이름은 로버트
문제 3번
robot 구조체를 정의하고, 구제체 변수 robert를 만들어주세요.
이곳에 들어갈 숫자 2개와 문장 1개를 입력 받아주세요.
그리고 robert를 가르키는 포인터 1개를 만들어서 가리키도록 해주세요.
이제 포인터 p를 이용해서 a+b값과 문장t를 출력하세요.

입력 예제

3 5 super

출력 결과

8 super
간단한 링크드리스트 만들기
문제 4번
위와 같은 노드를 만들어주세요.
그리고 노드의 변수 3개 a, b, c 를 만들어 주세요.
이제 기호 -> 를 이용해서 다음과 같이 구성하고 값을 채워주세요
(입력과 출력은 없습니다)
심슨의 관계도
문제 5번
를 만들어 주세요.
심슨은 알고보니 피해자 였습니다.
그녀들은 심슨을 이용하고 있었습니다.
다음과 같은 관계 구조를 만들어주세요.
(입력과 출력은 없습니다)
swap 함수로 포인터 떠올리기
문제 6번
변수 a, b에다가 숫자를 입력 받으세요.
그리고 변수 a와 b의 주소를 보내 swap을 해주는 함수를 만들어서 swap 후 출력 해주세요.
ex)
입력: 3 5
출력: 5 3

입력 예제

3 5

출력 결과

5 3
중복을 찾아라
문제 7번
좌표 6개를 입력 받으세요.
이 좌표중 중복된 좌표가 있는지 없는지 존재여부를 출력 해주세요.
중복된 좌표가 있으면 "중복된좌표발견", 없으면 "중복없음"으로 출력
ex)
결과 : 중복된좌표발견

입력 예제

1 1
2 4
1 3
3 1
2 2
2 4

출력 결과

중복된좌표발견
원하는 범위의 값 반대로 출력하기
문제 8번
위 배열을 하드코딩해주세요.
숫자의 범위를 입력 받으세요(숫자 2개 입력)
그리고 이 범위의 값들을 반대로 돌려 출력해주는 프로그램을 만들어 주세요.
만약 3 5를 입력 받았다면
3번 index ~ 5번 index 사의 값만 반대로 돌려주세요.
아래 그림을 참고하여 프로그램을 만들어 주세요.
ex)
입력 : 3 5
출력: 3 5 5 1 9 6 2

입력 예제

3 5

출력 결과

3 5 5 1 9 6 2
철수와 영철이의 승부수
문제 9번
철수와 영철이는 3번의 게임을 하려고 합니다.
아래와 같이 승패의 모든 경우를 트리로 그려 보았습니다.
이 트리를 구현하여 철수가 영철이에게 3번의 게임에서 승리하고 패하는 모든 경우를 출력 해주세요.
HINT: OX로 구성된 path 전역배열을 이용해서 승패를 출력할 수 있습니다.

출력 결과

3승(승승승)
2승1패(승승패)
2승1패(승패승)
1승2패(승패패)
2승1패(패승승)
1승2패(패승패)
1승2패(패패승)
3패(패패패)
난 너를 택했다
문제 10번
한 문장을 입력받아 str 배열에 입력 받으세요.
index 숫자 4개를 입력 받아 data 배열에 저장하세요.
네 칸짜리 포인터 배열 ptrs를 만들고
str 배열 안에서 입력받은 index를 각각 가리켜주세요.
그리고 ptrs에서 가리키는 값들은 for문을 돌려 출력하세요.

입력 예제

BKABCDE
0 1 5 6

출력 결과

BKDE
단단한 성
문제 11번
아래 그림을 보고 규칙을 찾아내어 숫자성이
"안전한성"인지 "안전하지않은성" 인지 출력 해주는 프로그램을 만들어주세요.
ex)
아래는 안전하게 성이 쌓여져 있는 모습입니다.
각 숫자는 돌의 단단함을 나타내는 수치입니다.
그러나 만약, 숫자2 위에 숫자3이 올려져 있다면 이 성은 무너질 것 입니다.
아래의 배열을 하드코딩하여 안전한성인지 아닌지 판별하는 프로그램을 작성 해주세요.
결과 : 안전하지않은성

출력 결과

안전하지않은성