배열포인터참조

BS_Lee·2024년 4월 29일
0

C++

목록 보기
4/15

포인터 변수는 배열과 호환이 되기 때문에 자료형만 맞춰주면 그냥 대입해도 된다.

void main(void)
{
	int Ary[5] = {1, 2, 3, 4, 5};
	
	// 보통 일반 변수는 포인터에 값을 대입할 때, &를 넣어줘야 되자만 배열을 필요없음.
	// 첫 번째 원소를 가르킨다.
	int *p = Ary; // 그대로 대입
	
	for (int i=0; i < 5; i++){
		cout << *p << endl;
		
		// 다음 원소를 가리킴.
		p++;
	}
}

배열 포인터는 배열처럼 사용이 가능하다.

void main(void){
	int Ary[5] = {1, 2 ,3, 4, 5};
	int *p = Ary;
	
	for (int i=0; i < 5; i++){
		// 포인터를 배열처럼 사용 가능, p[i] == *(p+i)
		cout << p[i] << " ";
		// *(Ary + i) == Ary[i]
		cout << *(Ary + i) << endl;
	}
}

메모리 동적할당

void main(void) {
	int *p;
	
	// 동적 메모리 할당
	p = new int;
	*p = 5;
	cout << *p << endl;
	
	// 동적 메모리 해제
	delete p;
	
	// 메모리 동적할당
	p1 = new int[5];
	for(int i=0; i<5; i++){
		p1[i] = i + 1;
		cout << p1[i] << "";
	}
	// 배열로 할당받은 경우, 반드시 [] 사용해야된다.
	delete []p1;
}

참조 변수를 이용한 예제 코드

void main(void){
	
	int a;
	// b는 a와 동일한 위치에 참조를 하고 있는 것
	int &b = a;
	int &c = b;
	c = 5;
	
	int *p = &a;
	****int *q = p;
	*q = 7;
	
	int ary[3];
	int (&rAry)[3] = ary;
	rAry[1] = 3;
	
}
flowchart

B[B변수] --참조--> A[A의 주소]
C[C변수] --참조--> A[A의 주소]

P[p변수] --참조--> A[A의 주소]
Q[q변수] --> P[p변수] 

주소값에 a를 넣게되면, a의 주소 값이 들어가는게 아닌, a랑 같은 메모리에 위치한 곳을 참조하고 있다는 뜻이다. 그래서 c=5를 하게되면 a의 값도 똑같이 변하게된다.

이중포인터

  • 이중포인터는 잘 안쓴다고 한다.
#include <iostream>

int main() {
    // 이중 포인터 선언
    int **matrix;

    // 행과 열의 크기
    int rows = 3;
    int cols = 4;

    // 행의 크기만큼 포인터 배열 동적 할당
    matrix = new int*[rows];

    // 각 행마다 열의 크기만큼 메모리 동적 할당
    for (int i = 0; i < rows; ++i) {
        matrix[i] = new int[cols];
    }

    // 값 초기화
    int count = 1;
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            matrix[i][j] = count++;
        }
    }

    // 출력
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            std::cout << matrix[i][j] << " ";
        }
        std::cout << std::endl;
    }

    // 메모리 해제
    for (int i = 0; i < rows; ++i) {
        delete[] matrix[i];
    }
    // 배열 포인터는 마지막에 이런식으로 해제함.
    delete[] matrix;

    return 0;
}
profile
설명이 가능할 때까지 공부하기.

0개의 댓글