디시인사이드 갤러리

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

갤러리 본문 영역

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

태연여신님갤로그로 이동합니다. 2009.06.19 23:13:38
조회 3765 추천 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
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 우리나라를 대표해서 UN 연설자로 내보내고 싶은 스타는? 운영자 25/09/29 - -
AD 프로게이머가 될테야!! 운영자 25/10/01 - -
공지 프로그래밍 갤러리 이용 안내 [96] 운영자 20.09.28 47584 65
2893499 전라도애서 인명살상가능 실탄 3만발 불법유출 [1] ♥냥덩이♥갤로그로 이동합니다. 11:24 10 0
2893498 ai 재앙은 저능아 바이브코더에 의해 올겁니다. 프갤러(218.154) 11:22 14 0
2893497 ai가 개똥코드 싸질러서 rewrite하는데 그걸 또 ai로 한다고? [2] 프갤러(218.154) 11:19 25 0
2893496 찢은 보수진보 대통합을 이루고 국가붕괴시킴 ㅋㅋㅋㅋㅋㅋ 타이밍뒷.통수한방(1.213) 11:03 12 0
2893495 rewrite it 정도는 ㅇㅇ갤로그로 이동합니다. 10:54 20 0
2893494 카카오톡 드디어 레전드 평점 돌파 [1] 헬마스터갤로그로 이동합니다. 10:49 24 0
2893493 한국을 예견한 미국 드라마 ㅇㅇ(121.168) 10:47 19 0
2893492 국정농단 김현지 게이트 국감 특검 수사로 진실 밝혀야 [3] ♥냥덩이♥갤로그로 이동합니다. 10:39 25 1
2893491 드디어 3 모니터 구축했다. 2년만에... 넥도리아(220.74) 09:51 15 0
2893489 [kt cloud x goorm] IT 직군 개발 / 비개발 8개 과정 프갤러(14.32) 09:33 41 0
2893488 디씨는 서버 이중화 되어있을까? ㅇㅅㅇ [3] 헤르 미온느갤로그로 이동합니다. 09:01 41 0
2893487 틀딱 프붕이 국비 붙었어 [1] ㅇㅇㅇ(125.130) 09:00 32 1
2893486 인생은 운이야 [3] ㅇㅇ(121.168) 08:37 32 0
2893485 동네 꽃가게 추석대목 준비완료 ㅇㅅㅇ [1] 헤르 미온느갤로그로 이동합니다. 08:22 25 0
2893484 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 08:11 16 0
2893483 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 08:08 20 0
2893482 외국도 rewrite it in rust 하고 있는데 언어는 그저 프갤러(218.153) 07:28 33 0
2893481 나는내향적이야 나는조현병이야 [4] 손발이시립디다갤로그로 이동합니다. 07:22 35 0
2893471 멘헤라 모모링..❤ ♥냥덩이♥갤로그로 이동합니다. 06:37 21 0
2893460 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 06:19 24 0
2893452 민주당 종교단체 동원했나 “김민석으로 가시죠” 의혹 일파만파 ♥냥덩이♥갤로그로 이동합니다. 06:04 20 0
2893449 외국도 초급/저연차 프로그래머들 다 잘리고 있는데 AI는 그저 [1] 프갤러(220.70) 06:00 30 0
2893415 컴공 학식 2학년인데 어케해야할까요 [1] ㅇㅇ(211.60) 04:44 49 0
2893387 트럼프에 등 돌리는 MAGA! 원인은 엡스타인이 아니라 '딥스테이트'? 발명도둑잡기(118.216) 02:08 19 0
2893385 노인들이 인생이 노력이랬다가 운이라고하는데 정신 못차려서 그럼 타이밍뒷.통수한방(1.213) 01:44 24 0
2893384 이스라엘 삐삐 원격 폭파처럼 노트북, 서버 배터리 원격 폭발 공작 발명도둑잡기(118.216) 01:38 42 0
2893381 찢은 보수진보 대통합을 이루고 국가붕괴시킴 ㅋㅋㅋㅋㅋㅋ 타이밍뒷.통수한방(1.213) 01:35 17 0
2893379 정부 클라우드 복구불가 혹시 내란세력 증거 소멸 목적? 발명도둑잡기(118.216) 01:27 19 0
2893377 미국 국기 이모티콘은 두개 발명도둑잡기(118.216) 01:22 16 0
2893376 카카오 코테.. c없네.. 프갤러(112.170) 01:20 70 0
2893371 리눅스 창시자 리누스 방한하면 유퀴즈에 나와야 합니다 [1] 발명도둑잡기(118.216) 01:10 38 0
2893367 요즘은 국비교육 인기가 없나보네 [3] 프갤러(219.251) 00:53 85 0
2893366 근데 오히려 못생긴거<<이거 나름 나쁘지 않은듯 [1] ㅆㅇㅆ(113.192) 00:50 41 0
2893365 [3] 노력갤로그로 이동합니다. 00:41 54 0
2893364 북돼지새끼는 왜 외제품 사용하는거임?? 타이밍뒷.통수한방(1.213) 00:16 17 0
2893363 커널 패치가드 조지는 중인데 루도그담당(58.239) 00:14 21 0
2893362 오늘의 영화 실마리: 온라인게임 역사 다큐 발명도둑잡기(118.216) 00:12 18 0
2893360 수면쉬야햇당 [2] ♥냥덩이♥갤로그로 이동합니다. 00:00 48 0
2893359 울트라리스크 [2] ♥냥덩이♥갤로그로 이동합니다. 10.01 48 0
2893358 남자도 여신 유튜버 되기 가능 발명도둑잡기(118.216) 10.01 17 0
2893357 뭔가 덥넹 ♥냥덩이♥갤로그로 이동합니다. 10.01 39 0
2893356 애인과 수갑 한쪽씩 차면 뭐 하고 놀아야 하나요? 발명도둑잡기(118.216) 10.01 15 0
2893355 너희 좃찐따라서 나님 없으면 개노잼이잖아 [1] ♥냥덩이♥갤로그로 이동합니다. 10.01 32 0
2893354 나는 supabase의 기능중에 db를 벡터화 하는게 존나 편해서 ㅆㅇㅆ찡갤로그로 이동합니다. 10.01 35 0
2893353 나도 만약 성공했으면 운이 좋았다라고 변명했을듯 타이밍뒷.통수한방(1.213) 10.01 25 0
2893352 인생이 운이라는새끼는 그냥 집안이 좋은새끼들이나 하는 핑계거리이지 타이밍뒷.통수한방(1.213) 10.01 23 0
2893351 CIA에 신고한 냥덩이 외환죄로 최고 사형 가능 [1] 발명도둑잡기(118.216) 10.01 23 0
2893350 실력이라 포장된 운에 현혹되지 말기를 바래 ㅇㅇ(121.168) 10.01 20 0
2893349 근데 supabase 존나 편하네 왜 백엔드 안하고 supabase [5] ㅆㅇㅆ(113.192) 10.01 57 0
뉴스 '찬란한 너의 계절에' 이미숙X강석우X한지현X오예주 출연 확정! 세대를 아우르는 라인업 완성! 디시트렌드 10.01
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2