2012-10-13 6 views
4

포인터가 어떻게 작동하는지 알고 싶습니다. 그래서이 작은 프로그램을 만들었습니다. 우선 char 포인터를 가리키는 p 포인터를 만듭니다.char 및 char * (포인터)

첫 번째 질문은이 시점입니다. 내가 포인터를 만들면 그 값은 memoryaddress입니다 (포인터가 아닌 객체를 가리키면).하지만 이번에는 내 예제에서 "haha"입니다. char *에서이 방식으로 작동하는 이유는 무엇입니까? 그리고 cin >> p로 어떻게 가치를 더할 수 있습니까?

두 번째 질문은 내가 만든 포인트에서 * p 포인터의 값을 가진 q char를 생성한다는 것입니다. 그러나 그것의 가치와 주소는 "h"도, 그러나 왜? 이 char 객체의 메모리 주소 여야합니다! 이는 무의미 : D (와 Mingw - GCC)

int main() { 
    char *p; 
    cin >> p;      //forexample: haha 
    char q = *p; 
    cout << "&q = " << &q << endl; //&q = h 
    cout << "q = " << q << endl; //q = h 
    return 0; 
} 

MORE : 처음 A [100] 숯불에 메모리를 할당하는 경우; char * p = a; 그때 & q = h»ŢĹ, 그래서 "h"와 어떤 혼란. 하지만 그것은 메모리 주소 여야합니다! 그리고 내 질문은 왜 그때 주소가 아닌가요?

+1

도움이되기를 바랍니다. 'p'는 당신이 입력 할 메모리가 없습니다. – chris

답변

5

메모리의 주소는 char* p;입니다. 아무 것도 가리 키지 않도록이 포인터를 초기화하지 않았으므로 사용할 수 없습니다.

항상 안전을 위해 :
중 하나를 초기화 포인터 제로 :

char *p = 0; // nullptr in C++11 

또는 초기화 일부 자동

void foo() { 
    char a[100]; 
    char *p = a; 
} 

또는 글로벌 메모리 :

char a[100]; 
void foo() { 
    char *p = a; 
} 

또는 동적 얻을 메모리 :

char* p = new char [100]; 

그럼 당신은 operator >> (std::istream&, char* p) 당신의 misunderstaning 들어 ... 데이터를 읽을 수와 페이지에서 읽을


를 P (그렇지 않으면 NULL)를 사용할 수 있습니다. 이 연산자는 p이 일부 메모리 (자동, 전역, 동적 - 상관 없음)를 가리킬 것으로 예상하며 메모리를 단독으로 할당하지 않습니다. 입력 스트림에서 공백 문자를 읽어 들여 p이 가리키는 메모리로 복사하지만 - p은 이미 일부 메모리를 가리켜 야합니다.


주소가 char q; 인 경우. 물론 q의 주소를 취할 수 있습니다 : &q, 유형은 char* p입니다. 그러나 &qp과 다르며이 q=*pp을 가리키는 첫 번째 문자를 q으로 복사하기 때문에 주소는 변경할 수 없습니다. q - 주소는 변경할 수 없습니다. cout << &q의 경우 - operator << (ostream&, char* p)p이 NULL 종료 문자열을 가리키고 - &q"H"을 포함하는 메모리를 가리키고 있지만이 문자는 아무도 알 수 없으므로 화면에 약간의 쓰레기가 생길 것으로 예상합니다. 단일 문자를 인쇄하려면 cout << q을 사용하십시오.프로그램의 상단에

#include <iostream> 
using namespace std; 

:

+0

그래서, cin은 메모리를 할당하지 않는다고 했으니, "haha"는 어디에 있습니까? 포인터가 어떻게 전체 문자열을 포함 할 수 있습니까? q는 간단한 char 변수이므로 p의 임의 문자를 포함 할 수 있으며 "haha"텍스트가 할당되지 않아 내 "h"에 메모리 주소가없는 이유는 무엇입니까? 그것은 분명하지만, 나는 질문이있다 : 나는 문자를 q (char q = * p)에 복사 할 때 실제로 복사하지 않는다. 할당되지 않은 그 데이터를 가리킨다. 그래서 문제는 도처에있다, 나의 하하는 할당되지 않는다. 그래서 나는 어떤 주소도 가질 수 없다? – Iburidu

+0

좋아요, int로 프로그램을 만들었고 int가 할당되었으므로 다음과 같이 할 수 있습니다. << p; 주소를 다시 쓸 것입니다. "int a [10]; int * p = a; cin >> (char *) p; cout << p <<", "<< atoi ((char *) p);" – Iburidu

+1

'p'에'0'이라도 값을 할당하지 않았기 때문에 임의의 주소를 가리 킵니다. 당신은 당신의 프로그램의 임의의 메모리에 "haha"를 복사했습니다. 그것은 무엇이든 일으킬 수 있습니다. 그것은 정의되지 않은 행동입니다. 당신의 직장 상사에게 전자 메일을 보낼 수도 있습니다. 그러나이 랜덤 메모리 당신의 프로그램이 올바르게 작동하고있는 것처럼 보입니다. – PiotrNycz

0

당신은 뭔가를해야한다. 또는 using을 생략하고 std::cinstd::cout을 참조하십시오.

