C언어/참고서: C언어 콘서트

C언어 48차시 포인터와 배열 연습문제 1

Olivia-BlackCherry 2023. 4. 7. 09:34

목차

    1. 배열함수 - 각 배열의 합 구하는 함수

    ♣결과

    >>10

    ♧코드

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #define SIZE 4
    int get_array_sum(int values[], int);
    int main()
    {
    	int data[] = { 1,2,3,4 };
    	get_array_sum(data, SIZE);
    	return 0;
    }
    
    int get_array_sum(int values[], int size)
    {
    	int sum = 0;
    	for (int i = 0; i < size; i++) {
    		sum += values[i];
    	}
    	printf("%d", sum);
    	return 0;
    }
    
    //olivia_codingschool

     

     

    2. 1번의 배열의 합을 포인터를 이용하여 계산하기

    ♣결과

    >>20

    ♧코드

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #define SIZE 4
    int get_array_sum(int*p, int size);
    
    int main()
    {
    	int data[] = { 1,2,3,4 };
    	int* p;
    	p = data; // &data[0] 
    
    	get_array_sum(p, SIZE);
    	return 0;
    }
    
    int get_array_sum(int *p, int size)
    {
    	int sum = 0;
    	for (int i = 0; i < size; i++) {
    		sum += *(p + i);
    	}
    	printf("%d", sum);
    	return 0;
    }
    
    //olivia_codingschool

     

     

    <주의할 점!!!>

    아래의 결과는 10이 나온다. 

    간접참조연산자를 어디에 찍느냐가 포인터를 이해하는 첫걸음인데,

    아래와 같이 p=*data를 해버리면, p자체의 값이 data[0]의 값이 되어버리기 때문에

    get_array_sum함수에서 data[0]값에 +1을 더하는 연산을 진행하기 때문에

    sum값이 제대로 나오지 않는다. 

     

    결론적으로, p=data 즉, p=&data[0] 위치 자체를 저장해야하고, 

    get_array_sum에서 파라미터로 간접참조연산자 *를 붙여서,

    합계 연산을 수행할 때 포인터값 자체를 계속 더해나갈 수 있도록 해야한다. 

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #define SIZE 4
    int get_array_sum(int*p, int size);
    
    int main()
    {
    	int data[] = { 1,3,5,7 };
    	int* p;
    	p = *data; //&data[0] 의 값
    
    	get_array_sum(p, SIZE);
    	return 0;
    }
    
    int get_array_sum(int p, int size)
    {
    	int sum = 0;
    	for (int i = 0; i < size; i++) {
    		sum += (p + i);
    	}
    	printf("%d", sum);
    	return 0;
    }

     

    3.  포인터 변수와 관련 연산자

    ♣결과

    아래의 코드에 상세설명됨.

    ♧코드

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    int main()
    {
    	int num=10; //num 변수의 값은 10이다.
    	int* p1;   // p1은 포인터이다. 뭔가를 가리킬 것이다.
    	p1 = &num; //p1은  num이 저장되어 있는 메모리의 주소의 값(&)을 저장하는 포인터변수이다. 
    	           //정확히 이 값이 무엇인지는 모른다. 컴파일러가 아무대나 저장하기 때문이다.
    	printf("%d\n", *p1); //p1이 가리키는 값을 출력한다. -->10
    	printf("%d\n", p1); //???????? -->--2028602732
    	printf("%p\n", p1); //변수의 주소를 출력하는 형식 지정자는 %p이다. p1의 주소를 변환한다.--->000000A78715FA94
    	printf("%p\n", &num); //p1은 num의 주소를 가리키고 있다. 결국 p1의 주소값과 값은 똑같다. ---->000000A78715FA94
    	return 0;
    }
    //olivia_codingschool

     

     

    4. 배열과 포인터

    ♣결과

    아래 코드 참고

    ♧코드

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    int main()
    {
    	int i;
    	int A[] = { 1,2,3,4,5 };
    	int* p;
    	p = A;  //p=&A[0];
    	printf("%d\n", *p);  //1
    	printf("%d\n", *&A[0]);  //1
    
    	printf("%p\n", p);  //0000002C166FF9E8
    	printf("%p\n", &A[0]);  //0000002C166FF9E8
    
    	printf("%d\n", *(p + 1));  //2
    	printf("%d\n", A[0+1]);  //2
    }
    
    //olivia_codingschool

     

     

    5. 배열 역순으로 요소 출력하기(포인터 사용)

    ♣결과

    >> 9 7 5 3 1

    ♧코드

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #define SIZE 5
    int get_array_sum(int*p, int size);
    
    int main()
    {
    	int data[] = { 1,3,5,7,9 };
    	int* p;
    	p = data; //&data[0] 의 값
    
    	get_array_sum(p, SIZE);
    	return 0;
    }
    
    int get_array_sum(int *p, int size)
    {
    	for (int i = 0; i < size; i++) {
    		printf("%d ",*(p+size-1-i));
    	}
    	return 0;
    }
    //olivia_codingschool