지우너

[정보처리기사실기] C 본문

Records/정보처리기사

[정보처리기사실기] C

지옹 2024. 8. 14. 20:21

c에서 나오는 문제: 문법을 아는가?

포인터

 

 

 

포인터

 

[Q&A] C언어 | 포인터

int main(){
    int A =10, B;
    int *C = &B;

    B = A--;
    B += 20;
    printf("%d", *C);
    return 0;
}
더보기

정답

30


최초로 선언할 때만 int *p는 "int의 주소값을 저장하는 변수"라는 의미를 가지고, 그 뒤로 *p는 p의 값이라는 의미로 사용됨.

 

A, B를 선언하는데, A는 초기값 10을 넣어서 초기화해준다.

C는 B의 주소를 가리킨다.

 

B에 A값을 넣은 뒤 A의 값을 1감소시킨다(후위 연산자). B=10, A=9

B에 20을 더한다. B=30

C의 값을 출력한다. C는 B의 주소를 가리키고 있다. B의 주소에 들어 있는 값은 B=30. 따라서 30을 출력한다.

 

int main(){
    int A =10, B;
    int *C=&B;

    B=A--;
    B+=20;
    *C=A;

    printf("%d\n", *C);
    printf("%d\n", B);

    return 0;
}
더보기

정답

9

9


A, B를 선언하는데, A는 초기값 10을 넣어서 초기화해준다.

C는 B의 주소를 가리킨다.

 

B에 A값을 넣은 뒤 A의 값을 1감소시킨다(후위 연산자). B=10, A=9

B에 20을 더한다. B=30

C의 값(=C의 주소에 들어있는 값=B의 값)을 A로 변경한다. A=9, B=9, *C=9

⭐️C가 담고 있는 주소를 A의 주소로 변경하고 싶다면 C=&A라고 해야한다.

 

*C=9이므로 9출력

B=9이므로 9출력

 

int main(){
    int A =10, B;
    int *C=&B;

    B=A--;
    B+=20;
    C=&A;

    printf("%d\n", *C);
    printf("%d\n", B);

    return 0;
}
더보기

정답

9

30


A, B를 선언하는데, A는 초기값 10을 넣어서 초기화해준다.

C는 B의 주소를 가리킨다.

 

B에 A값을 넣은 뒤 A의 값을 1감소시킨다(후위 연산자). B=10, A=9

B에 20을 더한다. B=30

C가 담고 있는 주소를 A의 주소로 변경. 이제 *C=A가 됨

 

*C는 C가 담고 있는 주소가 가리키는 값을 의미. C에는 A의 주소가 들어있다. 따라서 9가 출력된다.

B=30이므로 30이 출력된다.

 

[Q&A] C언어 | 포인터

#include <stdio.h>
int main(void){
    int n=4;
    int *pt = NULL;
    pt=&n;

    printf("%d", &n + *pt - *&pt + n);
    return 0;
}
더보기

정답

8


n에 4를 저장

포인터 변수 pt 선언

pt에 n의 주소를 저장

 

&n = n의 주소값, *pt=pt의 값=4

*&pt=pt의 주소값에 담긴 값 = n의 주소값

(pt는 주소를 담는 변수이므로 pt의 주소값에는 pt가 가리키는 변수의 주소가 담긴다. pt=&n으로 n의 주소를 담았었다.)

n=4

n의 주소값 +4 -n의 주소값 +4 = 8

 

[참고]

  • pt=&n
  • *pt=n
  • &pt= pt라는 변수의 주소
  • *&pt=&n

 

 

[Q&A] 영상답변 | 포인터(복잡함주의)

int code[] = {10, 20, 30, 40, 50, 60};
int *p = &code;
printf("%d \n", ++*p);
printf("%d \n", ++(*p));
printf("%d \n", (*p)++);
printf("%d \n", *p);

printf("%d \n", *p++);
printf("%d \n", *++p);
printf("%d \n", *p);

printf("%d \n", *(p++));
printf("%d \n", *(++p));
printf("%d \n", *p);
더보기

정답

11

12

12

13

 

13

30

30

 

30

50

50


*p는 p의 값을 의미함

++*p (=++(*p))

*p=10, ++*p를 하면 p의 값(10)을 1증가시킨 후 출력 11

++(*p) (=++*p)

*p=11, ++(*p)를 하면 p의 값(11)을 1증가시킨 후 출력 12

(*p)++

p의 값(12)을 출력한 후 1증가 시킴 12출력, *p=13

*p

p값에 변화 없음. 단순 출력. *p=13

 

*p++

*p를 출력(13)하고 p를 1증가시킴. p가 가리키는 값이 code[1]이 됨(20).

*++p

p를 1증가 시킴. p가 가리키는 값이 code[2]가 됨(30). p의 값(30)을 출력

*p

p값에 변화 없음. 단순 출력. *p=30

 

*(p++)

p의 값(30)을 출력. p를 1증가시킴(후위연산자라서 출력이 먼저임). p가 가리키는 값이 code[3]이 됨(40). 

*(++p)

p를 1증가시킴. p가 가리키는 값이 code[4]이 됨(50). p의 값(50) 출력

*p

p값에 변화 없음. 단순 출력. *p=50

 

[Q&A] 영상답변 | 이중 포인터

#include <stdio.h>
int main(){
    int *arr[3];
    int a = 12, b = 24, c = 36;
    arr[0] = &a;
    arr[1] = &b;
    arr[2] = &c;

    printf("%d \n", *arr[1] + **arr+1);
    return 0;
}

 

더보기

정답

37

 


선언할 때 *을 붙이면 주소값을 담는 변수라는 의미.

arr[0]에는 a의 주소

arr[1]에는 b의 주소

arr[2]에는 c의 주소가 들어가게 된다.

 

*arr[1]은 arr[1]의 값이라는 뜻이므로 b의 주소가 가리키는 값인 24가 된다.

**arr은 arr=첫번째 원소의 주소를 의미 → *arr 첫번째 원소에 들어있는 값(a의 주소)을 의미 **arr는 a의 주소에 들어있는 값을 의미한다. a의 주소에 들어있는 값은 12.

+1. 그냥 +1이다.

 

따라서 24+12+1=37이 되는 것.

 

[Q&A] 영상답변 | 배열과 포인터의 기본

#include <stdio.h>
int main(void){
    char *p="KOREA";
    printf("%s\n", p);
    printf("%s\n", p+3);
    printf("%c\n", *p);
    printf("%c\n", *(p+3));
    printf("%c\n", *p+2);
    return 0;
}

 

더보기

정답

KOREA

EA

K

E

M

 


"%s\n", p

p출력. KOREA

"%s\n", p+3

p+3칸 값부터 출력. KORE이까 E부터 출력. EA

"%c\n", *p

p가 가리키는 주소의 값 문자 하나. K

"%c\n", *(p+3)

p+3이 가리키는 주소의 값 문자 하나. E

"%c\n", *p+2

p가 가리키는 값에 2를 더해. K+2=M (KLM이니까)

 

[Q&A] C언어 | 문자열과 포인터

char codes[4][20]={"topic", "enough", "crypto", "hebei"};

int c;
for(c=0; c<4; c++){
    change(code[c],c);
    printf("%s\n", codes[c];
}

change(char *s, int n){
    char temp;
    int i;
    int j=(strlen(s)-1);
    for(i=n; i<j; i++){
        temp = *(s+i);
        *(s+i)=*(s+j);
        *(s+j)=temp;
    }
}