Company
교육 철학

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

포인터 타입 변수

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

“강의는 많은데, 왜 나는 아직도 코드를 못 짤까?”

혼자 공부하다 보면 누구나 이런 고민을 하게 됩니다.
강의는 다 들었지만 막상 손이 안 움직이고,
복습을 하려 해도 무엇을 다시 봐야 할지 모르겠고,
질문할 곳도 없고,
유튜브는 결국 정답을 따라 치는 것밖에 안 되는 것 같고.
문제는 ‘연습’이 빠졌기 때문입니다.
단순히 강의를 듣는 것만으로는 실력이 늘지 않습니다.
실제 문제를 풀고, 고민하고, 직접 구현해보는 시간이 반드시 필요합니다.

그래서, 얌얌코딩 코칭은 다릅니다.

그냥 가르치지 않습니다.
스스로 설계하고, 코딩할 수 있게 만듭니다.
얌얌코딩 코칭에서는 단순한 예제가 아닌,
스스로 문제를 분석하고 구현해야 하는 연습문제를 제공합니다.
이 연습문제들은 다음과 같은 역량을 키우기 위해 설계되어 있습니다:
문제를 스스로 쪼개고 설계하는 힘
다양한 조건을 만족시키는 실제 구현 능력
기능 단위가 아닌, 프로그램 단위로 사고하는 습관
마침내 자신의 힘으로 코드를 끝까지 작성하는 경험

지금 필요한 건 더 많은 강의가 아닙니다.

코드를 스스로 완성해 나가는 훈련,
그것이 지금 실력을 끌어올릴 가장 현실적인 방법입니다.
자세한 안내 보기: 프리미엄 코칭 안내 바로가기
또는 카카오톡 상담방: 얌얌코딩 상담방