일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Zoom Lense
- 변수
- CS Mount
- 실생활알고리즘
- 변수의 초기화와 대입
- ASCCII
- image sensor
- 간단한 앱만들어보기
- Depth of Fileld
- 과초점거리
- 카메라
- 고정비트레이트
- 심도
- 프로그래머스 lv2
- 이미지센서
- Gain
- C Mount
- 저장소와 동적메모리
- Pixel Bit Format
- AppInventer
- 아이리스
- Digital Slow Shutter
- 렌즈
- 조건 제어문
- main 함수 인자 전달
- 저조도
- 무게선별자동화
- Patch Cleaner
- camera
- c언어
- Today
- Total
카메라 개발자 공부방(SW)
[12장] 포인터와 배열 본문
자 오늘은 포인터와 배열의 예제 코드를 작성해보는 시간을 가져보겠습니다.
#include <stdio.h>
int main()
{
int arr[4] = {1, 2, 3, 4};
int* parr = arr;
for (int k = 0; k < 4; k++)
printf("%d ", parr[k]);
return 0;
}
// 실행 결과
// 1 2 3 4
배열의 이름은 첫 번째 요소의 주소입니다.
(익숙하지 않으시다면 9-10장을 꼭 복습해주세요.)
parr(포인터 변수)에 arr의 주소를 저장해서 모든 원소를 출력하였습니다.
#include <stdio.h>
int main()
{
int arr[4] = {1, 2, 3, 4};
int* parr = &arr[2];
printf("%d %d\n", parr[1], *arr);
return 0;
}
// 실행결과
// 4 1
parr의 주소엔 arr[2]의 주소가 저장되어있습니다.
[]연산은 왼쪽 주소 값을 기준으로 번지를 이동하기 때문에 parr[1]은 그 다음 번 지점의 주소를 의미합니다. 그러므로 4가 출력됩니다.
#include <stdio.h>
void PrintArray(int*parr, int size)
{
int k = 0;
for (k = 0; k < size; k++)
printf("%d ", parr[k]);
}
int main()
{
int arr[4] = {1, 2, 3, 4};
PrintArray(arr, 4);
return 0;
}
실행결과
// 1 2 3 4
printArray라는 함수의 매개변수 parr에 main 함수의 arr의 주소가 복사되고,
모든 요소를 출력한 예제입니다.
#include <stdio.h>
void MultiplyArray(int* parr, int size)
{
for (int k = 0; k < size; k++)
parr[k] *= 2;
}
void PrintArray(int* parr, int size)
{
for (int k = 0; k < size; k++)
printf("%d ", parr[k]);
}
int main()
{
int arr[4] = {1, 2, 3, 4};
PrintArray(arr, 4);
MultiplyArray(arr, 4);
PrintArray(arr, 4);
return 0;
}
// 실행결과
// 1 2 3 4
// 2 4 6 8
MultiplyArray라는 함수의 parr 포인터 변수에 main 함수의 arr의 주소가 복사되었습니다.
MultiplyArray란 함수에선 main 함수의 arr 메모리에 직접 접근할 수 있습니다.
위의 코드는 단순히 메모리 값에 × 2를 하고 모든 요소를 출력하였습니다.
#include <stdio.h> // 1 line
void Swap(int n1, int n2) // 2
{ // 3
int tmp = n1; // 4
n1 = n2; // 5
n2 = tmp; // 6
} // 7
// 8
int main() // 9
{ // 10
int n1 = 2; // 11
int n2 = 4; // 12
printf("%d %d\n", n1, n2); // 13
Swap(n1, n2); // 14
printf("%d %d\n", n1, n2); // 15
// 16
return 0; // 17
} // 18
// 실행결과
// 2 4
// 2 4
위의 예제 코드는 변수의 메모리를 서로 값을 교환해주는 Swap함수에 대한 코드입니다.
그런데 왜 14라인에서 Swap 함수를 호출 전후의 결과가 같을까요?
14라인에서 n1, n2의 값이 2라인의 Swap의 매개변수 n1, n2의 메모리 공간에 복사가 되었습니다.
2 ~ 6라인의 Swap 코드에 의해 1라인의 매개변수 값이 서로 교환이 되었지만, main 함수의 n1, n2의 메모리 값을 서로 교환시킨 것이 아니라 Swap 함수의 매개변수끼리 서로 교환시켰기 때문에 실행결과가 동일한 것입니다.
#include <stdio.h> // 1 line
void Swap(int* pn1, int* pn2) // 2
{ // 3
int tmp = *pn1; // 4
*pn1 = *pn2; // 5
*pn2 = tmp; // 6
} // 7
// 8
int main() // 9
{ // 10
int n1 = 2; // 11
int n2 = 4; // 12
printf("%d %d\n", n1, n2); // 13
Swap(&n1, &n2); // 14
printf("%d %d\n", n1, n2); // 15
// 16
return 0; // 17
} // 18
// 실행결과
// 2 4
// 4 2
Swap에서 main의 n1, n2 메모리 공간 자체의 값을 교환하려면 Swap 함수에서 main 함수의 변수 메모리 n1과 n2의 주소를 반드시 알고 있어야 합니다. 그러므로 의도한 데로 구현하려면 포인터를 사용해야합니다.
자 오늘은 여기까지~
'Langauge > C' 카테고리의 다른 글
[14장] 배열과 문자열 (0) | 2021.10.03 |
---|---|
[13장] 포인터의 포인터(pointer of pointer) (0) | 2021.10.02 |
[11장] 배열 (0) | 2021.09.30 |
[10장] 포인터 (0) | 2021.09.29 |
[9장] 변수와 주소 (0) | 2021.09.28 |