중간점검 문제인데요.
4. 정수형 포인터 p가 가리키는 위치에 25을 저장하는 문장을 써보아라
int i = 25;
int *p =&i;
이거잖아요.
근데
int *p= NULL;
*p= 25;
이렇게 하면 왜 안되요?
null(0)이 정확히 주소 0을 가리킨다는거예요? 아님 아무것도 안가리킨다는거예요?
5. int형 포인터 p가 80번지를 가리키면 (p+1)은 몇번지를 가리키는가?
포인터가 증가하면 포인터가 가리키는 객체의 크기가 증가한다( 객체가 뭔지 모르겠어여;)
번지수가 포인터 데이터형만큼 증가한다는거예요?
int형 크기는 4니까 84예요? 객체의 크기가 번지예요?
6.(p+3)
그럼 이건 p+1+1+1이라고 생각해서
4+4+4=4*3 해서 12더하는거예요?
4. 정수형 포인터 p가 가리키는 위치에 25을 저장하는 문장을 써보아라
int i = 25;
int *p =&i;
이거잖아요.
근데
int *p= NULL;
*p= 25;
이렇게 하면 왜 안되요?
null(0)이 정확히 주소 0을 가리킨다는거예요? 아님 아무것도 안가리킨다는거예요?
5. int형 포인터 p가 80번지를 가리키면 (p+1)은 몇번지를 가리키는가?
포인터가 증가하면 포인터가 가리키는 객체의 크기가 증가한다( 객체가 뭔지 모르겠어여;)
번지수가 포인터 데이터형만큼 증가한다는거예요?
int형 크기는 4니까 84예요? 객체의 크기가 번지예요?
6.(p+3)
그럼 이건 p+1+1+1이라고 생각해서
4+4+4=4*3 해서 12더하는거예요?
한꺼번에 졸라 가르키는가보네
ㄴ 이렇게 하면 오류는 안나는데 실행이 안되여;;;;;;;;;;;
ㄴ #include<iostream>using namespace std; int main() { int *p=NULL; *p= 25; cout << *p; } 했는데 뭐 잘못한거예요?
4. 아무것도 안가르친다기보다, 정확히 NULL 주소를 의미해. 보통 NULL 주소는 0번지 이고 , 어떤 시스템에서는 0xFFFFFFFF 이기도 해. 이 NULL 주소가 정확히 어떤 주소냐라는 것은 의미가 없고, 정상적으로 사용되지 않는 주소를 NULL 로 사용한다라고 이해하면돼. 즉 NULL 주소에 접근하면 항상 에러가 나게돼.
그니까 null은 주소를 가리키는데 주소0번지라는것은 비정상적인 주소여서(int 형의 포인터주소중 0이랑은 다른건가요?) 주소의 변수값을 출력할때 에러가 난다 이말이예요?
5 와 6 은 니 생각이 맞아. + 연산자의 좌측과 우측 모두 정수형 변수나 정수형 상수가 오면, + 연산자는 정수연산자 + 동작을하는데, 만약 좌측 혹은 우측에 포인터 변수나 포인터 상수(주소를 의미하는숫자나 혹은 그에 상응 하는 니모닉) 가 오면 ,이제 + 연산자는 포인터 연산자 + 로서 동작한다. 포인터 연산자 + 는 좌측 혹은 우측의 포인터 변수나 상수에 따라 연산이 다르게 정의되는데..
그 포인터 변수나 상수가 정수에 대한 포인터라면 가장 기본적인 단위가 정수형의 크기 (4바이트) 가 되지. 만약 크기가 12바이트인 구조체라면 모든 포인터 연산의 산술 연산단위는 12바이트가 되지. 결과적으로 5,6에 대한 거는 니 생각이 맞고 그렇게 이해하면돼
주소 0번지는 비정상적인 주소이고, 0번지에 어떤값을 쓰려고 하거나 , 0번지에서 어떤값을 읽으려하면 에러가 발생해. int 에 대한 포인터 주소들중 0에 해당하는 주소도 같은 주소 공간이지. 결과적으로 int 에 대한 포인터 연산에서도 0번지에 대해 읽고 쓰면 에러가 난다
뭔말인지 이해갔어요 캄사요
아, 써놓고보니. 조금 잘못쓴듯하다. 위의 해킨토시 말처럼, 약간 추상적인 개념으로 접근하면 아무것도 안가르키는 게 맞는 말이긴해, 기계적으로 NULL 값을 가르키게 함으로써 , 아직은 아무것도 가르키지 않은 포인터값을 명시하기 위한거라고 이해하는게 낫겠다. 포인터라는게 항상 유효한 주소를 가르킬수는 없고, 어떤 상태에서는 아무것도 가리키지 않는 상태임을 명시할수 있어야 하는데, 이때 NULL을 써. 결론은 기계적으로보면 명확히 NULL 주소를 가리키지만, 논리적으로 보면 아무것도 가리키지 않는 상태 라고 보면 될거 같다.