C언어 포인터의 기본 연산자 및 간단한 구분 예제

C언어 포인터는 다른 변수의 메모리 주소를 저장하는 주소 저장용 변수입니다. & 포인터 연산자는 변수명 앞에 붙을 경우 메모리 주소를 의미합니다. * 기호는 포인터 연산자 입니다.

C언어 포인터

포인터는 다른 변수의 주소값을 저장하는 주소 저장용 변수입니다. C언어에서 모든 변수는 변수명 이외에 메모리상의 주소를 가지고 있습니다.

c-pointer-1

포인터는 이 주소를 저장하는 또다른 변수입니다.

c-pointer-2

C언어 포인터 연산자 & : 메모리 주소

포인터 연산자 & 기호는 변수 앞에 붙을 경우 해당 변수의 메모리상의 주소를 의미합니다. 변수 a의 메모리상의 주소는 &a입니다.

#include<stdio.h>
void main() {
	int a = 1;

	printf("%p \n", &a); //a의 주소(&a)를 16진수(%p)로 출력합니다.

	printf("%d \n", a); //a의 변수값(1)을 정수값(%d)으로 출력합니다.
}

결과

&a00AFF8CC는 모두 변수 a의 메모리상 주소를 나타냅니다.

00AFF8CC
1

C언어 포인터 연산자 * : 포인터 변수 선언

포인터 연산자 * 기호는 변수 앞에 붙을 경우 해당 변수를 포인터 변수로 선언합니다.

int *p; //변수 p를 포인터 변수로 선언합니다.

포인터 변수에는 다른 변수의 주소값이 저장됩니다.

#include<stdio.h>
void main() {
	int a = 1;

	int *p; //변수 p를 포인터 변수로 선언합니다.
	p = &a; //포인터 변수 p에 변수 a의 주소(&a)를 대입합니다.

	printf("%p \n", &a); //변수 a의 주소(&a)를 16진수(%p)로 출력합니다.

	printf("%p \n", p); //포인터 변수 p에 들어있는 주소(&a)를 16진수(%p)로 출력합니다.
}

결과

010FFB14
010FFB14

* 연산자는 포인터 변수 선언 이외에도 변수에 들어있는 주소를 한 번더 클릭하는 역할을 합니다.

*p vs p

포인터 변수명이 p라고 할 때, *pp의 차이는 HTML 태그의 <a> 태그 주소와 비슷합니다.

<a href = "https://www.google.com">구글</a>

phttps://www.google.com 이라는 주소 문자 정보를 액면가 그대로 의미합니다.

*pp가 가지고 있는 https://www.google.com 주소를 클릭했을 때의 결과값인 실제 사이트를 의미합니다.

c-pointer-basic-1

*pp안에 들어 있는 값을 한 번 더 클릭(*) 한다고 생각하면 이해가 쉽습니다.

*p vs p 구분 연습

*p를 단순 출력해봅니다.

c-pointer-3

p안에 들어있는 주소(&a)를 클릭(*)하면 1이 나옵니다.

#include<stdio.h>
void main() {
	int a = 1;

	int *p; //변수 p를 포인터 변수로 선언합니다.
	p = &a; //포인터 변수 p에 변수 a의 주소(&a)를 삽입합니다.

	printf("%d", *p); //p에 들어있는 주소를 클릭(*)했을 때의 나오는 결과를 출력합니다.
}

결과

a = 1 이고, *p = 1 입니다.

1

*p에 상수 4를 대입해봅니다.

c-pointer-4

*p = &a --> 1 이므로, 4로 교체될 수 있습니다.

#include<stdio.h>
void main() {
	int a = 1;

	int *p; //변수 p를 포인터 변수로 선언합니다.
	p = &a; //포인터 변수 p에 변수 a의 주소(&a)를 삽입합니다.

	*p = 4; //p에 들어있는 값을 클릭(*)했을 때의 값에 4를 대입합니다.

	printf("%d", *p); //p에 들어있는 값을 클릭(*)했을 때의 나오는 결과를 출력합니다.
}

결과

4

*p에 주소를 대입해봅니다. *pp의 주소를 클릭했을 때의 변수값을 의미하므로 주소가 들어갈 수 없습니다.

#include<stdio.h>
void main() {
	int a = 3;

	int *p;
	*p = &a;

	printf("%p", *p);
}

결과

오류

p를 출력해봅니다.

c-pointer-5

포인터 변수 p에는 주소(&a)가 저장되어있으므로 변수(a)의 주소(&a)가 출력됩니다.

#include<stdio.h>
void main() {
	int a = 1;

	int *p; //변수 p를 포인터 변수로 선언합니다.
	p = &a; //포인터 변수 p에 변수 a의 주소(&a)를 삽입합니다.

	printf("%p", p); //p에 들어있는 주소(&a)를 16진수(%p)로 출력합니다.
}

여러 경우의 수에 익숙해지는 것이 중요합니다.

#include<stdio.h>
void main() {
	int a; //변수 a 선언
	a = 3; //변수값 3 대입

	int *p; //포인터 변수 p 선언
	p = &a; //포인터 변수 p에 주소 &a 대입

	printf("%p \n", p); //포인터 변수(p)에 들어있는 주소(&a) 를 16진수(%p)로 출력
	printf("%d \n", *p); //*p에 들어있는 주소(&a)를 클릭했을 때 결과를 출력
	printf("%d \n", a); //변수 a의 변수값을 출력
	printf("%p \n", &a); //변수 a의 주소(&a) 출력
	printf("%d \n", *&a); //변수 a의 주소(&a)에 들어있는 주소를 클릭했을 때 결과를 출력
	printf("%p \n", &p); //포인터 변수(p)에 들어있는 주소(&p)를 출력
}

결과

0115F964
3
3
0115F964
3
0115F958

포인터 NULL 초기화

포인터 변수의 주소값 대신 NULL 값을 삽입하면 0으로 초기화됩니다.

#include<stdio.h>
void main() {
	int a = 3;
	int *p;

	p = &a; //포인터 변수(p)에 주소(&a) 삽입
	p = NULL; //포인터 변수(p)에 주소 초기화(NULL)

	printf("%p", p);
}

결과

00000000

포인터 자료형의 일치

포인터 변수의 자료형은 저장할 주소의 변수 자료형과 일치해야 합니다.

#include<stdio.h>
void main() {
	int a = 3;
	char c = 'k';

	int *p;
	p = &c; //포인터 변수(p) 자료형은 정수형(int)인데, 문자형(char) 주소(&c)를 대입할 수 없습니다.
}

포인터 변수 p는 정수형(int)으로 설정했는데, 대입을 문자 자료형(char) c를 삽입할 수는 없습니다.