CPP_어소_29_포인터 문제 & 풀이 해답

CJB_ny·2022년 6월 21일
0

CPP_AROTHO

목록 보기
27/83
post-thumbnail

배열의 이름은? => 시작 주소이다.


1번

5

sArr 는 short포인터 주소라서 오류가 있을 수 있어서 (int*)로 강제 캐스팅 해주었다.

지금 short 배열의 경우

이게 지금 (pI + 2)이다.

이까지는 이해감.

지금 int형으로 접근을 하면 4바이트씩 접근해서 지금 동그라미 친 부분인데
이것을 정확한 값을 얻기 위해서 (short*)로 캐스팅을 더 해주어서 5가 나오는 것이다.

만약 (short*)로 캐스팅 안해주면 이상한 값이 나오게 된다.

알아야할 것

각각의 자료형마다의 포인터? 주소 접근 방식이 다르다

short = 2byte, int = 4byte맞지만

애초에 sArr이 short라서 캐스팅을 해주어야 정확한? 메모리 주소값이 접근이 가능하다?

short배열이면 그 자료형 타입에 맞게 해주어야 하는지??

2번 ❗❗❗

1
왜? => 배열의 이름은 그 시작 첫 주소이다.

답 틀렷고 아니다 => 이유

short 포인터 타입이라 2바이트 씩 접근을 한다.

지금

1바이트 char 형으로 보면

[ 0 0 0 0 0 0 0 1 ][ 0 0 0 0 0 0 0 1 ]

이런 상태임

그런데 이것을 short로 보고 *pI 이렇게 바로 값에 접근한다고 했으니까

[ 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 ] 이거 아니냐?

=> 그래서 257

이런 상태이다

(이해됨)

이런 느낌? 으로 접근을 하는 것이다.


문제 답은? 100이다.

내가 생각 못한거

지금 느낌적으로 100인것은 알았는데

"완전 별개의 stack이라는 것을 생각하지 못함"

Test(int a)는 Test함수의 지역변수 스택의 a이고

main의 a는 main함수의 스택의 지역변수 a이다.

그래서 Test 에서 a 호출하고 나면 없어지는 것임 (함수 호출하고 끝나면 날라감 -> 스택에서 호출하고 종료하니까)


이게 그냥 진짜 값을 바꾸고 싶으면은

이렇게 주소를 넘겨주어야 바뀐다.

또한 scanf_s 내가 전달해준 주소를 받아가서 값이 바뀐다.

2번 보충 설명 220708 🛫

char cArr[2] = { 1, 1 };

short* ps = (short*)cArr;

int data = *ps;

cArr은 배열이라서 연속적인 메모리 구조를 가짐.

char 형이기 때문에 { 1바이트, 1바이트 }; 이런식임

즉, 비트로 표현을 하면은

{ 0000 0001, 0000 0001 }

이렇게 들어가있음

그런데 이것을 short 포인터 변수가 이해할 수 있도록 cArr을 short*로 캐스팅(형변환 해줌)

short는 2바이트 단위로 "해석"을 하기 때문에 { 0000 0001, 0000 0001 }를 한묶음씩 해석을함.

data에 *ps의 값에 접근을 하게되면 0000 0001 0000 0001 을 정수형 값으로 할당을 해줌

0000 0001 0000 0001 은 word(2byte)이기 때문에

257이다.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글