디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

늅늅이가 쓰는 늅늅이를 위한 C언어 포인터강좌 .....-1부-

태연여신님갤로그로 이동합니다. 2009.06.19 23:13:38
조회 3747 추천 1 댓글 10


- 본강좌에 나오는 예는 C언어 기반으로 작성되었음.
- 본강좌는 늅늅이가 쓰는 늅늅이를 위한 포인터 개념설명 강좌로 용어설명이 틀리거나 내용이 틀릴수 있음. (지적바람)


1. 포인터를 설명하기 앞서 기억해야하는 기본 C언어 문법


1) 변수 선언

      int a;
      - int (정수)형 데이터를 선언함. 여기서 선언의 의미는 명시적으로 컴파일러에게 변수명인 a를 사용한다는것과 컴파일시 
        4바이트의 메모리영역을 할당한다는 뜻.
      - char(문자)형(1바이트), float(실수)형(4바이트) 등의 선언도 같은 맥락.
      - 궁극적으로 프로세스가 변수의 메모리영역을 할당하는 이유는 운영체제가 효과적으로 메모리 관리를 해야하기 때문.
      - 내가 작성한 C코드를 실행한 프로세스는 현재 실행중인 다른 프로세스의 변수 메모리영역에 침범하거나, 침범당하지 않
         아야한다.
      - 이를 운영체제가 메모리영역을 할당한다는 개념으로 다른프로세스와의 메모리 충돌을 막는다.


2) 리터럴(literal)

      - 리터럴이란 값그자체로 상수의 개념이지만 실제로 메모리가 할당되지않는 값들을 말한다.
      - 예를들어 a = 10; 라는 문장이 있을때 a는 변수, =는 연산자, 10은 리터럴이다.
      - 단 문자열상수는 메모리가 실제로 할당되어 저장되며, 단 이메모리 영역은 read only이다.
      - 따라서 int *ptr; ptr=&"hello"; 라는 연산도 가능하긴 하다. 다만 쓸모가 없다.


 3) 연산자

   ① 대입연산자 = : 대입연산자는 rvalue(우측값)에서의 연산의 결과를 lvalue(좌측값)에 대입시키는 연산이다. 이때 
       lvalue은 반드시 메모리가 할당되있는 영역이어야 하며 좌변값과 우변값은 반드시 같은 타입이어야 한다.
      - ex1-1) int a =10;
      - ex1-2) 10 = a; (대입되는 lvalue가 메모리가 할당되지않는 리터럴이므로 당연히 안된다.)
      - ex1-3) int a=10,b=20; a=b; (우측값은 변수라도 대입이 된다.
    ② 주소연산자 & : 주소연산자는 보통 변수에 쓰며, 변수의 메모리 시작주소를 나타낸다.
       - ex1-4) int a,*ptr; ptr=&a; (포인터변수 ptr에 a의 메모리주소를 담는다)
    ③ 참조연산자 * : 참조연산자는 가르키는 주소의 값을 나타내는 연산이다. 당연히 포인터에서 사용된다.
       - ex1-5) int a=10,*ptr=&a; (정의문에서 *는 참조연산이 아니다. 포인터 선언문이다.)
          printf("%d",*ptr); (ptr에 저장된 주소 (a의 주소)의 값을 출력한다.
    ④ 캐스팅연산 (데이터형) : 변수앞에 캐스팅연산을 사용하면 그값은 강제로 해당데이터형으로 변환된다. 단 정보손실이 생
        길수 있으니 신중히 사용해야한다.
        - ex1-6) float a=10.10; int b=(int)a;
    ⑤ sizeof(변수명 혹은 데이터형) : 해당 변수 혹은 데이터형의 크기를 나타내는 연산이다.
        - ex1-7) int a; printf("%d",sizeof(a)); 결과는 변수 a의 메모리크기
        - ex1-8) printf("%d",sizeof(int)); 결과는 int형의 메모리크기
 
