티스토리 뷰

C

[C] 포인터와 배열

tonirr 2021. 4. 27. 00:59
  • 포인터와 배열
    • char 포인터
      • 포인터는 문자열 처리에 효과적
      • 문자열 처리에 char형 포인터 사용
        • char *cp = "COMPUTER";
    • char 포인터의 기억공간 표현
      • char *cp = "COMPUTER";
        • cp는 문자열의 시작주소를 갖는다.
        • 따라서 값을 참조할 떄와는 달리 포인터변수 cp에 주소를 치환하지 않는다.
  • 포인터와 배열의 관계
    • 포인터와 배열의 관계
      • 포인터를 이용한 1차원 배열의 참조
        • char s[] = "SCIENCE";
        • char *cp;
        • cp = s; -> 포인터 cp를 이용하여 배열 s의 내용을 참조
      • 배열은 포인터의 일부분
      • 모든 배열은 포인터로 표현 가능
        • cp+1 <-> &s[1]
        • *(cp+1) <-> s[1]
      •  포인터를 이용한 2차원 배열의 참조
        • int a[2][3];
        • int *pt;
        • pt = a;  --> pt = a[0]; 또는 pt=&a[0][0]과 동일
        • a: 배열 a[2][3]의 시작 주소
        • a[0]: a[0]행의 시작 주소
        • a[1]: a[1]행의 시작 주소
      • 포인터와 배열은 서로 호환적
        • int A[] = {10, 20, 30, 40, 50};
        • int *p, i; --> A+i == &A[i], A[i] == *(A+i), *(p+i) == p[i]
#include <stdio.h>
void main(){
	char A[] = "ARRAY";
    char *p = "POINTER";
    int i;
    for(i=0; i<5; i++) printf("*(A+%d) : %c\n", i, *(A+i));
    	--> 배열을 포인터 형식으로 참조
    for(i=0; i<7; i++) printf("p[%d]: %c\n", i, p[i]);
    	--> 포인터를 배열 형식으로 참조
}
  •  
    •  
      • 포인터와 배열의 관계
        • 포인터와 배열의 값 변경
          • 배열 A[i]에서 A++, A--와 같이 값 변경 불가
          • 포인터 *p에서 p++, p--와 같이 값 변경 가능
        • 배열과 포인터의 기억공간 확보
          • 배열
            • 기억공간 중 자료영역을 고정적으로 확보
          • 포인터
            • 기억공간 중 자료영역을 유동적으로 확보
              • 필요할 때만 자료용 기억 공간을 확보
              • 자료의 개수가 가변적인 경우 효과적
          • 포인터가 배열보다 활용의 폭이 넓다.
  • 포인터 배열
    • 포인터 배열 => 포인터의 집합
      • 포인터가 여러 개 사용될 때 포인터 배열로 선언
      • 주로 문자열 배열 처리에 사용
        • char *name1, *name2, *name3; --> char *name[3];
    • 포인터 배열 선언과 기억공간 표현
      • char *PA[4];
        • PA[0] = "ELECTRONICS""; 
          • 첫번째 문자인 "E"를 가리키고 있음
        • PA[1] = "DATA";
          • "D"를 가리킴
        • PA[2] = "PROCESSING";
        • PA[3] = "SYSTEM";
      • 2차원 배열과 동일
      • 2차원 배열에 비해 기억고간 절약효과(포인터배열은 자료의 크기 만큼 기억공간 할당)
#include <stdio.h>
void main(){
	int a[] = {1,2,3,4};
    int b[] = {5,6,7,8};
    int *PA[2];
    PA[0] = a;
    PA[1] = b;
    printf("*(PA[0]) = %d\n", *(PA[0])); // 1
    printf("*(PA[0]+1) = %d\n", *(PA[1]+1));  // 2
    printf("*PA[1] = %d\n", *PA[1]);  // 5
    printf("*PA[1]+15 = %d\n", *PA[1]+15);  //20
}

 

  • 이중 포인터
    • 이중 포인터의 개념
      • Pointer to pointer
      • 자료가 있는 곳을 이중으로 가리키는 포인터
        • 이중 포인터가 가리키는 주소로 가보면 자료가 아닌 주소 값이 들어 있고, 그 주소에 자료가 들어 있음
    • 이중 포인터의 선언
      • 형식: int **p;
      • 의미: 포인터 변수에 다시 포인터를 지정하는 것으로서, 포인터에 대한 포인터이다.
    • 이중 포인터의 선언 예
      • int **p;
        • p: 기억공간 주소
        • *p: 주소 p에 수록되어 있는 값. 이 값이 주소로 사용됨
        • **p: 주소가 *p인 곳에 수록되어 있는 값. 즉 int형 자료
#include <stdio.h>
void main(){
	char a = 'A', *p, **pp;
    p = &a;
    pp = &p;
    printf("**pp=%c", **pp); // **pp=A
}

 

'C' 카테고리의 다른 글

[C] 구조체와 공용체  (0) 2021.05.08
[C] 구조체  (0) 2021.04.30
[c] 포인터  (0) 2021.04.21
[C] 배열  (0) 2021.04.14
[C] 입.출력 함수와 연산자  (0) 2021.03.25
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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 31
글 보관함