본문 바로가기
프로그래밍 언어/C

C언어 - 10. 배열과 포인터 (3)

by nomfang 2021. 3. 17.
728x90
반응형

char 포인터

  • 포인터는 문자열 처리에 효과적이다
  • 문자열 처리에 char형 포인터 사용

char 포인터의 기억공간 표현

  • char *cp = "COMPUTER";

  • cp는 문자열의 시작 주소를 갖는다
  • 값을 참조할 때와 달리 포인터 변수 cp에 주소를 치환하지 않는다
#include <stdio.h>

int main(void) {

  char *cp = "computer";
  register int i=0; 

  do
    printf("*(cp+%d) : %c\n",i,*(cp+i));
  while(*(cp+i++)!=0);
}

포인터와 배열

포인터와 배열의 관계

  • 포인터를 이용한 1차원 배열 참조
#include <stdio.h>

int main(void) {

  char s[] = "SCIENCE";
  char *cp;
  cp = s;

  printf("cp : %s \n",cp);
  printf("cp+1 : %s \n",cp+1);
  printf("&s[1] : %s \n",&s[1]);
  printf("*(cp+1) : %c \n",*(cp+1));
  printf("&s[1] : %c \n", s[1]);
}

  • cp : char형 포인터를 이용하여 배열 s의 내용을 참조

** 배열은 포인터의 하나이다
-> 모든 배열은 포인터로 표현 가능

포인터를 이용한 2차원 배열의참조

#include <stdio.h>

int main(void) {

  int a[2][3] = {
    {1,2,3},
    {4,5,6}};

  int *pt;
  pt = *a;

  register int i;
  for (i = 0; i < 6; i++){
     printf("*(pt+i) : %d \n", *(pt+i));
  }

}

포인터와 배열의 관계

  • 포인터와 배열은 서로 호환적
int a[] = {1,2,3,4,5};
int *p, i;

a + i == &a[i]
a[i] == *(a+i)
*(p+i) == p[i]

포인터와 배열의 호환 예

#include <stdio.h>

int main(void) {

  char A[] = "ARRAY";
  char *p = "POINTER";

  register 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 \*name[3];

포인터 배열 선언과 기억공간 표현

  • 2차원 배열과 활용은 동일하다
  • 2차원 배열에 비해 포인터 배열이 기억공간 절약 효과
    -> 가변 길이가 가능하기 때문에 (2차원 배열은 행 열의 개수가 일치해야함)

이중 인터

  • pointer to pointer
  • 자료가 있는 곳을 이중으로 가리키는 포인터 (포인터를 가리키는 포인터)
    -> 자료의 주소 값이 들어있는 포인터를 가리키는 포인터
  • 형식 : int **P;
  • int **p;
  • p : 기억공간 주소
  • *p : p의 값으로 자료의 주소가 들어있음
  • **p : 주소가 *p인 곳의 값으로 int형 자료가 들어있음
#include <stdio.h>

int main(void) {

  char a = 'A', *p, **pp;

  p = &a;
  pp = &p;

  printf("**pp = %c",**pp);
}

 

반응형

댓글