📌 Study
🔸 2022-09-28
[프로그래밍 언어 활용]
1. 기본 문법 활용하기
- 포인트 : 변수의 주소값을 저장하는 공간
int a = 10;
int *b = &a;
int *b
=> 데이터가 들어갈 공간(포인터)
&a
=> 주소값
- b 공간에 a의 주소값을 저장
- a 값을 호출하고 싶은 땐,
*b
- 포인터 선언
데이터 타입*포인터 변수명 = &변수명;
int *b = &a;
- 1차원 배열과 1차원 포인터
- 1차원 배열에서 배열명과 단독으로 사용할 경우 1차원 포인터와 동일
- 1차원 배열일 때 배열명[요소] 형태, *(배열명+요소), 1차원 포인터일 때, 포인터[요소] 형태, *(포인터+요소)일 경우 값을 가리킴
*(a+1)
= a[1]
p[0]
= a[0]
*(p+1)
= p[1]
배열의 주소 |
배열명 == & 배열명[0] |
배열의 0번지 값 |
배열명[0] == *배열명 |
int a[3] = {1, 2};
int *p = a;
&a[0] == a
= a[0]
= 1
&a[1] == (a+1)
= a[1]
= 2
&a[2] == (a+2)
= a[2]
= 0
#include <stdio.h>
void main() {
int a[3] = {1, 2};
int *p = a;
printf("%d %d %d \n", a[0], a[1], a[2]); // 1, 2, 0
printf("%d %d %d \n", *a, *(a+1), *(a+2)); // 1, 2, 0
printf("%d %d %d \n", *p, *(p+1), *(p+2)); // 1, 2, 0
printf("%d %d %d \n", p[0], p[1], p[2]); // 1, 2, 0
}
- 2차원 배열과 1차원 포인터
- 2차원 배열에서 배열명만 단독으로 사용할 경우 2차원 포인터와 동일
- 2차원 배열일 때 배열명[요소] 형태, *(배열명+요소)는 1차원 포인터와 동일하고, 1차원 포인터에 해 *과 []을 이용해야 값을 가리킬 수 있음
*(a+2)
=> 1차원 포인터
a[2][2]
, *(a[2])
=> 2차원 포인터
int a[3][2] = {1, 2, 3, 4, 5, 6};
int *p = a[1];
a[0][0] |
1 |
a[0][1] |
2 |
a[1][0] |
3 |
a[1][1] |
4 |
a[2][0] |
5 |
a[2][1] |
6 |
a[0][0]
= &a[0][0]
== *a[0]
= a[0]
= 1
a[0][1]
= &a[0][1]
= 2
**a
= a[0]
= 1
**(a+1)
= a[1]
= 3
*p
= a[1]
= 3
*(p+1)
= 4
#include <stdio.h>
void main() {
int a[3][2] = {1, 2, 3, 4, 5, 6};
int *p[3] = {a[2], a[0], a[1]};
printf("%d %d %d \n", a[0][0], a[1][0], a[2][0]); // 1, 3, 5
printf("%d %d %d \n", *a[0], *a[1], *a[2]); // 1, 3, 5
printf("%d %d %d \n", p[1][0], p[2][0], p[0][0]); // 1, 3, 5
printf("%d %d %d \n", *p[1], *p[2], *p[0]); // 1, 3, 5
- 2차원 배열과 2차원 포인터
- 2차원 배열에서 배열명만 단독으로 사용할 경우 2차원 포인터와 동일
- 2차원 배열일 때 배열명 [요소][요소], 배열명[요소], *(배열명+요소)일 경우 값을 가리킴
#include <stdio.h>
void main() {
int a[3][2] = {1, 2, 3, 4, 5, 6};
int (*p)[2] = a;
int (*q)[2] = a+1;
printf("%d %d %d \n", a[0][0], a[0][1], a[1][0]); // 1, 2, 3
printf("%d %d %d \n", p[0][0], p[0][1], p[1][0]); // 1, 2, 3
printf("%d %d %d \n", q[0][0], q[0][1], q[1][0]); // 3, 4, 5
#include <stdio.h>
void main() {
int arr[3] = {1};
int s = 0, i = 0;
arr[1] = *(arr+0)+2;
arr[2] = *arr+3;
for (i = 0; i < 3; i++)
s = s + arr[i];
printf("%d", s); // (4+4) = 8
}
#include <stdio.h>
void 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); // 24 + 13 = 37
}
- 1차원 배열과 문자열
- 문자열을 초기화할 때 마지막에 NULL 문자가 삽입되므로 초기화하는 글자 수보다 1이상 큰 값으로 배열을 선언
- 초기화 할 때 배열의 크기를 명시하지 않으면 문자열의 문자수 + 1 만큼 자동으로 생성
- printf 함수에서 %s를 이용하여 문자열을 읽고 출력하는데, printf 파라미터로 문자를 읽기 시작할 시작 주소를 알려주면 시작 주소부터 NULL 직전 값까지 읽어서 출력
&a[0] |
H |
&a[1] |
e |
&a[2] |
l |
&a[3] |
l |
&a[4] |
o |
&a[5] |
Null |
&a[6] |
0 |
#include <stdio.h>
void main() {
char a[7] = "Hello";
pritnf("%s \n", a); // Hello
pritnf("%s \n", a+1); // ello
a[4] = NULL;
printf("%s \n", a+1); // ell
}
- 2차원 배열과 문자열
- 문자열을 여러 개 정의할 때 2차원 배열을 사용
- printf 함수에서 %s를 이용하여 문자열을 읽고 출력하는데, printf 파라미터로 문자를 읽기 시작할 시작 주소를 알려주면 시작 주소부터 NULL 직전 값까지 읽어서 출력
#include <stdio.h>
void main() {
char a[2][8] = {"Hello", "Soojebi"};
printf("%s \n", a[0]); // Hello
printf("%s \n", a[1]); // Soojebi
a[0][4] = NULL;
printf("%s \n", a[0] + 2); // ll
printf("%s \n", a[1] + 3); // jebi
}
#include <stdio.h>
void main() {
char *p = "KOREA";
printf("%s \n", p); // KOREA
printf("%s \n", p+3); // EA
printf("%c \n", *p); // K
printf("%c \n", *(p+3)); // E
printf("%c \n", *p+2); // M