일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 구조체
- Data Structure
- c#
- jupyter
- dart 언어
- Unity
- vim
- HTML
- 도커
- Flutter
- 유니티
- C# delegate
- docker
- 다트 언어
- 포인터
- C++
- Algorithm
- git
- Houdini
- c# 추상 클래스
- 깃
- jupyter lab
- github
- gitlab
- c언어
- 플러터
- Python
- C언어 포인터
- c# winform
- c# 윈폼
Archives
- Today
- Total
nomad-programmer
[C] int형 배열의 요소를 원하는 바이트만큼 변경 본문
#include <stdio.h>
int main(void) {
int arr[2] = { 0x12345678, 0x12345678 };
printf("%-20s: %p, %p\n", "original", arr[0], arr[1]);
// 이렇게 인덱스로만 값을 대입시키면 4바이트 전체가 변경된다.
arr[1] = 0x01;
printf("%-20s: %p, %p\n", "arr[1]", arr[0], arr[1]);
// 1바이트만 변경할 것이라 char 포인터형으로 변경
(char*)arr[1] = 0x01;
printf("%-20s: %p, %p\n", "(char*)arr[1]", arr[0], arr[1]);
// 1바이트만 변경할 것이라 char 포인터형으로 변경. (char*)arr[1] 과 같은 뜻.
*((char*)(arr + 1)) = 0x01;
printf("%-20s: %p, %p\n", "*((char*)(arr+1))", arr[0], arr[1]);
return 0;
}
// 결과
/*
original : 12345678, 12345678
arr[1] : 12345678, 00000001
(char*)arr[1] : 12345678, 00000001
*((char*)(arr+1)) : 12345678, 00000001
*/
배열 표기법을 사용하면 명령문 자체가 단순해서 보기는 좋지만 좀 더 세밀한 표현을 하는 데는 한계가 있다.
그래서 포인터 표기법을 사용하는 것이다.
#include <stdio.h>
int main(void) {
int num = 0x12345678;
int sum1 = 0;
int sum2 = 0;
// int형 변수를 1바이트씩 접근하기 위해 char형 포인터 선언
// num변수는 int* 형이기 때문에 형 변환을 사용해 char* 형으로 변환.
char* ptr = (char*)#
// 각 바이트별로 값을 합산 함
sum1 = *(ptr + 0) + *(ptr + 1) + *(ptr + 2) + *(ptr + 3);
sum2 = ptr[0] + ptr[1] + ptr[2] + ptr[3];
printf("sum1: %d\n", sum1);
printf("sum2: %d\n", sum2);
return 0;
}
// 결과
/*
sum1: 276
sum2: 276
*/
포인터로 구성된 복잡한 수식은 배열로 표기하면 훨씬 직관적이고 코드가 간단해지는 것은 분명하다.
허나 많은 프로그래머가 표기법을 보고 배열 변수로 선언되었는지 포인터 변수로 선언되었는지 판단한다. 그렇기 때문에 표기법을 임의로 바꾸면 다른 사람이 코드를 보고 변수의 자료형을 오해할 수 있다.
'Programming > C' 카테고리의 다른 글
[C] 동적 할당 (malloc, free) (0) | 2020.06.11 |
---|---|
[C] 2차원 배열의 주소 값을 저장할 수 있는 포인터 (0) | 2020.06.10 |
[C] atoi 함수 예제 (0) | 2020.06.10 |
[C] void 형 포인터 (0) | 2020.06.09 |
[C] 1byte씩 읽는 포인터, 리틀 엔디안, 빅 엔디안 (0) | 2020.06.09 |
Comments