포인터 배열과 문자열

ChoRong0824·2022년 10월 10일
0

C

목록 보기
5/17

포인터 배열과 문자열

  • 여러 개의 포인터를 다음과 같이 배열로 종합할 수 있다.
	int a[2][7];
    int *p[2];
    p[0]=*a;  <-- p[0] = a
    p[1]= *(a+1); <-- p[1]=a+1

로 쓰면 2개의 포인터 p[0], p[1]이 배열 요소로서 확보 됩니다.


  • 문자열을 포인터 배열로 출력
#include<stdio.h>
int main(void)
{
    char *p[]={"byte","bit"};
    int i;

    for(i=0; i<2;i++){
        printf(p[i]);
        printf("\n");
    }
}



  • 포인터 배열과 문자열
    (수정 전, 비교하기)
#include<stdio.h>
int main(void)
{
    char a[2][7]={{"sample"},{"test"}};
    char *p[2];

    p[0] = *a;
    p[1] = *(a+1);
    printf("%s, %s\n",p[0],p[1]);

    printf("%u %u %u %u %u %u\n", p[0]+0, p[0]+1, p[0]+2, p[0]+3, p[0]+4,p[0]+5);
    printf("%c %c %c %c %c %c\n", *(p[0]+0), *(p[0]+1), *(p[0]+2), *(p[0]+3), *(p[0]+4),*(p[0]+5));
    
    printf("%u %u %u %u %u %u\n", (*a+0),*a+1,*a+2,*a+3,*a+4,*a+5);
    printf("%c %c %c %c %c %c\n", *(*a+0),*(*a+1),*(*a+2),*(*a+3),*(*a+4),*(*a+5));
    
    printf("%u %u %u %u\n", p[1]+0,p[1]+1,p[1]+2,p[1]+3);
    printf("%c %c %c %c\n", *(p[1]+0),*(p[1]+1),*(p[1]+2),*(p[1]+3));
    
    printf("%u %u %u %u %u %u\n",*(a+1)+0,*(a+1)+1,*(a+1)+2,*(a+1)+3);
    printf("%c %c %c %c %c %c\n",*(*(a+1)+0),*(*(a+1)+1),*(*(a+1)+2),*(*(a+1)+3));
}


(후)

#include<stdio.h>
int main(void)
{
    char a[2][7]={{"sample"},{"test"}};
    char *p[2];

    p[0] = *a;
    p[1] = *(a+1);
    printf("%s, %s\n",p[0],p[1]);

    printf("%u %u %u %u %u %u\n", p[0]+0, p[0]+1, p[0]+2, p[0]+3, p[0]+4,p[0]+5);
    printf("%c %c %c %c %c %c\n", *(p[0]+0), *(p[0]+1), *(p[0]+2), *(p[0]+3), *(p[0]+4),*(p[0]+5));
    
    printf("%u %u %u %u %u %u\n", (*a+0),*a+1,*a+2,*a+3,*a+4,*a+5);
    printf("%c %c %c %c %c %c\n", *(*a+0),*(*a+1),*(*a+2),*(*a+3),*(*a+4),*(*a+5));
    
    printf("%u %u %u %u\n", p[1]+0,p[1]+1,p[1]+2,p[1]+3);
    printf("%c %c %c %c\n", *(p[1]+0),*(p[1]+1),*(p[1]+2),*(p[1]+3));
    
    printf("%u %u %u %u\n",*(a+1)+0,*(a+1)+1,*(a+1)+2,*(a+1)+3);
    printf("%c %c %c %c\n",*(*(a+1)+0),*(*(a+1)+1),*(*(a+1)+2),*(*(a+1)+3));
}

위 두개 코드와 console를 비교해서 차이점을 확인하기

(해석)



포인터의 포인터

  • 포인터 변수도 메모리에 할당되므로 자신의 주소 값이 존재한다.
  • 따라서 포인터 변수의 시작 주소를 다른 포인터 변수의 데이터로 이용할 수 있는데 이를 포인터의 포인터(또는 이중 포인터)라고 한다.
  • 포인터의 포인터 변수에 저장되어 있는 주소로 메모리를 접근해 보면, 실제로 데이터가 존재하는 것이 아니라 데이터가 저장되어 있는 주소가 참조되므로 포인터의 포인터를 이용하여 실제 데이터로 접근하려면 메모리가 두 번 참조되어야 한다는 의미이다.
  • 그 형식은 다음과 같으며, 2차원 배열과 같은 의미로 사용될 수 있다.
    데이터형 **변수명;

(예를 들어)

char*p1="sample"
char **p2;
p2= &p1;

-> char**p2 ; 로 선언하고 p2 = &p1 ; 를 수행하면 포인터 변수 p2는 포인터 변수 p1를 가리키게 되고, 이 *p2가 문자열의 시작 주소를 가리킵니다.
-> 따라서, 이 p2 를 포인터의 포인터 라고 합니다.



  • 포인터의 포인터
#include <stdio.h>
void main(void){

    int num;
    int *p1;
    int **p2;

    printf("정수를 입력해주세요 : ");
    scanf("%d", &num);

    p1 = &num;
    p2 = &p1;

    printf("num의 주소 : %u\n", &num);
    printf("p1의 주소 : %u\n", &p1);
    printf("p2의 주소 : %u\n", &p2);
    printf("num의 값 : %d\n", num);
    printf("p1의 값 : %u\n", p1);
    printf("p2의 값 : %u\n", p2);
    printf("*p1의 값 : %d\n", *p1);
    printf("*p2의 값 : %u\n", *p2);
    printf("**p2의 값 : %d\n", *(*p2));

}



  • 포인터 배열은 배열의 요소형이 포인터형인, 즉 주소를 저장하는 배열을 말한다. 따라서 포인터 배열은 포인터 변수로 이루어진 배열을 의미한다.
	데이터형 *포인터 배열 이름[배열 길이];
	int *array[3];    
  • 포인터 배열은 문자열을 다룰 때 주로 많이 사용되, 포인터 변수의 개수를 줄일 수 있습니다. 배열의 원소인 포인터가 다양한 크기의 배열을 포인트 할 수 있습니다.
    • 여기서는 정수형에 대한 예를 들어 다음과 같이 선언합니다.
    int x=10, y=20, x=30;
     int*array[3]={&x,&y,&z};


  • 포인터 배열
#include<stdio.h>
int main(void){
    char *q[3]={"One","Two","Three"};
    char **p=q;

    printf("%s %s %s\n", q[0],q[1],q[2]);
    printf("%s, %c %c %c\n", *p, **p, *(*p+1), *(*p+2));

    **p++;
    printf("%s, %c %c %c\n", *p, **p, *(*p+1), *(*p+2));

    **p++;
    printf("%s, %c %c %c %c %c\n", *p, **p, *(*p+1), *(*p+2), *(*p+3), *(*p+4));

}


profile
컴퓨터공학과에 재학중이며, 백엔드를 지향하고 있습니다. 많이 부족하지만 열심히 노력해서 실력을 갈고 닦겠습니다. 부족하고 틀린 부분이 있을 수도 있지만 이쁘게 봐주시면 감사하겠습니다. 틀린 부분은 댓글 남겨주시면 제가 따로 학습 및 자료를 찾아봐서 제 것으로 만들도록 하겠습니다. 귀중한 시간 방문해주셔서 감사합니다.

0개의 댓글