과학

조루년들아 몇개만 찍싸고 도망가냐 -5- (프로그래밍, C언어)

안녕하냐.

 

사실 지금쯤 되면 읽는 게이도 거의 없을것 같으니 포인터의 기초만 들어가고 땡치도록 하자.

 

 * 시작에 앞서, http://codepad.org/ 이곳에서 컴파일을 하도록 해.

예전과 달리 포인터 실습의 경우는 운영체제 비트..아씨ㅃ 귀찮음. 암튼 저기서 하셈 ㅇㅇ *

 

 

5. 포인터

     

      포인터란 무엇일까? 존나 고심을 해보는 새끼들도 있을거야.

 

      니네중에도 이런거 본 게이들도 있을거야.

 

      FFFFFFFFxFFFFFFFF

 

      게임중 오류가 발생하거나, 블루스크린이 뜨거나, 갑작스러운 윈도우상의 문제가 발생하거나 등등.. 한두번씩 뜨는 오류에 저런게 뜰때가 있을거야.

      일단 저것을 메모리공간 상의 주소라고 생각해두도록 해.

 

      설명을 들어가기 앞서, 한가지 말을 덧붙일게.

      지금 내가 하는 말은 100% 완벽한 설명이 아니야.

 

      그저 포인터에 대한 개념을 잡아주기 위해 쉽게쉽게 설명해 주는거지. 오케이?

      자 시작한다.

 

      우리가 코딩에 사용하는 소스들을 살펴보자

 

      int a=1와 같은 정수형 변수 선언도 있을거고,

      char ilove=U 와 같은 문자형 변수 선언도 있을거야.

 

      이때, 혹시 지역,전역변수를 배울때 들었던 '메모리 공간'에 대해서 기억하고 있어?

 

      지역변수는 그 함수 지역을 벗어나면 메모리 공간에서 사라진다.

      전역변수는 프로그램이 종료되면 메모리 공간에서 사라진다.

 

 

      여기서 가르키는 '메모리 공간'은, 엄청나게 넓고 수많은 쓰레기값으로 가득 차 있어.

      하지만, 사용자가 a=1; 이라고 선언을 했다면, 이 a는 1이라는 것을 '기억' 해야겠지?

      그러면 a=1는 메모리공간의 맨 처음으로 가. 왜냐면 메모리 공간은 저마다 1byte(바이트)씩의 공간과, 순서를 가지고 있기 때문이야.

 

      a = 1

 

      이는 '정수형' 변수의 선언이잖아?

      프로그래밍을 입문할 때 대부분 배웠을텐데, 인트형으로 선언하면 그에 할당되는 메모리 공간은 '4 바이트'야.

      그렇기에 1 바이트짜리 공간 네개를 할당받는거지.

 

 

1byte

1byte

1byte

1byte

                                             

      이렇게 할당받은 네개의 공간 중, 실질적으로 1이라는 값이 들어가는곳은 맨 처음 블럭 뿐이야.

 

1

1byte

1byte

1byte

 

      내가 말했었지? 메모리 공간은 저마다의 '공간'과 '순서'가 있다고.

      공간은 각자 가지고 있는 1byte 를 뜻하는것이고, 순서는 그 공간의 주소(address)를 뜻해.

      1번지, 2번지, 3번지, 4번지 하는 그 주소 말이야.

      이 주소값은, 메모리 공간에서는 16진수로 나타나게 돼.

 

                                                                                    0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - A(10) - B(11) - C(12) - D(13) - E(14) - F(15)

 

      요런 16진수 말야.

1

1byte

1byte

1byte

 

      즉, 이 바이트단위로 할당된 시끼들에게는 각자의 주소값이 이렇게 존재한단 소리.

 

1

0x00000000

1byte

0x00000001

1byte

0x00000002

1byte

0x00000003

 

      그렇다면, 0x00000000부터 0x00000003까지를 뭐라고 부를까?

 

      바로 a라고 불러.

 

      왜? 저 4바이트 자체가 정수형 변수로 선언된 a를 위해 할당된 메모리 공간이기 때문이니까.

 

      그렇다면, 이번엔 문자형 변수 b를 선언했다고 가정하자.

 

      short b=T

 

 

T

