본문 바로가기

C_study

[C] 코딩도장 59 : 포인터 연산 사용하기

59.9 심사문제: 포인터 연산으로 메모리 주소 조작하기 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    short *numPtrA;
    short *numPtrB;
    short *numPtrC;

    scanf("%p", &numPtrA); // F0000000 입력

    numPtrB = numPtrA + 3; // 포인터가 short 자료형이므로 2바이트씩 3번 순방향으로 이동
    numPtrC = numPtrA + 5; // 5번 순방향으로 이동
    
    printf("%X\n", numPtrB); // F0000006
    printf("%X\n", numPtrC); // F000000A

    return 0;
}

59.10 심사문제: 포인터 연산과 역참조 사용하기 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int numArr1[3] = { 0, };
    long long numArr2[3] = { 0, };
    int *numPtr = malloc(sizeof(int) * 3);
    void *ptr = malloc(sizeof(long long) * 3);
    int num1;
    long long num2;

    scanf("%d %d %d %lld %lld %lld", 
        &numArr1[0], &numArr1[1], &numArr1[2], 
        &numArr2[0], &numArr2[1], &numArr2[2]
    ); // 1, 2, 3, 4, 5, 6 입력

    memcpy(numPtr, numArr1, sizeof(int) * 3); // numPtr에 배열 복사
    memcpy(ptr, numArr2, sizeof(long long) * 3); // ptr에 배열 복사
    numArr1[0] = numArr1[1] = numArr1[2] = 0;
    numArr2[0] = numArr2[1] = numArr2[2] = 0;

    num1 = *(numPtr + 2); // 배열의 세번째 값을 가져오기 위해 +2 하고 역참조한다
    num2 = *((long long*)ptr + 1); // ptr는 void 포인터이기 때문에 long long 자료형으로 형변환한다 
  

    printf("%d %lld\n", num1, num2);

    free(ptr);
    free(numPtr);
 
    return 0;
}

59.11 심사문제: 구조체 포인터로 포인터 연산하기 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Point3D {
    float x;
    float y;
    float z;
};

int main()
{
    void *ptr = malloc(sizeof(struct Point3D) * 3);
    struct Point3D p[3];
    float result1, result2;

    scanf("%f %f %f %f %f %f %f %f %f", 
        &p[0].x, &p[0].y, &p[0].z, 
        &p[1].x, &p[1].y, &p[1].z, 
        &p[2].x, &p[2].y, &p[2].z
    );

    memcpy(ptr, p, sizeof(struct Point3D) * 3);
    memset(p, 0, sizeof(struct Point3D) * 3);

    result1 = ((struct Point3D *)ptr + 1)->x; // 구조체 포인터로 변환 후 포인터 연산을 통해 값에 접근
    result2 = ((struct Point3D *)ptr + 2)->z;

    printf("%.1f %.1f\n", result1, result2);

    free(ptr);

    return 0;
}