1. 포인터란?
1.1 포인터
- 포인터다.
- "가리킨다" 는 의미다. ( ☞ 메모리 공간)
- 메모리 주소를 저장하는 변수다.
#include <stdio.h>
void main()
{
int n = 100;
int* ptr_n = &n;
printf("%d\n", n); // 100 : int n 출력
printf("%d\n", *ptr_n); // 100 : ptr_n 역참조
}
1.2 포인터 관련 연산자
* | Asterisk, 애스터리스크 |
참조 연산자 | 주소 > 데이터 참조 |
& | Ampersand, 앰퍼센드 | 주소 연산자 | 메모리의 첫 Byte 주소 |
참조 연산자와, 주소 연산자다.
연산자다.
++ 연산자처럼, &, * 도 변수에 작용하는 연산자다.
#include <stdio.h>
void main()
{
int n = 100;
int* ptr_n = &n; // ++ 연산자처럼, &, * 도 변수에 작용하는 연산자다.
printf("%p\n", ptr_n);
int ck = ++n;
printf("%d\n", ck);
}
1.3 포인터 관련 자료형
int | int 데이터 자료형 | int 크기의 데이터를 의미한다. 4Byte 범위의 데이터를 저장 할 수 있다. |
int* | int 포인터 자료형 int 주소 자료형 |
메모리의 주소 값 데이터를 의미한다. 포인터 연산에서 int 크기만큼 연산한다. |
char | char 데이터 자료형 | char 크기의 데이터를 의미한다. 1Byte 범위의 데이터를 저장 할 수 있다. |
char* | char 포인터 자료형 char 주소 자료형 |
메모리의 주소 값 데이터를 의미한다. 포인터 연산에서 char 크기만큼 연산한다. |
포인터 연산은, 포인터 자료형에 따라 다르다.
- char* 1Byte 단위 연산
- int* 4Byte 단위 연산
1.4 포인터 크기
- 32bit에서 메모리의 주소는 4byte 크기를 가진다.
- 포인터(메모리 주소)는 4byte 크기를 가진다.
- 포인터 변수는 4byte 크기를 가진다.
- 64bit에서 메모리의 주소는 8byte 크기를 가진다.
- 포인터(메모리 주소)는 8byte 크기를 가진다.
- 포인터 변수는 8byte 크기를 가진다.
+ 메모리와 주소와 저장되는 참고 이미지 필요
② 포인터 관련 연산자의 논리 구조
num → & → 주소 → * → 데이터
(&num) → (* 주소) → 데이터
*(&num) → 데이터
*&num → 데이터
& 는 프로그래밍에서 AND, 즉 "같다"는 의미다.
&num 의미는, 변수와 같은 것, 즉 메모리 주소다.
* 는 가르킨다는 의미다.
주소가 가르키는 공간의 데이터를 의미한다.
#include <stdio.h>
void main()
{
//char c = 'a';
//printf("%I64d\n", sizeof(c));
//printf("%c\n", c);
//int n = 100;
//printf("%I64d\n", sizeof(n));
//printf("%d\n", n);
char c1 = 'A';
char c2 = 'B';
printf("%c\n", c1);
char* ptr = &c1;
printf(" c1 : %c\n", c1);
printf(" ptr : %p\n", ptr);
printf(" *ptr : %c\n", *ptr);
printf(" *(&c1) : %c\n", *(&c1));
printf(" *&c1 : %c\n", *&c1);
printf(" &c1 : %p\n", &c1);
printf(" (char*)&c1 : %p\n", (char*)&c1);
printf(" (char*)c1 : %p\n", (char*)c1); //16진수 포인터 형변환
printf(" (char*)c1 : %d\n", (int)c1);
printf("*(char*)&c1 : %c\n", *(char*)&c1);
printf(" *&c1 : %c\n", *&c1);
//printf("%x\n", (int)&c1);
//printf("%p\n", &c1);
//printf("%d\n", (int)&c1);
//printf("%d\n", (int)sizeof(&c1));
//printf("%p\n", &c2);
}