2. 포인터 변수란?


    - 일반적으로 변수란 어떠한값을 지속적으로 저장하여 변경,이용하기 위해 메모리영역을 할당하여 사용하는 것들로 변수를
        자료형태에 따라 정수형,실수형,문자형이 있다.
    - 포인터 변수도 마찬가지로 변수이며, 변수에 저장할수있는 타입으로 정수,실수,문자형이 있는것과 마찬가지로 포인터
        정수는 메모리의주소를 담기위한 변수이다.
    - 메모리주소는 32bit 기반의 운영체제를 기준으로 4byte이므로 (8bit는 1byte, 32bit는 4byte) 포인터변수는 실제로 4바
       이트가 선언시 할당되며 정수형을 담는 변수이다.
    - 따라서  char *형이든 int *형이든 void *형이든 모든 포인터변수는 4바이트크기를 갖으며 정수를 저장하는 변수인것이다. 
    - char *, int *, void *등  포인터변수의 데이터형은 포인터변수의 크기와는 관련이 없고 주소를 대입받는 변수의 자료형
      과  포인터연산과 관련이 있다.


3. 포인터변수 선언 및 정의

    - 포인터변수의 선언은 일반변수 선언식에서 변수명앞에 *기호를 첨부하면서 이루어진다.
        ex3-1) int *ptr;
     - 포인터변수는 리터럴상수로의 직접적인 대입이 불가능하다. 이는 사용자가 직접 주소를 입력하여 사용할경우 발생되
        는 여러가지 메모리영역에서의 문제를 컴파일러 차원에서 방어하기 위함이다.
     - 보통 포인터값을 당장 사용하지 않을경우 NULL 값을 넣기도 한다.
     - 포인터변수의 정의는 주소의 대입으로 이루어진다.
          ex3-2) int *ptr,a=10; ptr=&a;


4. 배열의 선언 및 정의


    - 배열은 같은타입의 데이터를 메모리상 연속되게 나열하여 할당하는 데이터형이다.
    - 보통 배열의 선언은 일반변수 선언식에서 [SIZE]를 첨가하여 선언한다.
         ex5-1) int arr[10];
    - 여기서 SIZE는 반드시 리터럴상수중에 양의정수로만 와야하며, 변수로의 대입은 불가능하다. (매크로상수는 가능)
     - 배열의 정의는 { } 괄호로 각각 정의할수 있으며, 문자열의 경우 "내용"으로 선언시에만 대입할수 있다.
         ex5-2) char arr[10]={\'h\',\'e\',\'l\',\'l\',\'o\',\'\\0\'};
         여기서 \'\\0\'는 숫자 0과 완전이 똑같으며, 보통 매크로로 NULL이라고 정의하기도 한다. NULL또한 1바이트를 차지하
         는 데이터이다.
          ex5-3) char arr[10]="hello";
         여기서 NULL을 첨가하지않아도 자동으로 들어간다, 따라서 문자형 배열선언시 문자수+NULL의 1바이트를 고려하여
        야 한다.
    - 선언이후에 문자열 대입연산은 불가능하다. 따라서 이런경우에는 strcpy() 함수를 사용한다.
    - 일일이 대입이 귀찮을 경우 규칙이 있거나, 복사하기 위하여 for문을 이용하여 대입하기도 한다.
    - 배열의 이름은 배열의 시작주소 그자체이다. (따라서 scanf같이 주소연산이 필요한 함수에 배열을 인자로할때 절대 주
        소연산(&)을 쓰면안된다.)
    - 따라서 이런식도 당연히 가능하다.
         ex5-4) int arr[10]={1,2,3,4,5}, *ptr; ptr=arr;


