220831 C언어#9

김혜진·2022년 8월 31일
0

C언어

목록 보기
9/13

C언어 #9

포인터

포인터란 무엇인가

  • 우리가 알고 있는 변수 선언 시 메모리 구조
    메모리는 주소를 통해 메모리에 접근하여 값을 읽고 쓸 수 있다.

    문자형 1byte, 정수형 4byte, 실수형 8byte

  • 포인터의 개념
    포인터의 의미는 어느 특정 주소를 가리키거나 향하게 하고 있다는 뜻이다.
    주소 값을 가리킨다는 의미는 그 주소값을 가지고 있다는 의미이다.
    포인터란 메모리의 주소값을 가리키는 변수이다.

  • 포인터 선언 및 사용방법
    포인터 선언하기

char *pA;
int *pB;
doule *pC;

포인터 변수 선언 시에는 변수명 앞에 * 기호를 붙여주면 된다.
*표가 붙은 것은 주소 값만 저장하는 변수이다.

  • 포인터 사용방법
    &를 통해 변수의 주소값을 얻어올 수 있다.
int b = 100;
int *pB = &b;

b = 100
&b = 0x200(주소값)
*pb = 100
pB = 0x200

포인터 변수 pB가 변수 b를 가리킨다라고 한다.
포인터 변수에 바로 값을 대입X
& (주소연산자) 주소값을 나타냄
"b의 주소값을 *pB(주소값만 저장하는 변수)에 대입한다."

  • 다음은 예제의 포인터 메모리 구조를 표현한 것이다.

변수 pB는 주소값 0x01을 저장하고 있는 포인터 변수
이 주소값에 해당하는 메모리를 가진 변수는 int b
pB는 변수 b의 주소 및 실제 값을 참조 가능

포인터 연산

  • 포인터에 정수를 더하거나 뺄 수 있다.
    현재 포인터의 위치로부터 이동한 주소의 위치
#include<stdio.h>

int main(void) {
	char str[] = "Programming";
	char *ptr1;

	ptr1 = &str[0]; // 주소값 대입

	printf("%p\n", ptr1);
	printf("%p\n", ptr1 + 1);
	printf("%c\n", *(ptr1 + 1)); // 주소값의 실제값
	printf("%p\n", ptr1 + 3);
	printf("%c\n", *(ptr1 + 3));
}

출력결과
000000EDC7DDF678
000000EDC7DDF679
r
000000EDC7DDF67B
g

+1 : 단위요소를 나타냄
char + 1 : 다음요소 (1byte)
int + 1 : 다음요소 (4byte)
int + 3 이라면 12byte만큼 뒤의 요소 (3번째 요소)를 나타낸다.

처음 선언 될 때는 *이 주소값을 나타내지만 이후에 나오는 *은 실제값을 나타낸다. (*의 의미가 다르다)

● 문자형 변수 a, 정수형 변수 b 선언 후 문자형 포인터 변수 pA와 정수형 포인터 변수 pB를 선언한 후 a와 b의 주소값을 넘겨받는다. 이후 변수의 실제값을 출력

int main(void) {
	char a = 'F';
	int b = 5;
	char *pA = &a;
	int *pB = &b;

	printf("%c\n", *pA);
	printf("%d\n", *pB );
}

출력결과
F
5

*pA는 a의 주소값을 저장하게 된다.
그래서 pA를 출력하면 주소값이 나오고, *pA를 출력했을 때는 주소값의 실제값을 출력한다는 의미이다.

profile
알고 쓰자!

0개의 댓글