#include <stdio.h>
struct T{
short x;
char y;
};
struct S{
char x;
struct T* t;
short y;
};
int main(){
struct S a[10];
struct S* p=&a[0];
struct S* q=&a[3];
printf("%d\n", (int)(q-p));
printf("%d\n", (int)q-(int)p);
printf("%d\n", q-p);
// printf("%d\n", (int)q-p);
return 0;
====================================
결과는 똘똘한 님들이 예상한대로
첫번째 3
두번째 36
세번째 3
이잖아
근데 왜 이것들이 나오는질 모르겠네
q-p 하면 포인터 연산인가? 저기에 (int) 로 형변환을 왜 한건지 모르겠네
세번째 프린트문 (주석처리한부분) 이랑 첫번째 프린트문 이랑 답은 같고,
두번째는 36인거 포인터 q와 p사이의 바이트 수를 계산한거 맞나?
요약하면
1. 왜 저런 답이 나오는가
2. (int)(q-p), (int)q-(int)p 의 값이 다른건 왜인가
부탁좀
1.은 포인터연산을해서 그럼..
36이 나오는건 알겠는데 왜 3이 나오는지는 모르겠네
2. 왼쪽꺼는 포인터연산하고 인트형으로 바꿔줘서 그렇고
오른쪽꺼는 인트형으로 바꾼다음에 빼줘서그래
포인터연산에서 1은 바로 다음의 주소값이야
저 위에 피는 에이의 첫번째꺼고 큐는 에이의 네번째니깐
두개를 빼서 삼이나와
*p + 4 = &a[4]
730//친절한 설명 고마워, 그니까 첫번째 3나오는거는 q가 a[3] 가리키는 거고 p가 a[0] 가리키는 거라 둘이 배서 3이라 보면되나? 그리고 2번의 경우는 인트형으로 바꾼건 알겠는데 바꾸니까 왜 byte 계산으로 넘어가는지좀...알려주믄 안될까?
난이때까지 p + (sizeof(S)*4) = &a[4] 이렇게만썻었는데
인트로 형변환하면 해당하는 주소값을 그대로 숫자표시해주는데
책을다시봐바야겟네 왜 캐스팅하는거랑 안하는거랑 차이가 어째서 생겨나는지
책을다시봐바야겟네 왜 캐스팅하는거랑 안하는거랑 차이가 어째서 생겨나는지
Night...// 그런 방법은 또 뭐야? 쫌 복잡시런거같은데, 글고 저문제는 시험문제라 일부러 꼬아논거 같어
그 다음 주소값은 A[0]으로부터 36바이트가 떨어진곳에서 주소값이 시작되니깐 이겠지..
그럼 인트로 형변환하기전에는 첫번째 배열주소에 1씩 다음 주소들이 할당되는거야? 타입에 관계없이?
730//다시한번 고맙고, 그니까 q의 주소랑(a[3]) p의주소(a[0]) 두개뺀거니까 36이다 이거지? ㄳㄳ 이거 책에서 볼라면 형변환 부분을 봐야되는건가? 형변환 봐도 포인터랑 엮이는 부분은 별로 없는거 같아서 위 예제에 적합한 부분을 못찾겠네 제기럴
나잇위시가 이해한게 맞아
포인터연산만 잘 공부하면 될거같은데..
ㅇㅇ 포인터연산에서,, \"포인터는 타입만큼 이동한다\" 라는 부분을 보면될듯해.. 나도 다시함봐바야겟는걸 // 730 쌩유
어제 졸면서 봐서 그런가 책에 포인터 연산부분이 없던데, 다른책 뒤져봐야겠네 정말 고마웡~
night..// 그니까 포인터는 타입만큼 이동하는데 형변환 하니까 주소값을 나타낸다는건...몰랐어 이거 당연히 알고있어야 되는거야? 내가 상식이 없는겨? 아님 잘 안쓰는 형식으로 문제를 낸겨
int *ppp;
ppp++;
이러면 4만큼 이동하지?
형변환하면 주소값을 숫자로 나타내는거지
포인터 자체가 주서값을 나타내는거고
ㅇㅇ형변환하면 주소값을 숫자로 나타내는걸 나는 몰라서 이해를 못했엇어
나잇위시/ 1더해준거니간 ppp의 다음 주소값을 가리키는거
NightWish // 맞지 4
ㅇㅇ 책좀다시꺼내보면서 정리해놔야겟다