Review:포인터

Icarus<Wing>·2022년 10월 7일
0

포인터

  • 포인터란? ->데이터의 주소를 저장하기 위한 주소 변수

포인터의 활용도

  1. 데이터에 간접참조하기 위해 사용된다.
  2. 프로그램을 힙 메모리 영역에 사용하는데 쓰인다.
  3. 인터넷, 키보드, 모니터와 같은 외부의 메인 메모리 영역에 힙 메모리와 리소스들을 접근하는데 사용된다.
  4. 포인터는 또한 매개변수들을 전달하는데 사용된다.(swap함수를 떠올리면 알 수 있다)

주 메모리의 구조

  • 활성화 레코드(또는 스택 프레임):함수 상태를 기록하고 복원하기 위한 것으로써, 해당 함수의 리턴 값, 값 파라미터, 지역 변수, 귀환 주소 등의 정보가 기록
    • 즉, main함수내에서 변수를 선언하거나 함수를 호출할때마다 스택 프레임이 생성된다.
#include <iostream>
#include <stdio.h>

using namespace std;

int main()
{
	int a = 10;
	int* p;
	p = &a;

	printf("%x\n", p);
	printf("%x\n", &a);
	printf("%x\n", &p);
	printf("%d\n", *p);

	return 0;
}

  • printf("%x\n", p);printf("%x\n", &a);는 같은 주소값을 출력하는데, p는 a의 주소를 가리키기 때문이다.
  • 하지만, 포인터 변수도 자신의 주소값이 있기 때문에, printf("%x\n", &p);를 보면 위의 두 줄과 다른 주소값을 출력한다.
  • 데이터에 간접 참조하고 싶으면 '*' 역참조 연산자를 쓰자.

배열을 힙 영역(dynamic)에 메모리 할당하기

#include <iostream>
#include <stdlib.h>

using namespace std;

int main()
{
	int* p;
    int size;
    cin >> size
	p = (int*)malloc(sizeof(int) * size);
    //여기까지가 동적 메모리 할당
    
    for(int i = 0; i<size;i++){
    p[i] = i;	
    cout<<p[i]<<endl;
    } //for loop는 배열을 만들고 싶어서
    free(p);
    
    p = new int[5];
}

  • malloc함수를 사용하기 위해서는, 반환형 포인터와 할당하고자 하는 메모리 타입을 명시해야한다.
  • 기본적으로 void형 포인터를 반환하기 때문에, int형 메모리를 할당하고 싶으면 앞에 (int*)를 붙여서 casting하자
  • (sizeof(int)*size)를 한 이유는 입력된 size만큼 int형 메모리를 할당하고 싶어서다.
  • for loop를 돌리면 값을 연속적으로 대입해주기 때문에 배열이다.
  • c++에서는 p = new int[5];로 할당하고 delete [] p;로 메모리를 해제할 수 있다.(new,delete를 계속쓰기 귀찮아서 나중에는 STL의 vector를 사용한다)
profile
모든 코드에는 이유가 있기에 원인을 파악할 때까지 집요하게 탐구하는 것을 좋아합니다.

0개의 댓글