[정답] 49. 간접 연산자

◈ 기본 연습
1. 다음 3단계를 수행하는 코드를 작성하세요.
a. char 형식 변수 c를 선언하고 char 형식 을 원소로 하는 포인터 변수 p를 선언한 후에 변수 c의 주소를  p의 초기값으로 설정하세요.
b. 포인터 변수  p에 간접 연산을 이용하여 ‘A’를 대입하세요.
c. 그리고 변수 c의 문자를 출력하세요.
답:

//char 형식 변수 c를 선언, char 포인터 변수 p 선언 및 변수 c의 주소로 초기화
//포인터 변수  p에 간접 연산을 이용하여 'A'를 대입
//변수 c의 문자를 출력
#include <stdio.h>
int main(void)
{
    char c;
    char *p = &c;
    *p = 'A';
    printf("%c\n",c);
    return 0;
}

▷실행 결과

A

2. 다음 3단계를 수행하는 코드를 작성하세요.
a. int 형식을 원소로 하고 원소 개수가 5인 배열 arr을 선언하시오.
그리고 int 형식의 포인터 변수 p를 선언하고 arr로 초기화하시오.
int 형식의 변수 index를 선언하시오.

b. index 변수를 0에서 5보다 작을 동안 순차적으로 증가하면서 다음을 수행하시오.
포인터 변수 p와 index 의 더하기 연산한 결과에 간접 연산을 이용하여 배열의 각 원소에 1, 2, 3, 4, 5의 값을 설정
c. index 변수를 0에서 5보다 작을 동안 순차적으로 증가하면서 다음을 수행하시오.
배열 이름 arr과 index의 더하기 연산한 결과에 간접 연산을 이용하여 배열의 각 원소 값을 출력
답:

//int 형식을 원소로 하고 원소 개수가 5인 배열 arr을 선언
//int 형식의 포인터 변수 p를 선언하고 arr로 초기화
//int 형식의 변수 index를 선언
//index 변수를 0에서 5보다 작을 동안 순차적으로 증가하면서 다음을 수행
//포인터 변수 p와 index 의 더하기 연산한 결과에 간접 연산을 이용하여 배열의 각 원소에 1, 2, 3, 4, 5의 값을 설정
//index 변수를 0에서 5보다 작을 동안 순차적으로 증가하면서 다음을 수행
//배열 이름 arr과 index의 더하기 연산한 결과에 간접 연산을 이용하여 배열의 각 원소 값을 출력
 
#include <stdio.h>
int main(void)
{
    int arr[5];
    int *p = arr;
    int index;
    for (index = 0; index < 5; index++)
    {
        *(p + index) = index + 1;
    }
 
    for (index = 0; index < 5; index++)
    {
        printf("%d ", *(arr + index));
    }
    printf("\n");
    
    return 0;
}

▷실행 결과

1 2 3 4 5

3. 아래와 같이 10명의 성적을 기억하는 배열 scores를 선언하였다.
int scores[10]={90,38,45,67,98,87,88,20,98,85};
그리고 다음과 같이 포인터 변수 p를 scores로 초기화하였다.
int *p = scores;
반복문과 조건문과 포인터 변수와 더하기 연산, 간접 연산을 이용하여 최대값이 있는 원소가 몇 번째 원소인지 판단하는 코드를 작성하시오.
답:

//int scores[10] = { 90,38,45,67,98,87,88,20,98,85 };
//int *p = scores;
//반복문과 조건문과 포인터 변수와 더하기 연산, 간접 연산을 이용
//최대값이 있는 원소가 몇 번째 원소인지 판단하는 코드
#include <stdio.h>
int main(void)
{
    int scores[10] = { 90,38,45,67,98,87,88,20,98,85 };
    int *p = scores;
    int *max_p;
    int *last_p1 = scores + 10;
 
    max_p = p;//최대값이 있는 위치를 맨 앞으로 설정
    p++;
    for (p++; p < last_p1; p++)
    {
        if (*p > *max_p)//p가 가리키는 곳이 더 크면
        {
            max_p = p;//최대값이 있는 위치를 변경
        }
    }
 
    printf("최대값이 있는 위치는 %d번째\n", max_p - scores + 1);
 
    return 0;
}

▷실행 결과

최대값이 있는 위치는 5번째