5. 포인터 연산

    - 포인터의 산술적인 연산은 상식수준에서 생각할 필요가 있다.
    - 일단 포인터끼리의 대입연산은 가능하다, 하지만 리터럴의 대입은 불가능하다. (위에서 설명)
    - 포인터값끼리의 덧셈연산은 불가능하다. 즉 주소값+주소값의 연산은 불가능하다는 소리다. 이는 그결과가 아무런 의미
        가 없기 때문이다.
    - 단, 포인터와 리터럴의 덧셈연산은 가능하다. 이는 상수만큼 떨어진 메모리주소를 나타내는것을 표현하는데 사용된다.
         ex6-1)  (ex5-4의 내용을 포함해서..) *(ptr+2);는 arr[2](혹은 ptr[2])와 결과가 같다.
    - 포인터끼리의 뺄샘연산은 가능하다. 즉 주소값-주소값의 연산이 가능하다는 소리다. 이는 배열같은 순차구조에서 각자
        료가 떨어진 크기를 말하므로 의미있는 값이기 때문이다.
         ex6-2) int arr[10]={1,2,3,4,5},*ptr1,*ptr2,a; ptr1=&arr[4]; ptr2=&arr[2]; a=ptr1-ptr2; 
    - 포인터와 상수의 뺄샘연산은 가능하다. 하지만 고려할 사항이 있는데, 포인터에 대입된 주소가 어떠한 변수 혹은 배열
        의 시작주소라면 불가능하다. 왜냐하면 배열의 크기는 음수가 될수 없기 때문이다.
    - 당연한 이야기지만 포인터끼리 혹은 포인터와 상수의 곱셈, 나눗셈, 나머지연산과 실수와의 연산은 불가능 하다. (사용
        되지 않는다.)
    - 산술적인 연산을 제외한 비교,논리,대입,캐스팅 연산등은 가능하다.
          ex6-3) if (ptr == NULL)
    - 아까 포인터를 설명하던중 char* , int*, void*식의 자료형이 사용되는 이유를 궁금해할 사람들이 많을것이다.
    - 실제로 int *형 포인터인경우 포인터의값+1은 실제로 주소값에서 4바이트번지 떨어진곳을 나타나여 4가 증가하며, -1
        은 주소값의 4바이 트이전을 나타내여, 즉 4가 감소하는 것이다.
    - 마찬가지로 char *형 포인터인경우 포인터의값+1은 실제로 1의 증가, 포인터값-1은 1의 감소이다.


-2부 계속-

추천 비추천

1