1byte

 

      문자형 변수를 short로 선언할 경우 할당되는 메모리는 2바이트잖아?

 

      그렇기에 1바이트 공간 2개가 만들어 진 것이고.

 

      그러면 이번에는 주소값이 어떻게 될까?

 

 

 

T

0x00000004

1byte

0x00000005

 

      0x00000004~0x00000005까지의 이름은 b가 되겠지?

      만약, 앞에 a=1이 없었다면 할당되는 메모리 공간의 주소값은

 

0x00000000

0x00000001 

 

      이 두개가 되었을거야.

      하지만, 이미 앞에 4바이트를 할당받은 정수형 변수가 있기에 할당되지 않은 주소값중 가장 낮은 곳을 배당받은거야. 

      마지막 표를 보고 다음으로 넘어가도록 하자.

 

1

0x00000000

1byte

0x00000001

1byte

0x00000002

1byte

0x00000003

T

0x00000004

1byte

0x00000005

 

*각 메모리 공간에는 16진수로 구성된 저마다의 주소(address)가이 존재한다.

*별다른 명령이 없으면 메모리 공간에서 맨 처음 주소값부터 시작되어 순서대로 할당된다.

*변수에 초기화 된 값은, 할당받은 메모리 공간의 맨 처음 주소값에 들어간다.

*할당받은 메모리 공간을 그 변수의 이름으로 칭한다.

*정수형인지 문자형인지 등 선언된 형태에 따라 할당받는 공간의 차이가 있다.

 

 

 

5-1 주소값

 

      그렇다면 정말 주소값이 존재하는가.

      정말 정해진 바이트만 할당이 되는가를 직접 확인시켜 주도록 할게.

 

      일단 메인함수의 선언까지 적어두자.

 

#include <stdio.h>

 

int main()

{

}

 

      정수형 변수 a와, 변수 b를 선언하여 각각 초기화 해주도록 하자.

 

      #include <stdio.h>

 

      int main()

      {

            int a=9;

            int b=8;

      }

 

      출력함수로 a의 값을 출력할 수 있게 한번 작성해 보자.

 

      #include <stdio.h>

 

      int main()

      {

            int a=9;

            int b=8;

            printf("a의 주소값은 %d",a);

      }

 

      그런데 말야.

      저렇게만 작성해두면 a의 주소값이 절대로 나오지 않아.

      그렇기에 a 앞에 &를 살포시 끼어넣어 주도록 해.

 

 

      #include <stdio.h>

 

      int main()

      {

            int a=9;

            int b=8;

            printf("a의 주소값은 %d",&a);

      }

 

 

      이후 바로 밑줄에 저 문장을 그대로 복사 + 붙여넣기 하여 b로만 수정해 줘. 

 

      #include <stdio.h>

 

      int main()

      {

            int a=9;

            int b=8;

            printf("a의 주소값은 %d",&a);

            printf("b의 주소값은 %d",&b);

      }

 

      프로그램이 종료될 수 있도록 return 0;과, 결과 확인의 수월함을 위해 getchar();또한 적어주자.

 

 

      #include <stdio.h>

 

      int main()

      {

            int a=9;

            int b=8;

            printf("a의 주소값은 %d",&a);

            printf("b의 주소값은 %d",&b);

      getchar();

      return 0;

      }

 

 

      이후 결과값을 계속 출력해보면, 어떤 경우에서도 두 주소값의 차이가 4씩 나게 될거야.

      이로써 주소값이 존재함과, 정해진 비트씩 할당된다는 사실을 알게 되었어. 존나힘드네 시팔

 

      여기서 사용하는 &변수는, 쉽게 이해하고자 하면

 

      하나의 '방과 방문'이라고 생각하면 돼.

 

      & = 방문. 방문(변수)에 적혀 있는 101호,102호 하는 호수(주소값) 를 읽는 것.

 

      즉, &a라고 하면, a의 방문(변수 a의 주소값)을 읽으라는 뜻이라는 소리지.

 

      오케?

 

 

 

 

