목 차
안녕하세요.
오늘은 포인터에 대해 알아보도록 하겠습니다.
포인터
단순히 포인터라는 단어의 뜻만 보면, 무언가를 가리키는 것 정도의 의미가 되는데,
C언어에는 주소 값을 가리키기 위한 형식을 뜻하게 됩니다.
메모리 공간의 주소값을 가리킬 수 있기 때문에 동적 메모리 할당에 많은 이점을 가질 수 있게 됩니다.
형식
데이터타입* 포인터 변수명; 포인터 변수명 = &변수; *포인터 변수 = 변수; |
- 데이터 타입* 포인터 변수명;
데이터 타입에 "*"을 붙이면 포인터 변수가 됩니다.
메모리 공간은 타입에 상관없이 4바이트를 차지하게 됩니다.
- 포인터 변수명 = &변수;
변수에 주소라는 의미인 "&"를 변수 앞에 넣어서 포인터 변수에 주소 값을 대입할 수 있습니다.
- *포인터 변수 = 변수;
포인터 변수를 선언할 때는 "*"가 포인터 변수 타입이라는 것을 나타내지만 대입할 때에는 가리키는 값이라는 코드가 됩니다.
포인터 변수에 일반 변수 값을 대입하기 위해서는 포인트 변수 앞에 "*"를 넣어 변수를 대입합니다.
예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#include <stdio.h>
void main()
{
int* p;
int nNum = 5;
p = &nNum; // nNum의 주소값을 p에 저장합니다.
printf("*p = %d\n", *p); // p의 가르키는 값을 출력합니다.
printf("nNum = %d\n", nNum);// nNum 값을 출력합니다.
printf("==================\n");
*p = 10; // p가 가르키는 값 10으로 변경합니다.
printf("*p = %d\n", *p); // p의 가르키는 값을 출력합니다.
printf("nNum = %d\n", nNum);// nNum 값을 출력합니다.
printf("==================\n");
nNum = 15;
printf("*p = %d\n", *p); // p의 가르키는 값을 출력합니다.
printf("nNum = %d\n", nNum);// nNum 값을 출력합니다.
}
|
cs |
배열과 포인터
배열에 인덱스를 적지 않고 쓴다면 포인터변수와 마찬가지로 사용할 수 있게됩니다.
예제
1
2
3
4
5
6
7
8
9
10
|
#include <stdio.h>
void main()
{
int arrNum[5] = {1,2,3,4,5};
int i;
for ( i = 0; i < 5; i++ )
printf("%d\n", *(arrNum+i));
}
|
cs |
코딩 팁
보통은 포인터변수 초기값을 null(널)값으로 설정합니다.
짧은 코드에서는 상관이없지만, 코드가 많아지면 포인터 변수에 주소값을 대입하는걸 깜빡하게 될 수 있어서 체크하는 코드를 넣어야합니다.
다음과 같이 사용합니다.
1
2
3
|
int* pNum = null;
if(pNum != null)
*pNum = 5;
|
cs |
주소 값 변화를 확인하는 방법(VS 2019)
1. F5키 또는 메뉴 - 디버그 - 디버깅 시작을 누릅니다.
2. 메뉴 - 디버그 - 창 - 메모리 - 메모리 로 메모리 창을 엽니다.
다음과 같은 창이 생깁니다.
변수에 "&"를 앞에 넣어서(예를들면 "&nNum")를 주소에 넣고 엔터를 누릅니다.
그럼 해당 변수에 해당되는 주소로 이동합니다.
디버깅하면서 한스탭씩 넘어가는 것(F10)을 확인 합니다.
변수값이 변하면 주소에 해당하는 변수가 변경되는 것을 확인할 수 있습니다.
'개발공부 > C언어&C++' 카테고리의 다른 글
[C언어 강좌] 제 11강 구조체(struct) (0) | 2020.02.29 |
---|---|
[C언어 강좌] 제 10강 함수( function ) (0) | 2020.02.28 |
[C언어 강좌] 제 8강 반복문( for, while, do-while ) (0) | 2020.02.26 |
[C언어 강좌] 제 7강 조건문 (if, else if, else, switch, case, break) (0) | 2020.02.25 |
[C언어 강좌] 제 6강 연산자 ( 산술, 대입, 비교, 관계, 논리, 비트, 포인터, 조건) (0) | 2020.02.24 |