반응형

cp는 char형 메모리 주소를 가지고 있고 *cp는 메모리 값을 의미 (따라서, c = &c = *cp)

 

'&' 연산자

 - 이항 연산자 : 비트 논리 연산자 AND(c = a & b;)로 사용

 - 단항 연산자 : 변수 이름 앞의 주소 연산자(&c)로 사용

 

'*' 연산자

 - 자료형 선언 : 포인터 변수를 만들기 위한 연산자(char *cp;)로 사용

 - 메모리 값 표현 : 메모리 주소 앞에 사용하는 경우 메모리(값)을 의미하는 연산자(*cp)

 

 

*np는 int형 포인터 변수를 생성 *np는 메모리 값을 의미 (따라서, n = *&n = *np)

 

 

 

char형 포인터 cp(cffb01)를 사용하여 값에 접근 (*cp는 주소 cffb01의 1byte 메모리이므로 c에 문자 'B'를 저장)

 

 

 

int형 포인터 np(3bfd48)을 사용하여 값에 접근(*np는 주소는 3bfd48~3bfd4b까지의 4byte 메모리이므로 n에 30을 저장)

 

 

 

char형 2차원 포인터 cpp 선언

 

cp = &c; //1차원 포인터 변수 cp는 1차원 char형 메모리 주소 &c를 가지고 있고,

cpp = &cp; //2차원 포인터 변수 cpp는 2차원 char형 메모리 주소 &cp를 가진다. (4byte)

 

*cp = *&c = c //cp는 1차원 char형 주소이므로, *cp는 1byte 변수 c와 같은 메모리이고,

**cpp = **&cp = *cp //cpp는 2차원 char형 주소이므로, **cpp는 1byte 변수 c와 같은 메모리이다.

 

 

int형 2차원 포인터 npp 선언

 

np = &n; //1차원 포인터 변수 np는 1차원 int형 메모리 주소 &n를 가지고 있고,

npp = &np; //2차원 포인터 변수 npp는 2차원 int형 메모리 주소 &np를 가진다. (4byte)

 

*np = *&n = n //cp는 1차원 int형 주소이므로, *np는 4byte 변수 n와 같은 메모리이고,

**npp = **&np = *np //cpp는 2차원 int형 주소이므로, **npp는 4byte 변수 n와 같은 메모리이다.

 

 

int형 3차원 포인터 npp 선언

 

np는 int형 1차원 포인터 변수, npp는 2차원 포인터 변수, nppp는 3차원 포인터 변수이고,

*np, **np, ***npp는 모두 int형 변수 n과 같은 메모리 4byte이다.

 

Windows에서 단일 프로세스는 총 4GB 크기의 가상 메모리를 가질 수 있고,

주소는 00000000부터 FFFFFFFF(16진수)까지를 사용한다.

가장 큰 주소(0xFFFFFFFF)가 4byte를 넘지 않으므로, 포인터 변수(4byte)에 모든 주소를 저장 가능

 

 

char형 주소에 정수를 가산

 

cchar형 변수이고, &c1차원 char형 주소이고,

&cp2차원 char형 주소이고, &cpp3차원 char형 주소이다.

 

&c(b3fbc3)에 +1한 것은 char형(1byte)을 건너뛰겠다는 의미로 1이 증가(b3fbc4)하고,

&cp(b3fbc4)에 +1한 것은 char형 주소(4byte)를 건너뛰겠다는 의미로 4가 증가(b3fbc8)한다.

또한, &cpp(b3fbc8)에 +1한 것은 char형 주소(4byte)를 건너뛰겠다는 의미로 4가 증가(b3fbcc)한다.

 

그러므로 2차원 포인터 변수 이상에 +1을 하면 모두 4가 증가한다.

 

 

char형 포인터에 정수 가산

 

cchar형 변수이고, cp1차원 char형 주소, cpp2차원 char형 주소이다.

c(0x41)에 +1한 것은 정수 1을 가산하라는 의미로 1이 증가(0x42)하고,

cp(30fbe7)에 +1한 것은 char형(1byte)만큼 건너뛰겠다는 의미로 1이 증가(30fbe8)하고,

cpp(30fbd8)에 +1한 것은 char형 1차원 주소(4byte)만큼 건너뛰겠다는 의미로 4가 증가(30fbdc)한다.

 

 

int형 주소에 정수를 가산

 

n은 int형 변수이고, &n1차원 int형 주소이고,

&np2차원 int형 주소이고, &npp3차원 int형 주소이다.

 

&n+1한 것은 int형(4byte)을 건너뛰겠다는 의미로 4가 증가하고,

&np+1한 것은 int형 1차원 주소(4byte)을 건너뛰겠다는 의미로 4가 증가하고,

&npp+1한 것은 int형 2차원 주소(4byte)을 건너뛰겠다는 의미로 4가 증가한다.

 

 

int형 포인터에 정수를 가산

 

n int형 변수이고, np 1차원 int형 주소, npp 2차원 int형 주소이다.

n(0x14)에 +1한 것은 정수 1을 가산하라는 의미로 1이 증가(0x15)하고,

np(6ff700)에 +1한 것은 int형(4byte)만큼 건너뛰겠다는 의미로 4이 증가(6ff704)하고,

npp(6ff6f4)에 +1한 것은 int형 1차원 주소(4byte)만큼 건너뛰겠다는 의미로 4가 증가(6ff6f8)한다.

 

 

반응형

 

 

2장 내용 정리

- 포인터는 주소를 저장하기 위한 메모리 공간(변수)이다.

- 포인터의 크기는 모두 4byte이다.

- 2차원 포인터 변수는 포인터 변수는 1차원 포인터 변수의 주소를 저장하기 위한 메모리 공간(변수)이다.

- n차원 포인터 변수는 포인터 변수는 n-1차원 포인터 변수의 주소를 저장하기 위한 메모리 공간(변수)이다.

- n차원 포인터 변수는 *연산자를 n개 붙여 값(메모리 공간)에 접근한다.

 

 

*cp = *&c = c    //Z

*np = *&n = n   //100

 

 

char형 변수 c의 값과 char형 포인터 *cp 메모리(값) 사이즈는 1이고 char형 포인터 cp의 메모리 사이즈는 4이다. 

int형 변수 n의 값과 int형 포인터 *np 메모리(값) 사이즈는 4이고 int형 포인터 np의 메모리 사이즈는 4이다. 

 

 

 

 

 

 

[참고] 프리렉 - 열혈강의 C포인터 (공동환 저)

 

 

반응형

'cs > c-pointer' 카테고리의 다른 글

[열혈강의] 03. 배열  (0) 2022.01.24
[열혈강의] 01. 변수와 메모리  (0) 2022.01.06

+ Recent posts