5.2포인터의 사용

 

      와아! 시팔 드디어 포인터당!

 

      5.포인터 에서 포인터에 대한 개념은 없고 다른 설명만 줄창 있었지?

      그 이유는 간단해. 위 5.1에 대해 이해하지 못한다면 포인터에 대해 설명 또한 들을 필요가 읎거든.

 

      내가 방금 전에 &를 방문이라고 이해하라 했었지?

 

      포인터란, 방을 가르키는 안내판이다. 라고 이해하면 돼.

 

      어디서는 포인터 = 주소값 이라고 가르치는 곳이 있는데, 실제론 상당히 틀린 말이야.

 

      일단 소스를 한번 툭 던져주고 설명해줄게.

 

      #include <stdio.h>

 

      int main()

      {

            int a=9;
            int *b=&a;

            printf("a의 주소 값은 %d",b);
            printf("a이 가진 수는 %d",*b);

      getchar();

      return 0;

      }

 

      못보던 게 생겼지?

 

      바로 int *b=&a;야.

 

      이것이 바로 포인터의 사용법이며, 앞에 있는 *b이 바로 포인터라고 부르는 놈이야.

 

      읽는 것 또한, 포인터 b는 a이다. 라고 읽는게 아니라, 포인터 b는 a라는 방을 가르킨다. 라고 이해해야해.

 

      한번 밑에 출력함수들을 보자.

 

      printf("a의 주소 값은 %d",b);
      printf("a이 가진 수는 %d",*b);

 

      두개의 차이점은 *이 붙었냐 안붙었냐 이 한가지야.

 

      만약 붙지 않았으면, 가르키는 방의 방문(주소값)만 보여줄 것이고.

      만약 붙어 있게되면, 가르키는 방의 안에 존재하는 값(변수가 가지고 있는 수)를 보여주게 돼.

 

      그렇기에, *는 '열쇠'라고 이해하면 편해.

 

      열쇠(포인터)가 없으면, 방문만 보고 %d에 방문에 적힌 호수(변수의 주소값)를 가르쳐 줄 것이고.

      열쇠(포인터)가 있으면, 방문을 열고 %d에 방안에 있는 숫자(변수가 가진값)를 가르쳐 주니까 말야.

 

      결국에는

      *b는 a를 가르키게 되는 것이고,

      b는 &a를 가르키게 되는 것이지?

 

      그렇기에 포인터는 어떠한 변수가, 다른 어떠한 변수의 주소값과, 그 주소 안의 수를 가르키는 것. 라고 생각해야 맞는 것이지.

 

      이것으로 포인트의 기초 설명까지 모두 끝났어.

      사실 정말정말 기초라고 할 수 있는 입,출력과 형태에 따른 바이트 할당, 아스키 코드 등은 많이 스킵했는데. 이것들은 나중에 기회가 되면

      설명해주도록 할게.

 

      수고했어 게이들아.

 

      이제 꺼져.

 

      기분 좋은일 생기면 컴퓨터의 구조나 네트워크의 구조에 대해 글이나 좀 싸줄테니까.

9개의 댓글

2014.01.02
퀄이 점점 좋아진다
0
2014.01.02
오 아주 좋아 ㅊㅊ
0
pointer offset값 계산하는 방법이 어떻게되냐?

한 4~5중 pointer정도인데도

내가 쓰는 언어에서는 그런 관련 지식답변이 얼마없어서 큰일이네

그냥 base잡고 offset더하고 그값에다 offset을 더하는거야

아님 base잡고 offset1더하고 base잡고 offset2더한걸 합쳐서 나오는거야?
0
@ટૂય는નવના
그리고 C++언어에서 Gui사용시 Button색 지정 가능하냐?

내가 쓰는 언어는 C++기반인데도 Button이외의 색 지정은 되는데 Button만 안되더라고
0
2014.01.02
@ટૂય는નવના
JAVA의 AWT나 Swing이 아니기때문에 C나 C++에서 GUI들은 운영체제 마다 다 다르다고 봐야됨.

모든 OS에서 GUI를 쓰고 싶다 하면은 GTK+를 쓰던가 아님 자바로 가서 하던가... ㅋㅋ

Windows같은 경우에는 MFC쓸때는 GetDlgItem?인가 그거로 가져와서 속성 바꾸거나
Win32로 그냥 짰을때는 윈도우 생성할때 바꾸거나. 아니면 다른 방법 있겠지?
Mac OS는 뭐 버튼은 IB에 끌어놓고 속성 바꾸거나. 아니면 하드코딩해서 NSButton 객체에 대한 속성에서
색상을 바꿔야겠지?

