개발 Study

#14. 포인터 (2) 및 배열

HYuk 2021. 4. 10. 00:37
728x90

#13. 포인터 (tistory.com)

#13. 포인터

#포인터 포인터도 변수의 일종이다. 다른 변수의 주소값을 저장할 수 있는 변수이다. 일반 변수 앞에 어드레스 연산자인 '&'를 붙이면 해당 변수의 주소가 표현된다. #include using namespace std; int main

hyukee.tistory.com

# 포인터에서의 const 사용법

포인터에서도 상수자료형인 const를 사용할 수 있다.

 

다만 위치에 따라 그 const가 미치는 영향이 조금 달라진다.

 

int* ptr = nullptr;

에서

const int* ptr = nullptr;

int* const ptr = nullptr;

 

둘의 const 위치가 의미하는것이 다르다.

 

첫번째, const int* ptr 은 *ptr의 값의 수정이 불가능하다.

즉, 해당 포인터 주소의 자료값 수정이 불가능 하다는 말이다.

 

두번째, int* const ptr 은 ptr값의 수정이 불가능 하다.

즉, 해당 포인터가 가지고 있는 주소값 수정이 불가능 하다는 말이다.

 

아래는 예시이다.

#include <iostream>

using namespace std;

void main()
{
	int a = 10, b = 20;
	const int* ptra = &a;
	int* const ptrb = &b;

	*ptra = b; // 불가능
	ptra = &b; // 가능

	*ptrb = a; // 가능
	ptrb = &a; // 불가능
}

 

 

# 이중포인터

이중포인터란 단순하게 포인터 안에 포인터를 쓴 것이다.

이중포인터를 만들때는 다음과 같이 사용한다.

자료형** 변수명;

int a=1; 의 값이 있고, 그것의 주소값을 가지고 있는 int* ptr=&a; 의 포인터가 있을때

이 주소값을 저장하는 데이터의 주소가 또 있을 것이다.

그것을 다시한번 가리키는 것을 이중포인터라고 한다.

 

아래는 예시이다.

#include <iostream>

using namespace std;

void main()
{
	int a = 10;
	int* ptr = &a; // a변수의 주소값을 가지고 있는 ptr
	int** pptr = &ptr; // ptr포인터변수의 주소값을 가지고 있는 pptr

	
	cout << "&ptr : " << &ptr << endl; // ptr의 주소값
	cout << "pptr : " << pptr << endl; // ptr의 주소값
	cout << "ptr : " << ptr << endl; // a주소값
	cout << "*pptr : " << *pptr << endl; // ptr주소값을 역참조 -> a주소값
	cout << "*ptr : " << *ptr << endl; // a주소값을 역참조 -> 변수a값
	cout << "**pptr : " << **pptr << endl; // ptr주소값을 역참조 -> a주소값을 역참조 -> 변수a값
}

 

 

-----------------------------------------------

 

#배열

배열은 변수를 여러개 한번에 만드는 방법이다.

자료형 변수명[갯수];

ex) int array[10];

 

이때 array 배열변수는 array[0] ~ array[9] 까지 할당된다.

 

배열값을 0으로 초기화 하고 싶을 경우

ex) int array[10]={};

 

배열값을 주고 싶을 경우

ex) int array[10] = {1,2,3,4,5,6};

이때 array[0] 부터 array[5] 까지는 순서대로 1,2,3,4,5,6이 초기화되지만 그뒤 변수는 0으로 초기화된다

예를들어 array[6]=0이 된다.

 

주의!

배열의 갯수를 정할  때, 변수는 쓸 수 없다.

다만 그 변수가 const 로 상수화 되있다면 사용 가능하다.

int i;
cin >> i;

int array[i]={};

-> 불가능

 

const int i=10;

int array[i]={};

-> 가능

 

#배열과 포인터

배열과 포인터는 유사점이 있다.

 

#include <iostream>

using namespace std;

void main()
{
	int array[5] = {1,2,3,4,5};
	cout << array << endl;
}

해당 코드를 출력해보면

 

 

 

배열의 주소값이 나온다.

*array을 사용해서 출력 해보면 1이 나오는데,

이 주소값은 첫번째 배열 즉, array[0]의 주소값임을 알 수 있다.

 

*(array+1)을 출력하면, 2가 나오고 *(array+2)를 출력하면 3이 나온다.

이는 array[n] = *(array+n) 이라는 말과 같다.

728x90