2021. 1. 6. 13:48ㆍ프로그래밍 공부/C 공부
포인터?
간접 주소 지정방식을 구현하기 위해 C에는 포인터라는 개념이 있음
포인터는 중간에서 메모리 주소를 할당해주는 기능을함
왜 포인터를 사용해야하나?
포인터는 다른 함수에 선언된 변수라도 메모리 주소를 읽거나 쓰면서 변경할 수 있어지므로 다양한 프로그래밍이 가능해진다.
포인터 사용법
#include <stdio.h>
int main()
{
short result;
// result 이라는 임의의 변수 선언.
short* ptr;
// *ptr 로 포인터 변수 생성, 포인터는 무조건 4바이트의 공간을 갖음.
//short은 포인터가 받은 데이터의 자료형을 결정함.
printf("포인터의 주소는 %p 입니다.\n", &ptr);
// 생성된 포인터의 위치를 파악함. ptr변수 앞에 &를 붙여서 자체 위치를 출력.
ptr = &result;
// 포인터를 통해 할당될 주소를 result의 메모리 주소로 지정함.
// ptr = &형태는 포인터 변수에 대상의 주소를 저장한다.
printf("result의 주소(%p)를 포인터의 자료를 받을 주소로 설정하였습니다.\n", ptr);
printf("포인터(%p)는 %p 위치를 가리키고있습니다.\n", &ptr, ptr);
*ptr = 0x12;
// 포인터를 통해 result변수에 값을 할당
// *ptr = 형태는 포인터가 가리키는 대상의 형태를 저장한다.
printf("result 변수에 0x%X(%d)를 입력했습니다.\n", result, result);
}
포인터와 const
포인터는 그 특성상 일반변수보다 실수할 확률이 높기 때문에 const 키워드를 활용하는 것이 좋다.
총 4가지 형태로 포인터를 선언할 수 있다.
(1) int *ptr = &addr : const가 없는 형태
(2) const int *ptr = &addr : 할당되는 자료에 const가 부여된 형태
(3) int *const ptr = &addr : 포인터가 가리키는 주소에 const가 부여된 형태
(4) const int *const ptr = &addr : 할당되는 자료와 포인터가 가리키는 주소에 const가 부여된 형태
2번과 3번의 경우를 알면 4번의 경우는 예측이 된다.
//.....
int addr = 5, tmp = 0;
//(2)번 const int *ptr
const int *ptr = &addr; // 주소 지정or변경 원활
*ptr = tmp; // 오류:데이터 변경 불가
//(3)번 int *const ptr
int *const ptr = &addr;
*ptr = tmp; // 데이터 변경 원활
*ptr = &tmp ; // 오류 : 주소 변경 불가
포인터 변수의 주소 연산
포인터에 저장된 주소값은 앞에 선언된 자료형 만큼의 공간을 차지한다. 이 공간을 어떤식으로 인식할까?
C언어는 항상 사용할 메모리 공간을 먼저 선언하므로 포인터는 '메모리 시작 주소만 기억'하면 자연스럽게 할당할 공간의 주소를 알 수 있다.
{ short data = 0;
short *p = &data;
// data변수에 할당된 메모리 주소의 시작점만 기억한다.
// 그뒤 자료형이 short이므로 해당 시작점에서 2바이트만 차지하면 된다.
*p = 3; }
만약 p++ 를 하면 어떻게 될까? p는 포인터 주소를 가지고 있기 때문에 포인터 주소 +1을 의미하는 것이 된다.
이는 주소를 한칸 이동시키라는 뜻으로 이 결과값은 자료형에 따라 달라진다.
* 하지만 이러한 연산에도 불구하고 &p1 의 값은 변하지 않는다.
#include <stdio.h>
int main()
{
char *p1 = (char *)100;
short *p2 = (short*)100;
int *p3 = (int*)100;
double *p4 = (double*)100;
printf("char 포인터가 갖고있는 값은 %p 입니다.\nshort 포인터가 갖고있는 값은 %p 입니다.\n", p1,p2);
p1++;
p2++;
printf("char 포인터가 갖고있는 값은 %p 입니다.\nshort 포인터가 갖고있는 값은 %p 입니다.\n", p1, p2);
}
'프로그래밍 공부 > C 공부' 카테고리의 다른 글
[C] void 포인터 (0) | 2021.01.06 |
---|---|
[C] 포인터 활용 (0) | 2021.01.06 |
[C] if 조건문 (0) | 2021.01.05 |
[C] 지역변수와 전역변수(+ extern, static, const) (0) | 2021.01.05 |
[C] 저장공간 할당 (0) | 2021.01.05 |