728x90
포인터
포인터 변수란 메모리의 주소값을 지정하기 위한 변수이다.
1 2 3 4 5 6 7 8 9 10 | int main() { char ch1 = 'A'; char ch2 = 'Q'; int num = 100; ......... return 0; } | cs |
정수 100이 저장된 int 형 변수 num 을 선언하고 이 변수의 주소값 저장을 위한
포인터 변수 pnum을 선언한다. 그리고 나서 pnum에 num의 주소값을 저장한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | int main() { int num = 100; int *pnum; pnum = # cout << num << endl; cout << *pnum << endl; cout << pnum << endl; cout << &num << endl; return 0; } | cs |
int * 형 변수의 주소값을 저장하는 포인터 변수 선언
pnum 포인터 변수의 이름
pnum = # & 연산자는 오른쪽의 피연산자 주소값을 반환하는 연산자
포인터 변수는 무조건 주소값만 들어가야 한다.
상수가 들어갈 수 없다. ( 에러 처리됩니다. )
하지만 주소값을 직접 입력할 수 는 없기 때문에 주소값을 가져오는 & 기호를 통해 주소값을
얻어올 수 있다.
num 의 메모리 시작번지 : pnum
pnum의 메모리 시작번지 : &pnum
pnum가 가리키는 메모리 번지에 저장된 데이터 : *pt
포인터 연산자
포인터와 1차원 배열
배열의 이름
- 배열의 이름은 포인터이다. 단, 그 값을 바꿀 수 없는 '상수 형태의 포인터'이다.
- int 형 배열요소 간 주소값의 차는 4byte
포인터와 배열의 비교
포인터 변수와 배열의 이름은
이름이 존재하고 메모리의 주소값을 저장하는 것은 같지만
배열의 이름은 위에 말했듯이 주소값의 변경이 불가능하다.
포인터와 1차원 배열
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | int main() { int arr1[3] = { 1,2,3}; double arr2[3] = {1.1 , 2.2 , 3.3}; cout << *arr1 << " " << *arr2 << endl; *arr1 += 100; *arr2 += 120.5; cout << arr1[0] << " " << arr2[0] << endl; return 0; } | cs |
*arr1 의 값을 변경했을 경우 *arr 의 주소는 배열의 첫 번째 요소를 가리키기 때문에
arr[0] 값이 변경된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | int main() { int arr1[3] = { 11,22,33}; int *ptr = arr1; cout << *ptr << " " << *(ptr+1) << " " << *(ptr+2) << endl; ptr++; cout << *ptr << endl; ptr++; cout << *ptr << endl; ptr--; cout << *ptr << endl; return 0; } | cs |
result : 11 22 33
22
33
22
(ptr+1) = 배열의 요소를 포인터로 접근할때 사용된다.
ptr++ , ptr-- 로도 요소를 넘나 들며 접근할 수 있다.
포인터 연산의 결론
arr[i] == *(arr + i )
call by value
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | void swap(int px , int py); int main() { int x = 3, y = 7; cout << " x = " << x << " y = " << y << endl; swap(x, y); cout << " x = " << x << " y = " << y << endl; return 0; } void swap(int px, int py) { int temp; temp = px; px = py; py = temp; } | cs |
여기서 swap() 함수가 적용될까?
답은 아니다.
why?
전역변수로 전달된 변수가 함수안에서는 지역변수로 바뀌어 값이 바뀌지만
다시 전역변수로 나왔을 땐 값이 바뀌지 않는다.
그럼 위에 함수처럼 두 변수값을 변경하려면 어떻게 해야할까?
포인터를 사용하면 된다.
call by reference
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | void swap(int *px , int *py); int main() { int x = 3, y = 7; cout << " x = " << x << " y = " << y << endl; swap(x, y); cout << " x = " << x << " y = " << y << endl; return 0; } void swap(int *px, int *py) { int temp; temp = *px; *px = *py; *py = temp; } | cs |
이런식으로 포인터를 매개변수로 전달하면 함수안에서 포인터 매개변수의 주소값을 변경하기 때문에 함수 밖에 있는 전역변수들의 값을 함수 내에서 변경할 수 있다.
아파트를 보고 싶어하는 사람에게 아파트를 통째로 복사해 줄 수 없다면?
= > 아파트의 주소를 알려주면 된다.
매개변수가 전달될 때는 객체 자체가 직접 전달된다.
반응형
'C,C++' 카테고리의 다른 글
[C++]객체지향프로그래밍_변수의 범위 (0) | 2019.05.21 |
---|---|
[C++]객체지향 프로그래밍 _ 함수(1) (0) | 2019.05.20 |
[C#] Class 클래스 사용_Random 과 List (0) | 2019.04.11 |
[C,C++] 배열과 포인터 (0) | 2019.02.28 |
[C,C++] 이중 포인터 (0) | 2019.02.25 |