무튼 C++에서의 GUI는 OS마다 다달라서 정확한 플랫폼과 어떤 프레임웤을 쓰는지 알아야됨 ㅋㅋ
0
2014.01.02
@ટૂય는નવના
포인터는 주소를 저장하는 변수 라고 볼수 있기 때문에
포인터 끼리의 덧셈연산이 불가능해...

다만 차이를 알수있도록 뺄셈연산만 가능함 ㅋㅋ

void *p1 = (void*)0x0010;
void *p2 = (void*)0x0020;

p1 + p2의 연산은 허용을 안해줌.
다만 p1 + 4이런식은 연산은 해줌.(아.. 이것도 안되겠구나... void*이라서..)
만약 타입이 있는 포인터 변수 타입인 p2라면
p2 + 4를 하게되면 p2의 주소로부터 타입의크기 * 4만큼 떨어진곳이 나오게됨.

포인터 끼리의 연산은 p1 - p2이런식만됨.
0
@잉텔
그럼 2중포인터 같은 경우는

base+p1 - base+p2

이렇게 되는건야?

아니면

base - p1 - p2

이렇게 되는거야?
0
2014.01.04
@ટૂય는નવના
내가 아는 2중포인터는

void *p = (void*)0x0050;
void **pp = &p;

이건데?

위에서 말했다 시피 포인터 변수는
뺄셈연산만 가능해...
0
2014.01.12
? 그러고보니 오랜만에 글 봤더니 틀린거 있네?
니네 왜 char형 변수가 2바이트 할당된다고 한거 지적안함?
char형 변수는 1바이트야. 2바이트는 short문이고
0
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜
563 [과학] 경계선 지능이 700만 있다는 기사들에 대해 34 LinkedList 12 18 일 전
562 [과학] 번역)새들은 왜 알을 많이 낳는가? - 후투티의 형제살해 습성... 7 리보솜 3 2024.03.23
561 [과학] 학계와 AI, 그리고 Bitter Lesson (쓰라린 교훈) 26 elomn 35 2024.02.17
560 [과학] 지구의 속삭임, 골든 레코드의 우주 9 Archaea 10 2024.02.16
559 [과학] 잔혹한 과학실험 이야기 <1> 절망의 구덩이 19 개드립하면안됨 37 2024.02.15
558 [과학] 스트레스를 받으면 술이 땡기는 이유 12 동식 16 2024.02.10
557 [과학] 지능은 모계유전이 아니다. 40 울릉특별자치도 35 2024.01.26
556 [과학] 진화를 생각할 때 고려할 것들 23 날씨가나쁘잖아 12 2024.01.17
555 [과학] 학문적(과학적) 접근과 유사 진화심리"학" 26 날씨가나쁘잖아 19 2024.01.15
554 [과학] 호모 사피엔스의 야릇한 은폐된 배란에 대한 남녀 학자의 다... 14 개드립하면안됨 15 2023.12.29
553 [과학] 김영하의 작별인사를 읽고 느낀 점 (스포있음) 21 장문주의 2 2023.11.28
552 [과학] 제4회 포스텍 SF 어워드 공모전 ( SF 단편소설 / SF 미니픽션 ) 2 따스땅 1 2023.11.25
551 [과학] 펌) CRISPR 유전자 가위 치료제 "최초" 승인 12 리보솜 7 2023.11.25
550 [과학] 러시아는 기술산업을 어떻게 파괴시켰는가(펌) 9 세기노비는역사비... 15 2023.11.18
549 [과학] 고양이에 의한 섬생태계 교란과 생물 종의 절멸 (펌) 2 힘들힘들고 6 2023.11.16
548 [과학] 번역) 알츠하이머병 유전자는 어떻게 살아남았는가? 12 리보솜 10 2023.11.15
547 [과학] 『우영우』의 자폐 스펙트럼 장애 개념이 왜곡인 이유 (펌) 47 힘들힘들고 10 2023.11.12
546 [과학] 흑수저 문과충 출신 구글 취직하는 파이썬 특강 -1 14 지방흡입기 11 2023.09.27
545 [과학] 국가별 당뇨 유병율 이거 뭐가 바뀐건지 아는사람? 8 LAMBDA 1 2023.09.27
544 [과학] 물샤워 ㅇㅈㄹ 하는 놈들 봐라 171 철동이 48 2023.09.23