지우너
[정보처리기사실기] C 본문
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;
}
}
'Records > 정보처리기사' 카테고리의 다른 글
[정보처리기사 실기] SQL (0) | 2024.09.29 |
---|---|
[정보처리기사 실기] 파이썬 (0) | 2024.09.27 |
[정보처리기사 실기/계산식] 서브넷 (0) | 2024.09.07 |
[정보처리기사 실기] JAVA (0) | 2024.08.10 |
[정보처리기사 실기] 결합도 정리 (0) | 2024.08.01 |