고정닉 0

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 시세차익 부러워 부동산 보는 눈 배우고 싶은 스타는? 운영자 24/05/27 - -
공지 프로그래밍 갤러리 이용 안내 [69] 운영자 20.09.28 35214 62
2706284 19 ) 승무원쌕파 만든썰 jpg ㅇㅇ(220.89) 17:19 0 0
2706283 알고리즘은 수학이다 ♥끙르가즘냥덩♥갤로그로 이동합니다. 17:19 0 0
2706282 게임, 임베디드 등이 어려운 이유가 뭔가요? 프갤러(116.127) 17:16 8 0
2706278 후임오면 어디까지 키워줄거임 ㅇㅅㅇ? 포항의봄갤로그로 이동합니다. 17:05 11 0
2706277 체감상 개발자 구인배율 0.01인듯 ㅇㅇ(223.62) 17:03 23 0
2706275 내년 여름까지가 목표임 ♥끙르가즘냥덩♥갤로그로 이동합니다. 17:01 11 0
2706274 오따꾸 후임 구한다 ㅇㅅㅇ 포항의봄갤로그로 이동합니다. 17:00 7 0
2706273 중동 세계대전 직전임 ㄷㄷ... [1] 초코냥갤로그로 이동합니다. 17:00 22 0
2706272 고졸 학원 출신이 취업하면 무시함? [4] ㅇㅇ(125.130) 16:58 30 0
2706270 SI 개발 다른데서 소스 빼와서 많이 쓰지 않냐?? [4] 프갤러(103.5) 16:58 23 0
2706269 DDD 개쩔게 적용하는 회사 있음ㅇㅇ? 포항의봄갤로그로 이동합니다. 16:57 9 0
2706268 6월임 [4] 키비갤로그로 이동합니다. 16:57 15 0
2706266 오타쿠들 많은 회사 가고싶어요 [5] 노력갤로그로 이동합니다. 16:53 16 0
2706265 개발자 공부안하면 어떻게됨? [2] 프갤러(211.44) 16:53 15 0
2706264 빅데이터분석기사 백준 티어 비교 [2] 프갤러(115.145) 16:50 22 0
2706263 산속에 자연 시설에서 국비 개발자 교육 하면 잘될거같음 [4] 프갤러(14.39) 16:47 20 0
2706262 그러고보니 이번 우리프로젝트에서는 [9] 멍청한유라ㅋ갤로그로 이동합니다. 16:45 35 0
2706261 지금 내가 듣는 노래인데 어떰? [1] 메쿠이로갤로그로 이동합니다. 16:40 9 0
2706260 오오 메종 오마주 작품?!? ♥끙르가즘냥덩♥갤로그로 이동합니다. 16:37 5 0
2706259 상속받은 클래스 생성은 [13] 멍청한유라ㅋ갤로그로 이동합니다. 16:35 33 0
2706258 메종일각 샹각나는 애니 함 볼깡 ost는 맘애 드는대 함 볼깡? [1] ♥끙르가즘냥덩♥갤로그로 이동합니다. 16:33 8 0
2706257 내가 국비 까지 않는 이유. [1] 프갤러(59.16) 16:31 23 0
2706256 한무당들 못하는 분야가 없노 [2] 헬마스터갤로그로 이동합니다. 16:29 7 0
2706255 17학번 컴공 신입 취업 3400이면 무난한편? [1] 프갤러(121.152) 16:29 34 0
2706254 나님 발음상태.. ♥끙르가즘냥덩♥갤로그로 이동합니다. 16:19 13 0
2706253 국비 다녀본적도 없으면서 국비 까는 애들 뭐냐? [3] 딱님갤로그로 이동합니다. 16:18 24 0
2706252 d3.js 같은 데이터 시각화쪽 나름 파이 커지지 않을까? [1] 프갤러(39.117) 16:18 13 0
2706250 컴공 국비 취업~ 내일부터 출근이다. 취업하다니 믿기지가 안네. [1] 프갤러(59.16) 16:15 31 0
2706249 나는내향적이야 [1] 통정희박대령갤로그로 이동합니다. 16:13 10 0
2706247 그러고보니 요즘 프갤에 국비 언급 싹사라짐 [6] AppHiki갤로그로 이동합니다. 16:09 62 1
2706246 한국에 계속잇엇더니 발움 아상해졋어 ♥끙르가즘냥덩♥갤로그로 이동합니다. 16:04 16 0
2706245 나님 영어발음 무슨 인도인같이 발음하는거 보고 놀람 ♥끙르가즘냥덩♥갤로그로 이동합니다. 16:03 11 0
2706244 운덩너가서 영상찍다가 외귝인이랑 잠깐 얘기한거 보니까 ♥끙르가즘냥덩♥갤로그로 이동합니다. 16:02 13 0
2706243 어중간한 타이밍에 딴길 찾을땐 이미 눚음 ♥끙르가즘냥덩♥갤로그로 이동합니다. 16:00 12 0
2706242 군대는 해병대 이상으로 가는게 맞음 Kyle(120.17) 16:00 11 0
2706241 지금 si,sm 경력 15년 미만은 빨리 딴길 찾아봐라 ♥끙르가즘냥덩♥갤로그로 이동합니다. 15:58 41 0
2706240 자바에서 리스트 -> 배열, 배열 -> 리스트로 바꾸는거 왤케 복잡함? 프갤러(125.130) 15:56 15 0
2706239 그냥 컴퓨터(게임) 좋아하니까 이걸로 먹고살아야지 [1] ㅇㅇ(183.98) 15:55 20 0
2706238 나름 사회인프라망이라는게 너무 치졸한데 허벌임 ♥끙르가즘냥덩♥갤로그로 이동합니다. 15:55 13 0
2706237 프갤 요즘 왤캐 사람 빠진거같지 [2] ㅇㅇ(59.26) 15:55 40 0
2706236 아직 똥풍선 공중에서 터진 사례는 없음? 딱님갤로그로 이동합니다. 15:54 8 0
2706235 ㅋㅅㅋ 뚫었당 감히 나님을 억압하려들다니.. ♥끙르가즘냥덩♥갤로그로 이동합니다. 15:53 10 0
2706234 한달에 2만원 씩 모아서 젠폰이랑 G5 언제 고쳐요? 도리스아(119.195) 15:50 8 0
2706233 오늘도 날씨 좋네 딱님갤로그로 이동합니다. 15:50 11 0
2706232 정관수술후 새로운 여친 사귀는 기분 후기.txt Kyle(120.17) 15:50 27 1
2706231 옷즘 여자들 1인av에 뛰어들더라 [3] 헬마스터갤로그로 이동합니다. 15:49 54 1
2706227 오전에 운동하고 점심 피자먹고 어영부영하니 벌써 4시노 [2] 포항의봄갤로그로 이동합니다. 15:43 16 0
2706226 죽은 사람은 말이 없다. 대대장 선생님 정신건강의학과 치료 받고 계셔 [6] 도리스아(119.195) 15:39 19 0
2706225 커피와 빵한잔의 여유를 느끼는 중입니다 [4] 헬마스터갤로그로 이동합니다. 15:36 22 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2