반응형

*C언어 포인터

// 문제 : 포인터 변수 p를 이용해서 변수 2개의 값을 변경해주세요.
// 조건 : 변수 a, b에 값을 직접 할당하지 마세요.
#include <stdio.h>

int main(void) {
  int a = 10;
  int b = 20;

  int* p;
  
  p = &a;
  *p = 100;

  p = &b;
  *p = 200;

  printf("a : %d\n", a);
  // 출력 => a : 100
  printf("b : %d\n", b);
  // 출력 => b : 200

  return 0;
}



// 문제 : C언어에 있는 모든 기본포인터타입변수의 크기를 출력해주세요.
#include <stdio.h>

int main(void) {
  // 정수 계열
  char* c;
  short* s;
  int* i;
  long* l;
  
  // 실수 계열
  float* f;
  double* d;

  printf("== 정답 ==\n");

  printf("size of c : %lu\n", sizeof(c));
  printf("size of char* : %lu\n", sizeof(char*));

  printf("size of s : %lu\n", sizeof(s));
  printf("size of short* : %lu\n", sizeof(short*));

  printf("size of i : %lu\n", sizeof(i));
  printf("size of int* : %lu\n", sizeof(int*));

  printf("size of l : %lu\n", sizeof(l));
  printf("size of long* : %lu\n", sizeof(long*));

  printf("size of f : %lu\n", sizeof(f));
  printf("size of float* : %lu\n", sizeof(float*));

  printf("size of d : %lu\n", sizeof(d));
  printf("size of double* : %lu\n", sizeof(double*));
  
  return 0;
}



// 문제 : char 변수 b를 이용하지 않고 b의 값을 훼손
// 조건 : 포인터 변수를 사용해서 값을 변경해야 한다.
// 조건 : 수정가능 지역에서 b 라는 변수를 언급하면(사용하면) 안됩니다.
#include <stdio.h>

int main(void) {
  char a = 1;
  char b = 5;

  printf("== 변수의 주소 ==\n");
  printf("&a : %ld\n", (long)&a);
  printf("&b : %ld\n", (long)&b);

  char* p;
  
  p = &a;
  *p = 2;
  p = &a - 1;
  *p = 100;

  printf("== 변수의 값 ==\n");
  printf("a : %d\n", a);
  // 출력 => a : 2
  printf("b : %d\n", b);
  // 출력 => b : 10
  
  return 0;
}



// 문제 : int 변수 b를 이용하지 않고 b의 값을 훼손
// 조건 : 포인터 변수를 사용해서 값을 변경해야 한다.
// 조건 : 수정가능 지역에서 b 라는 변수를 언급하면(사용하면) 안됩니다.
#include <stdio.h>

int main(void) {
  int a = 1;
  int b = 5;

  printf("== 변수의 주소 ==\n");
  printf("&a : %ld\n", (long)&a);
  printf("&b : %ld\n", (long)&b);

  int* p;
  
  p = &a;
  *p = 2;
  p = &a - 1;
  *p = 10;

  printf("== 변수의 값 ==\n");
  printf("a : %d\n", a);
  // 출력 => a : 2
  printf("b : %d\n", b);
  // 출력 => b : 10
  
  return 0;
}



// 문제 : 변수의 주소를 올바른 포인터 변수에 저장하지 않은 예 구현
#include "stdio.h"

// int 변수를 가리키려면 int 전용 포인터 변수를 써야하는 이유

int main(void) {
  int i = 1000;
  char* cp = &i; // cp 에는 i 의 주소값이 저장된다.
  
  printf("%d\n", i);
  printf("%d\n", *cp); // 1000 이 아는 -24가 출력된다.
  // 오류가 나는 이유 : 물론 cp 는 i의 주소값을 가지고 있다. 하지만 cp는 i변수에 접근하고 나서 4바이트를 가져오지 않고 1 바이트만 가져온다.
  // 누군가를 가리키려면 주소값으로는 부족하다. 올바른 사이즈도 필요하다.
  
  return 0;
}



// 문제 : 원본값을 훼손하는 change 함수를 만들어주세요.
#include <stdio.h>

void change(int* num) {
  *num = 50;
}

int main(void) {
  int x = 20;

  printf("change 함수 호출하기 전의 x : %d\n", x);

  int* p;
  p = &x;
  change(p);

  printf("change 함수 호출한 후의 x : %d\n", x);
  // 출력 => change 함수 호출한 후의 x : 50

  return 0;
}
반응형

+ Recent posts