포인터
메모리의 위치를 표현한 기호
포인터 변수 선언
int *a; // 어떤 변수 a를 만들었는데 이는 포인터 변수이다, 이는 어떤 주소값을 가지고 있다
*a = 10; // (a가 가리키는 주소의 값)(*)에다가 10을 넣는다
printf("%d", a); // 102
printf("%d", *a); // 10
변수의 주소 찾기
int b = 10;
int *a;
a = &b;
printf("%d\n", *a); // 10
printf("%d\n", b); // 10
printf("%d\n", a); // 103
연습문제
다음 C 프로그램의 출력 값은?
#include <stdio.h>
void main() {
int A = 10, B;
int *c = &B;
B = A--; // 대입 먼저하고 -- 하기
B += 20;
printf("%d", *C); // 30
}
scanf
사용자의 키보드로 입력받을 떄 사용하는 함수
ex) scanf("%d", 변수의주소);
printf()는 & 사용하지 않음
#include <stdio.h>
int main() {
int i = 10;
int j = 20;
int *k = &i; // k 가 가리키는 것은 i 의 주소
scanf("%d", k); // 90을 타이핑 했다고 가정, k가 주소값으로 쓰였으므로 k가 가리키고 있는 i라는 공간에 90을 저장
printf("%d, %d, %d\n", i, j, *k); // 90 20 90
return 0;
}
정리: 포인터 변수는 int* a = &b 이런식으로 선언함. 포인터 변수는 b의 '주소 값'을 가지고 있고, *a 이런식으로 사용하면 b를 가리킴. *의 의미는 "변수의 값"이라고 생각하면 된다.
배열과 포인터
#include <stdio.h>
int main() {
int i;
int a[] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}; // a 라는 값에는 배열의 시작 주소가 들어감
int *ptr = a + 3; // ptr 이라는 포인터 변수에는 배열의 주소(a) + 3 을 가지고 있음
for (i = 0; i < 5; i++) {
printf("%d", *(ptr+i)-3); // 37 47 57 67 77
}
}
#incldue <stdio.h>
int main() {
int a[] = {1, 2, 4, 8};
int *p = a; // 배열 a 의 시작주소
p[1] = 3; // 1 3 4 8
a[1] = 4; // 1 4 4 8
p[2] = 5; // 1 4 5 8
printf("%d %d\n", a[1] + p[1], a[2] + p[2]); // 8 10
return 0;
}
#incldue <stdio.h>
int main() {
int a[] = {1, 2, 4, 8};
int *p = a + 1; // 배열 a 의 시작주소 + 1
p[1] = 3; // 1 2 3 8
a[1] = 4; // 1 4 3 8
p[2] = 5; // 1 4 3 5
printf("%d %d\n", a[1] + p[1], a[2] + p[2]); // 7 8
return 0;
}
#include <stdio.h>
int main() {
int a[4] = {10, 20 ,30};
int *p = a;
p++; // a 의 시작 주소 + 1
*p++ = 100; // p가 가리키는 주소의 값에 100을 집어넣어라 그리고 p가 가리키는 주소 + 1을 하라, 10 100 30
*++p = 200; // 먼저 p가 가리키는 주소 + 1을 하고 p가 가리키는 주소의 값에 200을 대입하라
printf("a[0]=%d, a[1]=%d, a[2]=%d\n", a[0], a[1], a[2]); // 10 100 30 ,,, 200
}
#include <stdio.h>
int main() {
int num[4] = {1, 2, 3, 4}; // num에는 배열의 시작 주소값이 들어있음
int *pt = num; // pt라는 포인터 변수에는 num(배열의 주소값)이 들어있다
pt++; // num + 1
*pt++ = 5; // 1, 5, 3, 4 ,,, pt = num + 2
*pt++ = 10; // 1, 5, 10, 4 ,,, pt = num + 3
pt--; // pt = num + 2
*pt+++= 20; // 1, 5, 30 ,4 ,,, pt = num + 3
printf("%d %d %d %d", num[0], num[1], num[2], num[3]); // 1 5 30 4
}
'정보처리기사' 카테고리의 다른 글
[정보처리기사] C언어 특강 35~36강 정리(구조체, 배열포인터) (0) | 2024.10.06 |
---|---|
[정보처리기사] C언어 특강 29~34강 정리(포인터) (0) | 2024.10.05 |
[정보처리기사] C언어 특강 21~22강 정리(배열) (0) | 2024.10.04 |
[정보처리기사] C언어 특강 18 ~ 1강 정리(복잡한 제어문, 반복문 ) (0) | 2024.10.03 |
[정보처리기사] C언어 특강 13 ~ 17강 정리(삼항연산자, 제어문, 반복문) (0) | 2024.10.01 |