[C/C++] 26강~30강 정리
🖥C & C++/인프런 기초학습

[C/C++] 26강~30강 정리

728x90
반응형


< 26강. 배열 가리키기 (배열 포인터) >



이번에 배우는게 진짜 배열 포인터!


*ptr = arr;은 아님!


#include <stdio.h>


int main() {

    // arr[i] = *(arr+i) = *(ptr+i) = *(i+ptr) = i[ptr]

    // a[b] -> *(a+b) 처리가 됨

    int arr[3] = { 1,2,3 };

    int *ptr = arr;

    

    for (int i = 0 ; i<3 ; i++){

        printf("%d ",*(arr+i));

    }

    printf("\n")

    

    for (int i = 0; i <3 ; i++){

        printf("%d ",i[ptr]);

    }

    printf("\n");

}


실무에서 i[ptr] 처럼 쓸 일은 없다! 쓰면 안되고!


#include <stdio.h>


int main() {

    /*

     1. arr == &ptr[0]

     2. *ptr == ptr[0]

     3. ptr + 1 == ptr에 sizeof(*ptr)을 더한 값 (int면 4 더해서 이동)

     */

    

    int arr[3] = { 1,2,3 };

    // 4가 더해짐

    printf("arr = %d\n",arr);

    printf("arr + 1 = %d\n",arr+1);

    // 12가 더해짐 4x3(개수)

    // &arr + 1 == &arr에 sizeof(arr)을 더한 값 (int면 4 더해서 이동)

    // "*", "&" 만나서 사라짐

    printf("&arr = %d\n",&arr);

    printf("&arr + 1 = %d\n",&arr+1);

}



이제부터 배열 포인터가 나온다! 배열 자체를 선언하는 포인터



#include <stdio.h>


int main() {

    int arr[3] = { 1,2,3 };

    

    // 가리킬 배열의 길이를 []안에 입력

    // 길이 3인 int형 배열을 가리키는 포인터를 선언

    int (*ptr_arr)[3];

    ptr_arr = &arr; // arr의 주소지인 arr[0]이 입력됨

    

    for ( int i = 0 ; i<3; i++){

        printf("%d\n",(*ptr_arr)[i]);

    }

}


배열의 주솟값을 넣어주고 포인터가 arr을 가리키는 상황에서 가리키는 배열 *(ptr_arr)의 i번째 요소를 출력한 것이다. 



< 27강. 2차원 배열과 배열 포인터 >



#include <stdio.h>


int main() {

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

    

    printf("%d\n",sizeof(arr));  //24

    printf("%d\n",sizeof(arr[0]));  //12

    printf("%d\n",sizeof(arr[0][0]));  //4

    // 앞에 &를 붙이면 값이 같음. 배열의 주소는 어차피 arr[0][0]이기 때문에!

}


/*

1. arr == &ptr[0]

2. *ptr == ptr[0]

3. ptr + 1 == ptr에 sizeof(*ptr)을 더한 값 (int면 4 더해서 이동)

*/

#include <stdio.h>


int main() {

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

    

    int (*ptr)[3] = &arr[0]; // arr = &arr[0];

    

    // 1. ptr[i] == arr[i] ??

    // 2. ptr[i][j] == arr[i][j] ??

    // 3. ptr == arr ??

    

    // ptr은 행 전체를 가리키는 포인터이고,

    // ptr에 1을 더할 때마다 그 다음 행을 가리킨다고 이해해도 된다.

    

    for (int i = 0; i < 2;i++){

        for (int j = 0;j < 3 ;j++){

            printf("%d ",ptr[i][j]);

        }

        printf("\n");

        // arr와 똑같이 출력됨

    }

}


#include <stdio.h>


int main() {

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

    

    for (int (*row)[3] = arr; row < arr + 2; row++){

        // row가 arr[0]을 가리키고 있음

        // row ++은 바로 다음 행을 가리키게 함

        // for문 내에서 다음 행을 계속 가리키는 것

        for (int *col = *row;col < *row +3 ; col++){

            // col은 row가 가리키는 배열 자체를 의미한다.

            // col은 row가 가리키는 배열의 첫 row[0]을 가리키는 것

            // col++을 하게 되면 다음 열을 계속 가리키게 된다.

            printf("%d ",*col);

        }

        printf("\n");

    }

}


< 28강. 포인터 배열 >


포인터 배열 : 포인터들이 배열되어 있는 것 (포인터가 여러개)

배열 포인터 : 배열을 가리키는 포인터 (1개짜리)


#include <stdio.h>


int main() {

    // 배열 포인터

    int(*ptr)[4];  // 4개 짜리 int형 배열을 가리키는 포인터

    

    // 포인터 배열

    int *ptr[4];  // 괄호만 지우면 됨. 각 칸이 무언가를 가리키는 포인터임

}


#include <stdio.h>


int main() {


    // 포인터 배열

    int *ptr[4];  // 괄호만 지우면 됨. 각 칸이 무언가를 가리키는 포인터임

    int a = 10;

    int b = 20;

    int c = 30;

    int d = 40;

    

    // 0번째 포인터에 a의 주소를 입력

    ptr[0] = &a;

    ptr[1] = &c;

    ptr[2] = &d;

    ptr[3] = &b;

    

    printf("%d %d %d %d\n",*ptr[0],*ptr[1],*ptr[2],*ptr[3]);

}


