C언어 포인터 관련 질문이요~
글쓴이: georgekyung / 작성시간: 월, 2010/02/15 - 4:32오후
int* arr=100 ; 이라고 쓰면,, 100이 어딘지도 모르는데 초기화 불가능 하다고 책에 나와있던데요..
char* str="ABCDE"; 는 문자열상수의 주소값이 반환되어 포인터 변수에 저장된다고 나와있는데...
왜 int* arr=100 ;는 안되는 건가요.?(100도 상수 아닌가요?..)
이상 C언어...를 배우는 ...초보자가... 질문드립니다...
Forums:
#include using namespace
#include
using namespace std;
int main()
{
int* a = (int*)100;
cout << (int)a;
return 0;
}
http://codepad.org/nnrgri1W
It works.
100?
int *pA=100;은 100이란 상수를 저장하는게 아니라
주소값을 100으로 초기화 시키게 되기 때문에 그런 것 같네요.
포인터는 메모리의 주솟값을 가져야 해요.
음.....
문자열 상수..의 경우도... 주소를 저장하는건데요..
그럼 똑같은 격 아닌가요...?
단지 100은 상수이고,,, "ABCDE"는 '문자열' 상수인데.........
.................................................
그냥 받아들여야 하는건가요 ;;?
Geor
상수(literal)라고 다
상수(literal)라고 다 같은 상수는 아닙니다 :)
문자 상수 'A' 는 한 개의 기본 개체(?? primitive type object? 정확한 명칭을 모르겠네요)를 나타내는 상수입니다. 100 같은 수 상수와 비슷합니다. 하지만 문자열 상수 "ABCD" 는 {'A','B','C','D','\0'} 와 같은 "배열" 상수입니다. 100 같은 수가 아니라 {100,200,300} 같은 배열입니다. 배열과 포인터 다루는 법을 좀 더 공부하시면 질문하신 내용이 이해하실 수 있을겁니다.
그리고 이런 질문은 "프로그래밍 Q&A" 게시판에...
윗분 말씀이
윗분 말씀이 맞습니다.
스트링의 경우에는 "..." 일단 스트링이 어떤 메모리에 할당되고 그 주소가 반환되서 숫자나 문자상수랑은 좀 다릅니다.
c++스펙에는 어떻게 명시되있는지는 모르겠으나 (아마 undefined?) 반환된 메모리주소의 특성은 컴파일러마다 다를 수 있습니다.
#include
using namespace std;
void f()
{
char* x = (char*)"ABC";
2[x] = 2[x]+1;
cout << x << endl;
}
int main()
{
f();
f();
f();
}
쓰기가 안되는 주소이면 ABC만 출력되고,
쓰기가 되는 이면 함수 호출때마다 뒷자리 알파벳이 바뀔겁니다.
예전에 VC++에서 했을때는 증가했던거같던데... 정확히 기억은 안나네요.
저 경우에는 항상
저 경우에는 항상 결과가 "ABC"나 "ABD"가 나와야 할 것 같습니다.
그렇지 않다면 초기화 시점에서 x가 초기값이라는 보장이 없다는 건데, 좀 무서운걸요?
표준 좀 찾아봐야겠습니다.
수정:
C 표준 중 다음 문구와
C++ 표준 중 다음 문구가
해당 사항을 나타내고 있는 건가요? 정말 무섭군요.
> What is the difference between software and hard water?
} Bugs drown in hard water, but live forever in software.
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
무슨 책을 읽고 있는지는 모르겠습니다만...
'C 언어 펀더멘탈'과 C 표준을 읽어보시면 답이 나옵니다. :-)
<삭제>
<삭제>
사용 가능합니다.
사용 가능합니다. 다만 시스템 프로그래밍이 아닌 이상 저렇게 쓸 일은 드물지 않나 싶네요.
사용이 불가능하다면 C로 memory-mapped IO라던지 참 많은 것들을 구현할 수 없겠죠.
게다가, int *nullptr = NULL; 같은 코드는 어떻게 동작할까요? NULL은 0 값을 가진 정수 상수인데요.
적절한 권한을 가진 moderator께서는 이 글타래를 프로그래밍 QnA로 옮겨주시길 부탁드리겠습니다.
> What is the difference between software and hard water?
} Bugs drown in hard water, but live forever in software.
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
모두 감사합니다!
아하..이제 좀 알겠군요!
p.s. 프로그래밍 QNA로옮겼습니다 ㅎㅎ..(죄송합니다 ;;)
Geor
댓글 달기