-
C언어 포인터개념 Self Study📝/C, C++ 2023. 7. 31. 16:11
1. 개요
- C언어를 시작하고 배움에 있어 C언어의 꽃은 포인터라는 얘기를 많이 들었다. 그러하여, 기초가 탄탄하여야 배움에 막힘이 없을거라 판단이 되었고 확실히 알고 넘어가보자
2.포인터
1Byte = 8 Bit
주소란?
프로그램 동작 시 컴퓨터는 여러 방들에 있는 데이터를 필요로 하게 된다. 따라서, 어떤 방에서 데이터를 가져올 지 구분하기 위해 각 방에 고유의 주소를 붙였다.
ex)아파트에서 집들 호수를 구분하는 것과 비슷
포인터란?
- 메모리 상에 위치한 특정한 데이터의 (시작)주소값을 보관하는 변수
포인터 정의
(포인터에 주소값이 저장되는 데이터의 형) * (포인터 이름);
&연산자
데이터 주소값을 알기 위해서는 &연산자를 사용한다.
=> &연산자는 오직 피연산자가 1개인 연산자이며, 단항 연산자 라고도 한다.
'&'기호는 앰퍼샌드라고 읽으며, 번지 연산자라고도 불린다.
*연산자(=Pointer)
주소값에서 해당 주소값에 대응되는 데이터를 가져오는 연산자
=> *연산자는 피연산자 2개에 작용할때만 곱셈 연산자로 해석이 되며 단항 연산자이다.
이름이나 주소 앞에 사용하며, 포인터에 가리키는 주소에 저장된 값을 반환한다.
ex)
int a; int *p; p = &a; *p = 4;
- *p = 4가 되는 방법은 p = &a여서 *(&a) = 4 // *,& 두개가 합침으로 &a인 주속밧에 대응되는 데이터를 가져온다는 말이 되어 4가 도출된다.
- 포인터 변수 p에 변수 a의 메모리주소를 저장하였다.
3. 포인터 활용
-포인터를 왜 사용하는지에 대해서 의문이 생길 타이밍이다. 왜냐하면 값을 직관적으로 보여주면 되는데 왜 주소값이고, *연산자, &연산자를 사용하는지에 대해서 알아보자
상수포인터
어떠한 데이터를 상수로 만들기 위해 *const 키워드를 붙여주면 된다.
*const : 데이터의 내용은 절대로 바뀔 수 없다.
상수란?
프로그래밍 상에서 프로그래머들의 실수를 줄여주고, 실수를 했다고 해도 실수를 잡아내는데 중요한 역할을 다하고 있다.
포인터의 덧셈
포인터에 덧셈과 뺄셈을 하였을때 해당 자료형에 맞는 사이즈만큼 계산이 된다.
char = 1Byte ,double = 8Byte, int = 4Byte
=>포인터로도 배열의 원소에 쉽게 접근이 가능하다.
포인터 끼리의 덧셈은 허용하지 않는다. 포인터끼리의 덧셈은 아무런 의미가 없을뿐더러 필요하지도 않다.
※배열은 배열이고 포인터는 포인터이다.
- C언어에서 arr[]라는 배열이 있을때 arr은 +연산자와 사용되기 떄문에 첫번째 원소를 가리키는 포인터로 변환된다.
ex) arr[3] == *(arr+3) >> 포인터 연산에서 1을 증가시킨다면 어차피 저장된 주소값에 1이 더해지는게 아니라 타입의 크기가 더해진다.
- sizeof와 주소값 연산자와 함께 사용할 때를 제외하면. 배열의 이름은 첫번째 원소를 가리킨다.
포인터 배열은 정말로 배열이고, 배열 포인터는 정말로 포인터이다.
포인터의 크기
포인터의 크기는 운영체제의 bit수에 따라 달라진다.
- 32비트 시스템의 포인터 변수의 크기: 4Byte
- 64비트 시스템의 포인터 변수의 크기: 8Byte
즉 32비트의 int*, double*, char* 의 크기는 모두 4바이트이고
64비트의 int*, double*, char*의 크기는 모두 8바이트이다.
포인터 크기원리
- 포인터 = 메모리 위치를 가리키기 위한 주소를 담는 변수
즉, 32비트 라면 CPU의 메모리 접근을 위한 주소가 32비트 만큼 가능하기 때문에 포인터도 32비트(4Byte)가 된다.반면, 64비트 라면 CPU의 메모리 접근을 위한 주소가 64비트 만큼 가능하기 때문에 포인터도 64비트(8Byte)가 된다.
정리
- (포인터 변수) = 메모리 주소
- & : 주소 연산자
- &(변수) = (변수)에 할당 된 메모리 주소
- *(포인터 변수) = 포인터가 가르키는 '메모리 주소'의 '메모리 값'
참조
'개념 Self Study📝 > C, C++' 카테고리의 다른 글
C++ 의 클래스 (0) 2023.08.03 C++ 참조자 및 짚고 갈 것 (2) 2023.08.02 구조체(Struct) (0) 2023.08.01 메모리 동적할당 (1) 2023.07.31 C/C++ 입출력은 무엇인가? (0) 2023.07.13