ptr[0]은 그냥 주소를 가리키는 것이라, *ptr[0]을 해야 이 포인터가 가리키는 값을 출력할 수 있다. 


#include <stdio.h>


int main() {

    int arr[4] = { 1,2,3,4 };

    // 포인터 배열

    int *ptr[4];  // 괄호만 지우면 됨. 각 칸이 무언가를 가리키는 포인터임


    

    for (int i=0;i<4;i++){

        ptr[i] = &arr[i];

        // 주솟값을 저장시킴

    }

    

    for (int i =0 ; i<4 ; i++){

        printf("%d ",*ptr[i]);

    }

    printf("\n");

}


#include <stdio.h>


int main() {

    char str[] = "Hello";

    

    printf("%s\n", &str[0]);

    // 0번쩨 칸을 가리키는 주소(포인터)를 알려주면 NUL포인트가 나올때까지 순서대로 출력해줌

    // 그게 %s 이다.

    // str = &str[0] 이랑 같은 것 

}



#include <stdio.h>


int main() {

    char strings[3][10] = {"Hello","World","Cha"};

    

    for (int i = 0 ; i < 3 ; i++){

        printf("%s\n",&strings[i][0]);

        // i가 1일 경우 1행을 가리키는 것 [1][0]이어서

        // 1행의 첫 열 주소를 알려준 것이기에 끝까지 출력된다.

        // &string[i]로 해도 주소는 같기에 결과가 같다.

    }

}


아래처럼 바꿀 수도 있다.


#include <stdio.h>


int main() {

    char strings[3][10] = {"Hello","World","Cha"};

    char *p_str[3];  // 3개짜리 포인터 배열

    

    for ( int i = 0; i <3 ; i++){

        p_str[i] = strings[i]; // == &strings[i][0]

        // 각 포인터 배열들의 포인터들이 실제 배열의 첫 주소를 가리키고 있는 것

    }

    

    for (int i = 0 ; i < 3 ; i++){

        printf("%s\n",p_str[i]);

        // i가 1일 경우 1행을 가리키는 것 [1][0]이어서

        // 1행의 첫 열 주소를 알려준 것이기에 끝까지 출력된다.

        // string[i]로 해도 주소는 같기에 결과가 같다.

    }

}



< 29강. (배열과 포인터) 종합문제 >



/* 1.

 100개 이하의 정수를 입력받아

 첫 줄에 짝수 번째 숫자들을 순서대로 출력하고,

 다음 줄에 홀수 번째 숫자들을 순서대로 출력하는 프로그램을 만들어 보세요.

 

 입력 예

 7

 3 1 4 1 5 9 2

 

 출력 예

 1 1 9

 3 4 5 2

 */


#include <stdio.h>


int main() {

    int n;

    int arr[100];

    

    scanf("%d",&n);

    

    for (int i = 0; i < n ; i++){

        scanf("%d",&arr[i]);

    }

    

    for (int i = 1; i < n; i+=2){

        printf("%d ",arr[i]);

    }

    printf("\n");

    

    for (int i = 0; i < n; i+=2){

        printf("%d ",arr[i]);

        

    }

    

}



2번 문제




코드만 보고 어떤 값이 나올지 맞춰보자!


포인터에 a의 값을 먼저 저장함

*ptr = 30; 은 a를 가리키고 있기에 값이 30을 바뀐다. (a=30과 같음) 아래도 마찬가지



3번 문제




arr + i는 처음에 12씩 더해질 것이다. (주솟값 더할 때) 그 다음 4씩 더해짐 (int 형)



/*

 4.

 10 * 10 이하의 정수형 이차원 배열을 입력받아

 그 배열의 각 행의 요소의 합을 출력하는 프로그램을 만들어 보세요.

 

 입력 예

 3 4

 4 2 6 3

 7 9 3 4

 5 1 2 1

 

 출력 예

 15

 23

 9

 */


#include <stdio.h>


int main(){

    int r,c;

    int arr[12][12];

    

    scanf("%d %d",&r,&c);

    

    for (int i=0 ; i < r ;i++){

        for (int j=0 ; j < c ; j++){

            scanf("%d",&arr[i][j]);

        }

    }

    

    for (int i=0 ; i < r ;i++){

        int sum = 0;

        for (int j = 0 ; j < c ; j++){

            sum += arr[i][j];

        }

        printf("%d\n",sum);

        

    }

}



< 30강. (배열과 포인터) 종합문제 2>



1번 문제.



다 주솟값이고 *arr[0], arr[0][0] 은 0이 나온다.

2번 문제. 


1번째 줄은 첫 주소를말한다. 100이라고 치자

2줄은 다음 요소를 말하기에 4를 추가한 104

3줄은 다음 행을 말하기에 12를 더한 112

4줄도 다음 행을 말하기에 12를 더한 112

5줄은 아예 2차원 배열을 벗어나 다음 배열로 이동하게 된다. 9x4여서 36만큼 벗어남, 136이 된다.


3번 문제.



(*ptr)[4]에 arr (=&arr[0])을 넣어줬기에 ptr을 그냥 2차원 배열처럼 사용할 수 있음. *ptr[i][j] -> ptr[i][j]로 바꿔줘야한다.














728x90
반응형