junl2038   3년 전

포인터가 주소값을 저장할수있는 변수라는건 누구나 알고있습니다..

하지만 일반적으로

int num;

int * pnum = 1

이 방법은 누구나 도식화 하여 생각할수있습니다

pnum이 가르키는 것은 num의 주소이다

그러면 *pnum을 이용해 역참조하여 num의 변수값을 알 수 도있다 까지는 이해가 됩니다.

int *pnum = 1; 할경우 에러가 발생하고요

하지만 제가 하나 이해가 안되는 부분이있습니다

배열로 갔을때 int *pnum[1] = 1;

인경우 입니다.

이경우

일반적인 int num[1] = 1; 과의 차이점이 존재할까요?

포인터는 항상 주소를 가르킨다라는 생각때문에 지금 여기서 완전 햇갈리고있습니다.


혼자 곰곰히 생각해봤는데

1. 컴파일러가 임의의 공간에 int형 값 1을 할당하고 그것을 포인터배열이 가르킨다.

2. 포인터배열변수 값이 주소가 아닌 1이다.


어떤게 맞다고 봐야하나요??

그리고 2번이라면.. 그냥 배열선언과 차이가 있을까요..

chogahui05   3년 전

어디서부터 어떻게 가르쳐야 할 지 모르겠네요.


데이터를 저장할 수 있는 공간에 붙여진 이름을 변수라고 하지요.

우리가 int a=3;

이렇게 선언을 하면, 변수 a를 위한 공간에다가, 3을 저장하게 됩니다.

그리고 a++;을 하게 되면

변수 a를 위한 공간에 있는 값을 얻어와서, 1을 더해줍니다. 그리고 그 결과를 다시 a가 저장되어 있는 공간에다가 덮어 씌웁니다.


이 두 연산을 하기 위해서 메모리의 특정한 공간 (주소)에 접근을 했네요. 여기까지는 이해가 되시나요?

chogahui05   3년 전

포인터 변수는 jun님이 말하시는 것 처럼 주솟값을 저장하기 위한 공간이 맞습니다.

주솟값을 통해서 메모리 공간에 접근하기 위해서는 필요하죠.


예를 들어서

int a=30; int *p=&a; (*p)++;

이 코드를 봅시다.


이건 a를 위한 공간을 생성하고요.

p라는 포인터 변수에 a를 위한 공간의 주솟값을 넣습니다. 

만약에 a의 주소가 100번지라고 하면 포인터 변수 p에는 100번지가 들어가게 되는 것이지요.

100번지에 있는 값인 30을 얻어와서, 거기에 1을 더합니다.

그리고 이 31을 100번지에 넣습니다.


int *pnum[1]; 이렇게 생성하고

pnum[1]=1; 이렇게 넣었다고 해 봅시다. pnum[1]은 int형 포인터 변수. 즉 주솟값을 저장하는 변수이기 때문에

이런 식으로 넣었다가는 컴파일 에러라던지 warning이 뜰 거고요..

보통 저런 식으로 잘 안 쓰죠.


일단 포인터 배열은

포인터. 즉 주솟값들을 저장하는 배열이라는 걸 먼저 생각해 봅시다.

junl2038   3년 전

답글감사합니다 간혹 문자형 배열을 만들때 포인터로 선언하면 메모리가 절약된다는 점때문에 int형도 동일하게 생각하고있었는데..

생각해보니 숫자는 의미가 달라지는 것 같네요..

chogahui05   3년 전

이렇게 선언하신 건가요??

char *a[3]={"maltize","dog","white"};

c에서는 가능하죠. 왜냐면 "maltize"는 문자열이고, 문자열은 char형 (상수) 포인터이기 때문입니다.


"maltize"라는 것은 어딘가에 저장이 되어 있을 텐데요. 리터럴이지요.

문자열을 미리 상수로 지정해 두고, 값을 불러올 때, 주솟값만 불러온다고 해야겠죠?


char a[20]="abcde"; 도 성립이 됩니다.

문자열 자체가 포인터이기 때문입니다.


a[1][1] = 'a';

이런 걸 수행하면 세그폴트가 뜹니다. wandbox에서는 뜨더라고요.

쓰기가 불가능한 영역에 저장되어 있는데, 값을 바꾸라고 하니까 이런 걸 뱉어내겠지요.


구글에 String Literal location이라는 키워드로 검색해 보세요. 

junl2038   3년 전

정말 감사합니다 덕분에 좀더 포인터 개념을 잡을 수 있게 된 것같습니다.

댓글을 작성하려면 로그인해야 합니다.