C언어의 꽃이라 하면 포인터입니다.
처음엔 이거 왜 쓰나 싶지만 익히면 포인터를 사랑하게 될 거예요.
문자열, 배열, 함수를 이해하는데 도움이 되고
그것들을 사용하는 폭을 넓혀주거든요.
한편 포인터를 처음 접하면 대부분의 반응은 이렇습니다.
"어렵다..."
어렵지 않아요~ 생소할 뿐입니다.
(물론, 포인터를 '잘' 쓰는 건 어렵습니다. ㅎㅎ;)
최대한 쉽게 설명해볼게요.
코드를 보시죠~
#include <stdio.h>
int main()
{
int numA = 10;
int *ptrA;
printf("numA주소: [%p]\n", &numA); // numA의 주소값: 0x7fff508979e8
printf("ptrA주소: [%p]\n", ptrA); // ptrA의 주소값: 0x7fff50897a08
ptrA = &numA; // 포인터 변수 ptrA에
// 정수형 변수 numA의 주소를 할당
printf("ptrA주소: [%p]\n", ptrA); // 0x7fff508979e8
// numA의 주소를 가리키고 있다.
printf("ptrA값: [%d]\n", *ptrA); // ptrA값: [10]
return 0;
}
보통 변수는 1, 10, 100이나 'A', "Hello, world!" 같이 자료형에 어울리는 값을 할당합니다.
이와 달리 포인터 변수는 주소를 저장합니다.
위 코드에서 ptrA는 numA의 주소를 가리키고 있습니다.
포인터가 가리키는 값은 * 애스터리스크 붙여 사용합니다.
ptrA를 출력하면 numA의 값, 즉 10이 출력됩니다.
#include <stdio.h>
int main()
{
int numA = 512;
char *ptrA = &numA;
printf("%c\n", *ptrA); // �
// char형 값을 넘어가니 정신을 못차리죠.
*ptrA = 65;
printf("numA: [%c]\n", numA); // numA: [A]
printf("ptrA: [%c]\n", *ptrA); // ptrA: [A]
return 0;
}
분명 ptrA의 값을 바꾸었는데 numA의 값까지 바뀐 것을 볼 수 있습니다.
이는 포인터가 값을 복사하는 것이 아니라 값을 참조하기 때문입니다.
보통 a = b 이런 식으로 변수에 변수를 할당하게 되면 a에 b 값을 복사해서 할당합니다.
값을 복사했기 때문에 추후에 a, b 값이 바뀐대도 서로에게 영향을 주지 않습니다.
그러나 포인터는 같은 주소의 값을 쓰기 때문에
값이 바뀌면 그 번지수를 찾는 모든 포인터의 값도 바뀝니다.
한 가지 주의할 점은 포인터는 자료형 크기만큼 값을 읽습니다.
그렇기 때문에 위에 코드처럼 사용하는 것은 위험합니다!
자, 아직 포인터가 무엇인지 감이 오지 않을 수도 있어요.
그렇다면 실생활에서 포인터와 유사한 것을 찾아봅시다.
필요한 건 윈도우 메모장 하나!
Hello, world!라는 텍스트 파일이 있습니다.
그 안에 내용은 Hello, world!
기존 파일을 복사했습니다.
복사본에 내용을 한 줄 추가했습니다.
복사본을 바꿔도 기존 파일의 내용은 바뀌지 않죠.
당연한 얘기죠~?
하지만 바로 가기를 만든다면?
그렇습니다.
바로 가기 파일의 내용을 변경하면
기존 Hello, world 파일이 변경됩니다.
저는 스크립트 언어로 프로그래밍을 시작했습니다.
이후에 C언어로 넘어온 케이스에요.
그래서 그런지 포인터 개념을 이해하는데 많이 헤맸던 기억이 나네요.
타입 따윈 개무시하며 자바스크립트를 써왔는데,
메모리 개념이 제대로 잡힐 리 없죠...
사실 돌이켜보면 포인터를 직접적으로 배울 필요는 없는 거 같아요.
컴퓨터 역사를 되짚어 보거나,
컴퓨터 구조를 배우다 보면,
메모리 개념이 저절로 잡힐 거라 생각하거든요.
여하튼 어떤 루트로 프로그래밍을 접하든
컴퓨터를 알아간다는 건 즐거운 일인 거 같아요. ^^
'공학 > 정보성' 카테고리의 다른 글
오라클 끄기 / 켜기 (0) | 2020.08.16 |
---|---|
데이터베이스 정규화 (0) | 2020.08.16 |
VIM 설정 및 기능 (0) | 2020.08.16 |
비주얼 스튜디오 권한상승 (설치 오류) (0) | 2020.08.16 |
C언어 구구단 만들기 (0) | 2020.08.16 |