Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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
Archives
Today
Total
관리 메뉴

nomad-programmer

[C] int형 배열의 요소를 원하는 바이트만큼 변경 본문

Programming/C

[C] int형 배열의 요소를 원하는 바이트만큼 변경

scii 2020. 6. 10. 13:34
#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*)&num;

    // 각 바이트별로 값을 합산 함
    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

*/

포인터로 구성된 복잡한 수식은 배열로 표기하면 훨씬 직관적이고 코드가 간단해지는 것은 분명하다.

허나 많은 프로그래머가 표기법을 보고 배열 변수로 선언되었는지 포인터 변수로 선언되었는지 판단한다. 그렇기 때문에 표기법을 임의로 바꾸면 다른 사람이 코드를 보고 변수의 자료형을 오해할 수 있다.

Comments