평소에 포인터와 배열이 뭔가 매칭이 잘 안되고 헷갈린다 이러면 필수로 a~i까지 다 풀어봐야 함

문 :

다음 각각의 지정된 임무를 수행하는 C++ 문장을 작성하라. 배정도 부동 소수형 값을 8 바이트에 저장하고 배열의 시작 주소가 메모리 위치 1002500에 있다고 가정한다.
각 문제에서 피룡에 따라 앞 문제의 결과를 사용해야 한다.

a) 10 요소를 포함하는 numbers라는 double형 배열을 선언하고 요소를 값 0.0, 1.1, 2.2, .... 9.9로 초기화 하라. 기호 상수 SIZE를 10으로 정의했다고 가정한다.
b) double형 변수를 가리키는 포인터 nPtr을 선언하라.
c) 배열 첨자 표기를 사용하여 배열 numbers의 요소를 출력하는 for문을 작성하라. 소수점 오른쪽 한 자리 정밀도를 이용하여 각 숫자를 출력한다.
d) 포인터 변수 nPtr에 배열 numbers의 시작 주소를 저장하는 별도의 두 문장을 작성하라.
e) 포인터 nPtr을 이용해서 포인터/오프셋 표기를 통해 배열 numbers의 요소를 출력하는 for문을 작성하라.
f) 배열 이름을 포인터로 이용해서 포인터/오프셋 표기를 통해 배열 numbers의 요소를 출력하는 for문을 작성하라.
g) 포인터 nPtr을 이용해서 포인터/첨자 표기를 통해 배열 numbers의 요소를 출력하는 for문을 작성하라.
h) 배열 첨자 표기, 배열 이름을 포인터로 이용하는 포인터/오프셋 표기를 통해 배열 numbers의 네 번째 요소를 참조하라.
i) nPtr이 배열 numbers의 시작 위치를 가리킨다고 가정할 때, nPtr + 8은 어떤 주소를 참조하는가? 그 위치에 어떤 값이 저장되어 있는가?
j) nPtr이 numbers[5]를 가리킨다고 가정할 때, nPtr -4을 실행한 후에 nPtr은 어떤 주소를 참조하는가? 그 위치에 저장된 값은 무엇인가?


답 :

#include <stdio.h>
#include <iostream>
#include <iomanip>

#define SIZE 10

using namespace std;

 

int main(){

 double numbers[SIZE] = {0.0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9};//a

 double *nPtr;//b
 
 cout << fixed << setprecision(1);

 for(int i=0; i<SIZE; i++){//c
  cout << numbers[i] << " ";
 }

 cout << endl;

 nPtr = numbers;//d
 nPtr = &numbers[0];
 
 for(int i=0; i<SIZE; i++){//e
  cout << *(nPtr+i) << " ";
 }
 
 cout << endl;

 for(int i=0; i<SIZE; i++){//f
  cout << *(numbers+i) << " ";
 }

 cout << endl;

 for(int i=0; i<SIZE; i++){//g
  cout << nPtr[i] << " ";
 }

 cout << endl;

 cout << "numbers[4] = " << numbers[4] << "t*(numbers + 4) = " << *(numbers + 4)
  << "tnPtr[4] = " << nPtr[4] << "t*(nPtr+4) = " << *(nPtr+4) << endl;//h
 
 cout << "nPtr + 0의 주소 : " << (nPtr+0) << "tnPtr + 8의 주소 : " << (nPtr+8) << "tnPtr + 8의 값 : " << *(nPtr+8) << endl;//i
 
 nPtr = &numbers[5];

 cout << "nPtr : " << nPtr;
 
 nPtr-=4;

 cout << "tnPtr-=4 : " << nPtr << "t값은 : " << *nPtr;//j
 

 return 0;
}