C언어 포인터는 다른 변수의 메모리 주소를 저장하는 주소 저장용 변수입니다. &
포인터 연산자는 변수명 앞에 붙을 경우 메모리 주소를 의미합니다. *
기호는 포인터 연산자 입니다.
C언어 포인터
포인터는 다른 변수의 주소값을 저장하는 주소 저장용 변수입니다. C언어에서 모든 변수는 변수명 이외에 메모리상의 주소를 가지고 있습니다.
포인터는 이 주소를 저장하는 또다른 변수입니다.
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)으로 출력합니다.
}
결과
&a
와 00AFF8CC
는 모두 변수 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
라고 할 때, *p
와 p
의 차이는 HTML 태그의 <a>
태그 주소와 비슷합니다.
<a href = "https://www.google.com">구글</a>
p
는 https://www.google.com
이라는 주소 문자 정보를 액면가 그대로 의미합니다.
*p
는 p
가 가지고 있는 https://www.google.com
주소를 클릭했을 때의 결과값인 실제 사이트를 의미합니다.
*p
는 p
안에 들어 있는 값을 한 번 더 클릭(*
) 한다고 생각하면 이해가 쉽습니다.
*p vs p 구분 연습
*p
를 단순 출력해봅니다.
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
를 대입해봅니다.
*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
에 주소를 대입해봅니다. *p
는 p
의 주소를 클릭했을 때의 변수값을 의미하므로 주소가 들어갈 수 없습니다.
#include<stdio.h>
void main() {
int a = 3;
int *p;
*p = &a;
printf("%p", *p);
}
결과
오류
p
를 출력해봅니다.
포인터 변수 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를 삽입할 수는 없습니다.