< 포인터 >
1. 메모리 & 주소
- 프로그램에서 사용된 변수나 배열은 모두 메모리에 존재함
- 메모리의 각 자리에는 주소가 할당 됨
int a = 10;
int b = 20;
int c = 30;
int d = 40;
* 변수들이 선언된 선언된 순서대로 메모리에 쌓임
* 자료형 int는 4바이트임으로 메모리 주소가 4씩 벌어져있음
2. 포인터
- 메모리에 있는 데이터 주소를 가리킴
- 주소를 담는 그릇
- 포인터 초기화 방법
< 기본 형식 예시 >
방법 1
int a = 10;
int *ptr;
ptr = &a;
방법 2
int a = 10;
int *ptr = &a;
* 변수를 선언하고 포인터를 선언한뒤 그 포인터 변수에 초기화 해줌
* "&변수"는 변수의 주소를 알려줌
- 포인터 사용 방법
< 기본 형태 예시 >
int i = 10;
int *ptr;
ptr = &i; // 주소 100이라고 가정
cout << ptr; // i의 주소 출력 (100)
cout << *ptr; // i의 값이 출력 (10)
cout << i; // i의 값이 출력 (10)
cout << &i; // i의 주소 출력 (100)
int j = *ptr; // j에 *ptr의 값인 10이 들어감
*ptr = 50; // i의 값도 같이 50으로 변함
ptr = 70; // 에러발생 -> ptr은 주소임, 주소를 맘대로 70으로 바꿀 수 없음
* 포인터 선언문의 *(애스터리스크)와 포인터 실행문의 *(애스터리스크)는 다른 의미!
선언문의 * : 포인터 변수임을 알려줌
실행문의 * : 지정된 주소에 있는 값을 액세스(접근)할 수 있게 해주는 연산자, 실제 주소에 할당괸 값 출력
( = 참조 연산자)
* "*ptr"을 이용해서 i의 값을 바꿀 수 있음 -> 주소의 값을 바꾸기에 i또한 그 주소를 가리키기에 값이 같이 바뀜
* j에 *ptr을 넣으면 주소가 가르키고 있는 값인 10이 저장이 됨, j는 주소와 전혀 연관은 없음!
* ptr앞에 *가 없다면 주소임으로 값을 바꾸려고 했을 때 에러가 발생함
3. 포인터와 배열
< 기본 형태 예시 >
int arr[3] = { 1, 2, 3 };
int *ptr;
ptr = &arr[0]; // 배열의 주소는 배열의 시작 주소임
ptr = &arr; // 배열의 이름은 배열의 시작 주소임, 위 코드와 같은 의미
* 배열을 선언한 뒤, 포인터에 배열을 초기화 해줌
* 배열은 시작 주소를 넣어주면 배열의 나머지 항목들은 알아서 순차적으로 나열이 됨
* 배열의 시작 주소 "&arr[0]"과 "arr"은 같은 의미임
cout << prt; // ptr의 주소 / arr[0]의 주소, 100이라 가정
cout << *ptr; // arr[0]의 값 = 1
cout << ptr + 1; // arr[1]의 주소, 104
cout << *(ptr + 2); // arr[2]의 값 = 3
cout << *ptr + 1; // arr[0] + 1으로 해석되므로 1 + 1 = 2
cout << ptr[2]; // arr[2]가 출력됨 = 3
* 만약 arr[0]인 1이 100 번지 주소라면 arr[1]은 104 번지, arr[2]은 108 번지다 (int이므로 4)
* 포인터 ptr은 배열의 시작 주소를 받음, ptr에 +n을 하면 n+1번째 주소를 가리키게 됨
* 값을 출력할 때 ( )로 지정해주지 않으면 *가 붙어있는 ptr만 포인터로 읽어 arr[0]에 +1이 됨
* 만약 포인터 ptr을 배열처럼 다루면 *을 붙이지 않아도 그에 해당하는 값이 출력됨
< 함수 >
1. 함수란?
- 프로그램 소스 코드에서 일정한 동작을 수행하는 코드
- 호출을 통해서 코드를 실행시키고 리턴으로 값을 넘겨줌
- 같은 작업을 반복할 때 유용함 -> 코드를 일일이 치지않아도 함수만 부르면 됨
- main함수 밖에 함수를 선언함
< 기본 형태 >
반환값의데이터형식 함수이름 (인자 (필수는 아님)) {
실행할 코드
result 반환 값; // 없어도 됨
}
< 예시 - 두 수 더하기 >
int hap (int a, int b) {
int result = a, b;
cout << a << " + " << b << " = " << result;
return result;
}
result = hap(5, 10); // 함수 호출
// result는 함수안의 변수 result와 상관 없음
* 반환 값의 데이터 형식에는 return을 하는 데이터의 데이터 형식을 넣음, 만약 반환하지 않는다면 void 사용
* 함수이름은 대소문자를 구분해야하며 숫자로 시작하면 안 됨
* 인자는 함수를 호출할 때 받는 값
* return에는 함수를 호출한 곳에 반환해줄 값을 넣어줌
2. 지역변수 & 전역변수
- 지역변수 : 한정된 지역에서만 사용되는 변수
- 전역변수 : 프로그램 전체에서만 사용되는 변수
- 둘 중 지역변수를 먼저 따라야함 (우선순위)
< 예시 >
1. 전역변수만 선언
int a = 5;
int main () {
cout << a; // 5가 출력됨
}
2. 지역, 전역 둘다 선언
int a = 5;
int main() {
int a = 50;
cout << a; // 지역변수가 우선이므로 50출력
}
* main함수 안에서 선언된 지역변수 a는 다른 함수가 생겼을 때 다른 함수에서는 알지 못함
* 전역변수 a는 여러 함수가 생겨도 모든 함수에서 전역변수 a의 존재를 알고 같은 이름의 지역변수가 없다면 읽음
3. 매개변수 전달
- 값의 전달 : 값 자체를 함수의 인자로 넘겨줌
값을 전달한 곳에서는 아무 영향도 받지 않음
- 주소의 전달 : 주소를 함수의 인자로 넘겨줌
주소를 이용해 값을 바꾸므로, 값을 넘긴 곳의 값도 영향을 받음
< 예시 - 값의 전달 >
void test(int a) {
a = a + 1;
cout << a; // +1을 하여 11이 출력됨
}
void main(){
int a = 10;
test(a);
cout << a; // 함수에서 변한 값은 영향을 주지 않아 선언한대로 10이 출력됨
}
< 예시 - 주소의 전달 >
void test(int *a) {
*a = *a + 1;
cout << *a; // a에 +1이 되어 11이 출력됨
}
void main() {
int a = 10;
cout << a; // 함수로 넘겨주기 전이니 10이 출력됨
test(&a); // 주소로 넘겨주어야 함!!
cout << a; // 포인터로 주소값을 넘겨주어 함수에서 바뀐 값이 main함수의 변수에도 영향을 줌
}
* *a++;라고 명령하면 에러남
* 값의 전달은 정말 값만 전달하기 때문에 함수로 들어간 값은 더이상 main함수의 변수와 상관이 없음
* 주소의 전달은 주소를 전달하기 때문에 함수의 변수와 main함수의 변수가 서로 주소로 연결되어 있어 영향을 줌
* 주소의 전달을 할때 호출은 &a처럼 주소를 넘겨주어야 하고 인자로 받을 때는 *a로 받아야 함
< 참고 >
명품 C++ 프로그래밍 - 황기태
'Study > C++' 카테고리의 다른 글
[C++] 입출력, 연산자 (0) | 2020.08.02 |
---|---|
[C++] 클래스와 객체 & 객체 포인터 (1) | 2020.05.31 |
[C++] 클래스와 객체 (0) | 2020.05.24 |
[C++] 조건, 반복,배열 (0) | 2020.03.31 |
댓글