int main() { 
    char *p; 

p

포인터이지만, 어디 또는 어디를 가리 수 있도록 당신은 그것을 초기화하지 않았습니다. 당신은 버퍼 오버 플로우 수 있다는 점을 제외 - 당신이 어딘가에 가리 키도록 p를 초기화 한 경우

cin >> p;      //forexample: haha 

이 괜찮 ...

p = new char[100]; 

: 당신과 함께 예를 들어,를 초기화해야 너무 많은 데이터를 입력하면 가리 킵니다. 이런 간단한 테스트 프로그램에서는 괜찮습니다. 실제로는 테스트를 피하기위한 조치를 취하는 것이 좋습니다.

char q = *p; 
    cout << "&q = " << &q << endl; //&q = h 

&q 유형 char*, char에 대한 포인터이다. char* 값을 cout으로 보내면 포인터 값 (메모리 주소)이 인쇄되지 않습니다. 그것은 가리키는 문자열을 인쇄합니다. (. 좀 이상한 결과를 얻고 있지만 내가 나 자신을 실행할 때, 내가 뭔가를 누락 될 수 있습니다) 당신은 포인터 값을보고 싶다면, void*에 캐스팅 :

count << "&q = " << (void*)&q << endl; 

(또는 당신이 중 하나를 사용할 수 있습니다 .는 C++ - 특정 캐스트, 나는 가장 적합한 확실하지 않다) 여기

cout << "q = " << q << endl; //q = h 

q 그냥 char, 그래서 이것은 문자로 그 값 출력 : h합니다.

return 0; 
} 
+0

예, 제 코드에 처음 두 줄을 찍었습니다.하지만 그 명백한 점은 여기에 넣지 않았습니다. 나는 그것을 이해하지만, cout << & q는 cout << p이어야한다, 그렇습니까? 그리고 그것의. & q = "h"그리고 p = "haha" – Iburidu

2

포인터에 대해 배우고 항상 기억해야 할 점은 메모리를 할당해야한다는 것입니다. 그렇지 않으면 프로그램이 제대로 실행되지 않습니다.

"CIN"할당 된 메모리에 사용자 입력을 쓸 수 있도록 메모리를 할당하는 코드는 다음과 같이 실제로 수정해야합니다, 문자 포인터는 위치에 변수를 가리키는 지금

int main() { 
    char *p = new char[1024];  // allocate memory so cin 
    cin >> p;      //forexample: haha 
    char q = *p; 
    cout << "&q = " << &q << endl; 
    cout << "q = " << q << endl; 
    return 0; 
} 

입니다 문자 변수가 실제로는 단일 문자 (문자 세트가 아닌)를 보유하고있는 동안 문자 집합을 지닌 메모리 (반드시 한 문자가 아니거나, 둘 이상일 수도 있고, 특수 값 null의 경우와 같이 어쩌면 아무 것도 아닐 수도 있음).

포인터를 처리 할 때 기본 연산자는 & (주소) 및 * (값 at)입니다. &은 변수의 주소를 검색하므로 [char q;]가 있으면 [& q]가 문자 포인터가됩니다. 반면 *는 주어진 포인터에서 값을 가져 오므로 [char * p;]가 있으면 [p]는 p가 가리키는 메모리의 문자가됩니다.이제 다시 예

, 인라인 그림

int main() { 
    // allocate a place of 1024 character in memory 
    // and let p points to that place 
    char *p = new char[1024];  

    // call cin to read input from the user and save 
    // it in memory at the location pointed to by p 
    // NOTE: cin would put an extra NULL character 
    // at the end to terminate the string 
    cin >> p;      //forexample: haha 

    // Now p would be pointing to a piece of memory like this 
    // [h] [a] [h] [a] [\0] 

    // use the value at operator to de-reference the pointer 
    // p, the result would be a single character which 
    // will be the first character in memory p is pointing at 
    char q = *p; 

    // printing the value of (the address of q) 
    // Note you have a problem here as cout will 
    // be handling the memory starting at the address 
    // of q as a string while it is not, so you 
    // will get a string starting with "h" and followed 
    // by whatever is there in memory by the time of execution 
    cout << "&q = " << &q << endl; 

    // printing the value of the character q 
    cout << "q = " << q << endl; 
    return 0; 
} 

에 대한 코멘트 나는 그것이 안전하지

+0

예, 분명히 p에 장소를 할당하면 & q에 "h and some mess"을 씁니다. 그러나 p에 장소를 할당하지 않으면 " h "만, * p와 같은 것입니다. 그래서 q = & q? : D하지만 PiotrNycz가 맞았다 고 생각합니다. "haha"가 할당되지 않았기 때문에 메모리 주소가 없으므로 & q (p)는 아무 곳이나 가리킬 수 없지만 "h "그럼? – Iburidu

+0

@Iburidu 컴퓨터/컴파일러에서 발생하는 특별한 경우는 일반적인 경우가 아닙니다. 할당되지 않은 메모리 공간에 데이터를 저장 한 결과는 예측할 수 없습니다. 귀하의 경우에는 메모리가 이미 0으로 가득 차 있기 때문에 & q를 시작하는 문자열을 인쇄하면 "h"가 올바르게 출력됩니다. – Hisham

+0

좋아요. char a [100]을 추가하여 할당했습니다. int * p = a; 하지만 메모리 주소 (& a [0])가 필요한 경우 p == "haha"인 이유는 무엇입니까? – Iburidu