티스토리 뷰

* 포인터가 어렵게 느껴지는 이유

- 포인터 그 자체도 '변수(메모리)' 이기 때문

- 포인터 자체의 주소가 있고, 변수로서 저장된 주소도 있어서... 두 개의 주소가 공존하기 때문

- 대상에 대한 형식(설명)은 있으나, 개수는 없다. 대상의 유효성 확인이 없다

                              (포인터가 가리키는 자료형 데이터는 1개일수도 있고 연속된 여러개일 수도 있다)

- 개발자 스스로 잘 지켜라. 자유도는 높고 위험성은 높다


ex)

int aList[3] = {0}; 

int *pList = aList;

--- ------

 2     1


순서와 해석

1 ---> pList는 포인터다.

2 ---> 포인터 pList가 가리키는 대상은 자료형식 int이다.


ex)

int** *ppList = 0;

----- -------

  2      1


순서와 해석

1 ---> ppList는 포인터이다.

2 ---> 포인터 ppList가 가리키는 대상은 자료형식 int**이다.


-----------------------------------------------------------------------------------


ex)

char *apList[3] = { "Hello", "World", "Strin" };

------ --------

   2      1


순서와 해석

1 ---> 요소가 3개인 배열 apList가 있다.

2 ---> 요소형식은 char* 형식이다

char*

char*

char*

포인터이므로 주소가 저장될 것이고,

어딘가에 저장된, H 와 W 와 S 의 주소일 것임.


H

e

l

l

o

\0


W

o

r

l

d

\0


S

t

r

i

n

\0


-------------------------------------------------------------------------------------


* 주소연산과 간접지정연산은 서로 정반대 개념의 연산자 !

- 이 두 연산자가 괄호 안이나 밖에서 연속될 경우 무시 가능!

ex)

char* astrList[3]이 선언되었고,

&astrList[1]이 연산수행되었다면,

연산의 결과는 char** !


&astrList[1] ---> &*(astrList + 1)  ---> &* 상쇄 ---> astrList + 1

그리고 astrList의 자료형은 char* [3] 또는 char** 이므로, &astrList[1]의 자료형은 char** (??)


-------------------------------------------------------------------------------------

ex)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main(int argc, char* argv[])
{
 char ch = 'A';

 char *pData = &ch;       //char자료형 포인터변수 pData에는 ch변수의 주소

 char* *ppData = &pData;    // char포인터 자료형 포인터변수 ppData에는 pData변수의 주소

 char** *pppData = &ppData;    // char포인터의 포인터 자료형 포인터변수 pppData에는 ppData변수의 주소


 printf("%c\n", ch);          // char 변수 ch의 값을 찍으니 A
 printf("%c\n", *pData);      // pData 변수를 찾아 내용을 참조해서 그 주소의 값을 찍으니 A, pData변수값을 찍으면? ch주소
 printf("%c\n", **ppData);    // ppData 변수를 찾아 내용을 참조해서 그 주소값을 한번 더 참조해 가서 값을 찍으니 A, 

                                 // ppData변수값을 찍으면? pData주소
 printf("%c\n", ***pppData);  // pppData 변수를 찾아 내용을 참조해서 그 주소값을 한번 더 참조해 가서 또 한번 더 참조해 가서 찍으니 A, 

                                 // pppData변수값을 찍으면? ppData주소


 return 0;
}

---------------

결과)

A
A
A
A





댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함