C - 포인터와 배열

2022. 3. 7. 20:27C

 

int num[3] = {1,2,3};
int *ptr = num;

printf("ptr이 가리키는 주소 : %p\n", ptr);
printf("ptr+1 이 가리키는 주소 : %p\n", ptr+1);
printf("ptr+2 이 가리키는 주소 : %p\n", ptr+2);

printf("\n\n");

printf("num[0]이 가리키는 주소 : %p\n", &num[0]);
printf("num[1]이 가리키는 주소 : %p\n", &num[1]);
printf("num[2]이 가리키는 주소 : %p\n", &num[2]);

출력 결과

ptr이 가리키는 주소 : 0x304c7b9ec
ptr+1 이 가리키는 주소 : 0x304c7b9f0
ptr+2 이 가리키는 주소 : 0x304c7b9f4


num[0]이 가리키는 주소 : 0x304c7b9ec
num[1]이 가리키는 주소 : 0x304c7b9f0
num[2]이 가리키는 주소 : 0x304c7b9f4

출력 결과를 보면 배열의 인덱스가 1 증가할때마다 int 자료형 크기인 4만큼 올라가는 것을 확인할 수 있으며

int num[3] = {1,2,3};
int *ptr = num;

printf("ptr이 가리키는 값 : %d\n", *ptr);
printf("ptr+1 이 가리키는 값 : %d\n", *(ptr+1));
printf("ptr+2 이 가리키는 값 : %d\n", *(ptr+2));

printf("\n\n");

printf("num[0]이 가리키는 값 : %d\n", num[0]);
printf("num[1]이 가리키는 값 : %d\n", num[1]);
printf("num[2]이 가리키는 값 : %d\n", num[2]);
ptr이 가리키는 값 : 1
ptr+1 이 가리키는 값 : 2
ptr+2 이 가리키는 값 : 3


num[0]이 가리키는 값 : 1
num[1]이 가리키는 값 : 2
num[2]이 가리키는 값 : 3

배열[i]는 (ptr+i)와 값이 같다는 것을 알 수 있다.

 

ptr+1 = num1

*(ptr+1)은  ptr+1이 가리키는 주소의 값

 

<핵심 내용>

포인터는 주소값과 대상이 있어야하며

배열의 이름 == 배열의 시작 주소값

배열의 인덱스가 1씩 증가하면, 주소는 자료형의 크기만큼 증가

배열은 포인터와 같은 연산이 가능

 

배열의 각 요소값과 주소를 출력하는 프로그램

    int aa[5] = {1,2,3,4,5};
    int *pt, i;
    pt = aa;

for (int i = 0; i < 5; i++) {
    printf("aa[%d]의 주소 --- %p", i, &aa[i]);
    printf("aa[%d]=%d=%d \n",i, *(pt+i), *(aa+i));
}

출력 결과

aa[0]의 주소 --- 0x309c799e0aa[0]=1=1 
aa[1]의 주소 --- 0x309c799e4aa[1]=2=2 
aa[2]의 주소 --- 0x309c799e8aa[2]=3=3 
aa[3]의 주소 --- 0x309c799ecaa[3]=4=4 
aa[4]의 주소 --- 0x309c799f0aa[4]=5=5

 

포인터를 사용하여 2차원 배열의 각 요소값을 출력하는 프로그램

    int aa[3][2] = {1,2,3,4,5,6};
    int *pt, i, j, k;
    pt = reinterpret_cast<int *>(aa);
    k = 0;

for (int i = 0; i < 3; i++) {
    for (int j = 0; j <= 1; j++) {
        printf("aa[%d][%d] -- %d \n", i, j, *(pt+k));
        k++;
    }
}

출력 결과

aa[0][0] -- 1 
aa[0][1] -- 2 
aa[1][0] -- 3 
aa[1][1] -- 4 
aa[2][0] -- 5 
aa[2][1] -- 6

 

포인터 배열을 사용해서 각 문자를 출력하는 프로그램

    char *ptr[4] ={"SUN","MON","TUE","WED"};
    int i, j;

for (int i = 0; i < 4; i++) {
    for (int j = 0; j < 3; j++) {
        printf("*(pt[%d]+%d)--", i, j);
        printf("%c  ", *(ptr[i]+j));
    }
    printf("\n");
}

출력 결과

*(pt[0]+0)--S  *(pt[0]+1)--U  *(pt[0]+2)--N  
*(pt[1]+0)--M  *(pt[1]+1)--O  *(pt[1]+2)--N  
*(pt[2]+0)--T  *(pt[2]+1)--U  *(pt[2]+2)--E  
*(pt[3]+0)--W  *(pt[3]+1)--E  *(pt[3]+2)--D

 

'C' 카테고리의 다른 글

C - 재귀함수  (0) 2022.03.07
C - 함수  (0) 2022.03.07
간단한 제어문 예제  (0) 2022.03.07
C - 전처리기  (0) 2022.03.07
C - getchar() 함수와 gets()함수  (0) 2022.03.07