배열과 포인터의 특징에 대해 점검해보도록 하겠습니다.
1.
다음과 같은 list 배열이 있습니다.
int list[3]={10,20,30},
대괄호 []와 인덱스가 없는 배열, 즉 list는 무엇을 의미하나요?
배열의 시작 주소를 나타냅니다.
2.
크기가 같은 배열 두개를 선언하고, 한 곳에만 초기화를 합니다.
int arr1[3];
int arr2[3] = {1,2,3};
배열의 주소를 바꿔주기 위해서 arr1에 arr2의 주소를 대입합니다. 옳은 것을 고르세요
arr1 =arr2;
(1)가능
(2)불가능
(2)불가능
한번 선언된 배열은 주소를 변경할 수 없습니다.
arr1 =arr2; 에는 빨간 밑줄이 쳐지고,
' 식이 수정할 수 있는 lvalue 여야 합니다. '라는 문구가 나옵니다ㅣ.
3.
다음 대괄호 안에 들어갈 숫자를 딱 맞게 골라 주세요
char today[ ] = "Sunday";
(1) 6 (2) 7
(2) 7
S, u, n, d, a, y, /0
4.
char형 포인터 변수인 pToday를 만들고, "Sunday"문자열에 접근해 보세요
예시)
char pToday = ;
char* pToday = "Sunday";
c-문자열은 포인터를 이용해 접근 가능합니다.
5.
다음 두 배열의 차이점을 배열에 넣어가며 설명해 보세요.
(배열의 길이는 임의로 잡아두었습니다. 배열의 마지막이 어딘지 분명히 해주세요.)
char today[] = "Sunday";
char today[] = {'S','u','n','d','a','y'};
char today[] = "Sunday";
char today[] = {'S','u','n','d','a','y'};
위는 문자열 리터럴로 초기화된 배열이지만,
아래는 c문자열이 아니라 단순한 문자들의 배열이라는 차이가 있습니다.
c문자열은 널 종단 문자인 '/0'로 끝나는 문자 배열입니다.
"" 쌍따옴표로 들어갔다면 '/0'이 포함된 것,
{} 중괄호가 있다면 '/0'이 없다는 것으로 기억하셔야 합니다.
둘의 차이는 분명하기 때문에 반드시 기억하셔야 합니다.
둘의 차이는 분명합니다.
먼저, 문제와는 다르게 today와 today1로 구분지어 초기화해주었습니다.
today의 결과는 Sunday이지만
today1의 결과는 Sunday와 알수없는 글자들 그리고 또다시 Sunday가 등장했습니다.
얼핏보면 Sunday가 반복되는 것 같지만 앞의 Sunday와 뒤의 Sunday는 다른 메모리 공간을 차지합니다.
자, 이렇게 today와 today1을 Sunday라는 같은 문자로 구성하면 헷갈리기 때문에
다음과 같이 다시 초기화해주었습니다.
char today[] = "Sunday!!";
char today1[] = { 'S','u','n','d','a','y' };
그리고 실행 결과를 확인합니다.
today는 Sunday!! 가 잘 들어가 있고, 느낌표 뒤에 널 종단 문자 '/0'가 포함되어 느낌표 까지만 적절하게 나타내어주었습니다.
하지만 today1은 Sunday그리고 이상한 글자 그리고 Sunday!!가 들어가 있는 것을 확인하실 수 있습니다.
그 이유는, today1에서는 초기화해줄 때, 널 종단 문자 '/0'가 포함되지 않았기 때문입니다.
메모리 공간중 today1은 010FF820에, today는 010FF830에 위치하는데, today1의 Sunday 다음에 널 종단문자 '/0'가 없기 때문에 쭉 쓰레기값이 참조되다가, Sunday!!뒤의 널 종단문자 '/0'를 만나서 멈추게 되는 것입니다.
6.
int arr[3] = {1,2,3};
cout << "arr = " << arr <<endl;
위의 출력 결과는 어떻게 될까요?
배열의 시작 주소가 출력됩니다.
포인터는 메모리의 시작 주소를 가리킵니다.
따라서 대괄호 []와 인덱스가 없는 배열은 포인터와 같습니다.
7.
포인터에는 메모리 주소가 할당되어 있습니다.
만약 메모리 주소에 들어있는 값을 가져오고 싶다면 어떤 연산자를 사용해야 하며
어떤 코드를 작성해야 할까요?
역참조 연산자 *(애스터리스크)를 사용하시면 됩니다.
int num = 0;
num = *arr;
8.
int arr[3] = {10,20,30};
만약 arr 배열의 두번째 요소의 값을 역참조 연산자(애스터리스크 : *)를 이용해서 구한다면 어떻게 표현할 수 있을까요?
(1) *arr+1
(2) *arr+4
(3) *(arr+1)
(4) *(arr+4)
숫자 4가 왜 들어갔는지 궁금하실 수 있습니다.
데이터 타입인 int형이 4바이트를 차지하기 때문에
시작주소 + 4바이트를 건너뛴 주소가 arr 배열 두번째 요소의 주소라고 생각하시는 분도 있으실 겁니다.
하지만 위의 결과를 확인해 본다면,
(1)번은 arr[0]의 값인 10에 1을 더한 값
(2)번은 arr[0]의 값인 10에 4를 더한 값
(3)번은 arr[0+1]의 값인 20
(4)번은 arr[0+4]의 값이어야 하는데, arr 배열은 인덱스가 3인 값 까지만 들어있기 때문에 쓰레기값이 들어간 것을 확인할 수 있습니다.
9.
int arr[3]={1,2,3};의 경우, 만약 arr의 시작 주소가 1000이라면 , arr+1의 결과가 주소 1001이 되지 않을까?
그렇지 않습니다.
arr배열의 데이터 타입은 int이기 때문에, arr+1은 sizeof(int)형태가 됩니다.
자동적으로 주소값을 계산해준다고 생각하시면 됩니다.
배열의 대괄호 [] 안에 들어가는 인덱스와 같다고 보시면 됩니다.
arr는 arr[0] 즉, (arr+0)이기 때문에 시작 주소를 의미한다고 생각하시면 될것 같습니다.
10.
int arr[3] = {10,20,30};
이번에는 arr배열을 포인터를 이용해서 표현해보기로 합니다.
1) arr 를 그대로 이용해서 대괄호 []를 이용하지 않고 배열의 두번째 요소에 해당하는 값을 출력하는 코드를 작성해 보세요
2) pArr 포인터를 선언하고, pArr 포인터를 이용해서 배열의 세번째 요소에 해당하는 값을 출력하는 코드를 작성해 보세요
3) pArr 포인터를 이용해서 대괄호로 배열의 세번째 요소에 해당하는 값을 출력하는 코드를 작성해 보세요
'--------------------** > C++ 프로그래밍2' 카테고리의 다른 글
c++ vector (0) | 2020.02.16 |
---|---|
포인터 (0) | 2020.02.10 |