포인터 , 메모리 해제 (1),(2),포인터 연산
int val = 3 ;
이 변수를 선언할 때 저희가 어떤 식으로 변수를 선언을 했죠
먼저 이 변수에 사용될 변수의 데이터 형과 저희가 변수의 이름으로 사용할 변수의 기호
이름을 이 프로그래밍에 제공해주게 되면 이 프로그램들은 저희의 눈에는 보이지 않지만 그
값을 저장하기 위한 메모리를 대입하게 되고 그 위치를 내부적으로 추적할 수 있게 됩니다
그렇게 프로그램이 내부적으로 메모리를 대입한 공간이 저희들이 주소라고 부르는 공간입니다
16진수 표기가 메모리를 나타내는 가장 일반적인 방법이기 때문에 보통의 주소출력은 16진수
이 객체 지향 프로그래밍에 가장 큰 특징 중 하나는 컴파일 시간이 아닌 실행 시간에 어떠한
결정을 내릴 수 있다는 점입니다
시간인 컴파일 시간에 어떤 모든 것이 결정되는 게 아니라 코드가 실행돼서
돌아가고 있는시간 동안에 우리가 어떤 결정을 내릴 수 있는 게 객체지향 프로그래밍의 가장 큰 특징 중 하나
이 재례적 절차적 프로그래밍에서는 배열의 크기가 미리 결정되어야 배열을 사용할 수 있습니다
하지만 객체 지향 프로그래밍에서는 배열의 크기를 실행 시간에 결정할 수 있습니다
즉 다시 말하여서 재례적 절차적 프로그래밍에서는 배열의 크기가 컴파일 시간에 미리
결정되어야 하지만 객체 지향 프로그래밍에서는 실행시간, 즉 프로그램이 실행되고 있는 시간에 배열의 크기를 결정할 수 있다는 것입니다.
저희가 변수, 값이 변할 수 있는 변수로 배열의 크기를 결정할 수 있다는 말로도 해석할 수 있다.
변수 선언 과정을 잠깐 되짚어볼 때 프로그램은 저희가 변수를 선언하게 되면 내부적으로
메모리 라는 곳에 주소라는 공간으로 그 값을 저장한다.
포인터 사용할 주소에 이름을 붙인다.
즉, 포인터는 포인터의 이름이 주소를 나타낸다.
구형을 위해서는 간접값 연산자, 간접 참조 연산자
int *a; // c Style
int* a; // c++ Style
int* c,d ;
// c는 포인터 변수 , d는 int형 변수
#include <iostream>
using namespace std;
int main(){
int a = 6;
int* b;
b = &a;
cout << "a의 값 " << a << endl;
cout << "*b의 값 " << *b << endl;
cout << "a의 주소 " << &a << endl;
cout << "*b의 주소 " << b << endl;
*b = *b + 1;
cout << "이제 a의 값은 " << a << endl;
return 0
}
결론적으로 말해서 포인터에는 어떠한 정수를 대입하는 것이 아무런 의미가 없습니다
다만 제가 보여드렸던 예시처럼 어떤 변수의 주소를 대입함으로써 그 포인터를 이용해서
그 주소의 값에 변화를 주어서 그 값을 수정하게 하는 게 가능합니다
지금의 경우에는 이 포인터를 어떤 변수의 주소의 값으로 초기화한 경우가 됩니다
[포인터의 쓸모]
프로그램을 실행하는 동안에 이름이 없는 메모리 즉 아직 결정되지 않은 메모리를 대입할 수 있다 라는 그 점이 포인터의 진정한 쓸모입니다
그것이 바로 저희가 다음 시간에 살펴볼 New 연산자입니다.
'반도체 > C++' 카테고리의 다른 글
7. 공부목적 C++ 기록 new 연산자 (1) | 2024.07.17 |
---|---|
6. C++ 입력받기 (0) | 2024.07.17 |
4. 공부목적 C++ 포인터 (1) (0) | 2024.07.09 |
3. 공유목적 아닌 공부목적 C++ (0) | 2024.07.05 |
2. 백준 알고리즘에서 많이 쓰이는 C++ 기초 (0) | 2024.07.04 |