프로그래밍 공부
작성일
2023. 4. 9. 03:10
작성자
WDmil
728x90

시험 오답정리.

2. 다음 중 4byte 의 크기를 가지고 있는 자료형은?

  1. char
  2. long long
  3. float
  4. double
  5. short

4byte 크기의 자료형은 int, float, long 등이 있다. 여기선 flaot이 해당한다.

 

4444

5. 2Byte의 매모리에 23이 저장되는 bit 중 옳은 것은?

  1. 0101 1101
  2. 0001 0111
  3. 0000 0000 0110 1100
  4. 0000 0000 0101 1101
  5. 0000 0000 0001 0111

23을 2진수로 변환 시 0001 0111 그러나, 2byte = 16bit 임으로, 나머지 0으로 채움. 즉,

0000 0000 0001 0111 이다.

 

13. 다음 점프문중 반복중인 명령을 중단하고 조건식으로 다시 되돌아가는 명령어는 무엇입니까?

  1. contunue;
  2. break;
  3. return;
  4. goto;
  5. do;

continue; continue는 선언 시, 현재 반복문의 가장 끝지점으로 이동한다. 물론, goto, 로도 가능하다.

 

20. int[4][3] 배열의 크기는 몇 Byte 입니까?

  1. 12
  2. 36
  3. 48
  4. 128
  5. 256

int 자료형은 대부분 4byte. 4 * 3 * 4 = 48. 48byte 이다.

 

22. 다음 중 매개변수를 통해 넘긴 공간의 값을 수정할 수 있는 것은?

  1. void Change(int num);
  2. void Change(const int num);
  3. void Change(const int* num);
  4. void Change(int* const num);
  5. void Change(const int * const num);

1. 매개변수 자체가 전달. 펑션 종료 시 데이터가 날아감으로 반영되지 않음.

2. const int 로 선언되어 상수처리 되기에 매개변수 num을 변환할 수 없음.

3. int* 이지만, const int* 임으로 포인터가 가리키는 데이터를 변경할 수 없음.

4. const num 이지만, int*자체에 상수처리된 것 이 아니기 때문에, 주소는 변경 불가능 하나, 주소의 데이터는 변경 가능.

5. const int* 이기에 가리키는 데이터 변경 불가능, const num 이기에 주소값도 변경 불가능.

 

23. 64bit 체제의 프로그램에서 포인터의 크기는?

  1. 2Byte
  2. 4Byte
  3. 6Byte
  4. 8Byte
  5. 16Byte

32Bit체제는 32/8 로 4Byte의 크기의 주소값을 가지며, 64Bit체제는 64/8로 8Byte의 크기의 주소값을 가진다.

 

25. 배열 int Array[5] 의 시작 주소가 80 일 때  Array + 4 의 주소인 것은?

  1. 80
  2. 84
  3. 88
  4. 92
  5. 96

int = 4byte로 연산할 시, Array[0] 부터 Array[4]까지 진행함으로, 5번째 열의 시작주소를 확인하면 된다.

Array[0] = 80, Array[1] = 84, Array[2] = 88, Array[3] = 92, Array[4] = 96

 

26. 배열 float Array[5]의 시작주소가 100 일 때 값이 다른 것 은?

  1. &(Array[3])
  2. Array + 3
  3. 112
  4. &*(Array + 3)
  5. &(*Array + 3)

&(Array[3]) = 100 + (3*sizeof(float)) = 112 float는 4byte이다.

Array + 3 = 100 + (3*sizeof(float)) = 112

112 = 112

&*(Array + 3) = 2번 항에 포인터 주소를 붙인것 임으로 112 와 같다.

&(*Array + 3), *Array = 100 &(100+3) 임으로, 100번지이다. 값이 변한거지 주소가 참조되지 않았다.

 

28. 다음 중 컴파일러가 수행하는 일이 아닌것은?

  1. 소스코드를 기계어로 변환
  2. 컴파일링 에러 확인
  3. 일으킨 문제의 소스코드 라인 지시
  4. 파일 참조 오류 반환
  5. 실행 도중 에러에 대한 반환

실행 도중 에러에 대한 반환은 컴파일러가 아닌 운영체제가 처리한다.

 

30. 다음 중 arr[1][0]을 가리키지 않는 것은?

  1. arr + 1
  2. &arr[1]
  3. &arr[0] + 1
  4. &arr[1][0]
  5. *(arr[0] + 1)

arr + 1 = arr[1]의 시작주소 의미, arr[1][0]을 가리킨다.

&arr[1] : arr[1]의 시작주소 의미, arr[1][0]과 동일한 값을 가짐.

&arr[0] + 1 : arr[1]의 시작주소를 의미, arr[1][0]을 가리키거나 값을 가짐,

&arr[1][0] : arr[1][0]의 주소를 의미한다. arr[1][0]을 직접 가리키는 주소,

*(arr[0] + 1) : arr[0]의 두번째 요소인 arr[0][1]을 의미, arr[1][0]과는 관련 없음.

 

33. int arr[3] = {1, 2, 3}; 을 ptr이라는 포인터 변수에 저장할 때, ptr이 가리키는 값도, ptr이 가리키는 주소 값 도 변경할 수 없도록 하는 코드를 작성하시오.

  • const int* const ptr = arr;

 

41. 보기와 같이 구조체를 동적 할당할 때 맴버의 접근 방법 중 옳은 것은?

보기 ) Struct* p = (Struct*)malloc(sizeof(Struct)*5);

  1. p.member;
  2. p[0]->member
  3. (*p)->member;
  4. *(p + 1).member;
  5. *(p[1])->member;

1번은 구조체가 아니라 포인터 이기 때문에 -> 로 접근해야한다.

2번은 p가 구조체 배열을 가리키지만, -> 연산자는 []와 같이 사용할 수 없다. 이미 첫번째 구조체를 참조하기 때문이다.  -> 가 아니라 . 으로 바꾸어야한다.

3번은 *p가 이미 첫번째 구조체를 참조함으로 . 연산자를 사용하여야 한다.

4번은  포인터 변수 임으로 *(p + 1) -> member 가 되어야 한다.

5번은 member가 포인터 라면, 올바른 접근방법이다. member가 포인터 인지 아닌지가 불분명하다.

 

42. const int * p 의 설명으로 옳지 않은 것은?

  1. p 가 가리키고 있는 변수의 값의 수정이 불가능하다.
  2. p 가 가리키고 있는 주소의 변경이 가능하다.
  3. p 가 가리키고 있는 변수의 값에 접근이 불가능하다.
  4. p를 통하여 다른 변수를 가리킬 수 있게 수정이 가능하다.
  5. p는 자기 자신만의 주소를 가지고 있다.

const 임으로 변경은 불가능하나, 접근은 가능하다.

 

47. const 키워드에 대해 옳지 않은 것은?

  1. 기본 자료형에 사용할 수 있다.
  2. 매개변수에 사용할 수 있다.
  3. 구조체에 사용할 수 있다.
  4. 선언 시 초기화가 이루어져야 한다.
  5. 함수의 반환형으로 사용할 수 있다.

함수의 반환형으로 사용할 수 없다. C++에서는 선언 시 초기화가 이루어져야 선언된다. 그렇지 않으면 선언 될 수 없다.

 

50. 다음 코드의 출력 결과를 적으시오,

 

int arr[2][3] = {1, 2, 3, 4, 5, 6}

int(*p)[3] = NULL;

 

p = arr;

 

printf("%d\n", *(p[0] + 1) + *(p[1] + 2));

2,6

printf("%d\n", *(*(p+1)+0)+*(*(p + 1) + 1));

4,5

답 : 

8

9

728x90