2011-01-27 2 views
1

포인터 변수 선언이있는 경우C++ 포인터 - 여기에 어떤 값이 들어 있습니까?

int *;
int ** c; 유형에 대하여 및 값 어떻게 각각 다음과 같이 될 것이다 개최

:

a

유형 int*이다 및 memory address

*a 유형 int이다 유지되며 것 포인터가 가리키는 변수의 값을 보유

cint**이고, ???????????????????

c*

int*이다 및

c** 유형 int이다에서 포인터가 가리키는의 메모리 어드레스를 보유하고, 그 포인터 cb를 포인터 가리키는 가정하며, 포인터 b가 가리키는 변수 a, 여기서 값은 변수의 값이됩니다 a

확실하지 않은 c을 제외하고이 방법이 올바른가요?

감사합니다.

+0

주소 ...? – ruslik

+3

'* c' 와'** c'. 'c *'와'c **'는 의미가 없습니다. – aschepler

+0

코드'a *'는 실제로 아무 것도 가리 키지 않는 포인터'a'를 결코 말하지 않았기 때문에, 코드 뒤에 잘못된 표현식을 사용하는 것을 고려하는 것이 중요합니다. 'int'에 메모리를 할당하지 않았습니다; 포인터 만. –

답변

7
int *a; 
int **c; 

정확도는 a입니다. apointer to int이있는 것이 더 일반적입니다.

cint**이고 pointer to a pointer to int을 보유합니다.

*cint*이며, pointer to int을 유지합니다.

**cint이고 정수 값을 갖습니다. bb을 가리키는 c에 대해 정확하면 a을 가리 킵니다.

몇 가지 도움을 받으려면 cdecl을 참조하십시오. :)

+0

예를 들어'a가 int에 대한 포인터를 보유하고있다 '고 말하면,'pointer'의 값은 무엇입니까? 항상 '메모리 주소'입니까? '메모리 주소'를 훨씬 간단하게 유지한다고 말하는 것이 아닙니까? 감사합니다 – Simplicity

+1

@ user588855 : 사실 그것은 메모리 주소이지만, 개념적으로 적절한 유형의 객체를 찾는 데 사용할 수있는 * something *입니다. 많은 아키텍처에서 포인터는 실제 메모리 주소 (하드웨어 주소)를 보유하지 않지만 하드웨어가 실제 메모리 뱅크와 해당 뱅크 (가상 주소) 내의 주소에 매핑되는 다른 값을 보유합니다.트랜잭션 메모리 시스템에 대해 생각해 보면 트랜잭션이 커밋되기 전과 후에 다른 포인터를 참조하여 동일한 포인터를 사용하여 해시 테이블을 인덱싱하는 데 사용되는 고유 식별자 일 수 있습니다. –

+0

+1에 대한'cdecl'. – user470379

2

c는 int ** 유형이며, ???????????????????

'c'도 'a'와 마찬가지로 메모리 주소를 보유합니다. 차이점은 'c'는 역 참조 될 때 다른 메모리 주소를 반환한다는 것입니다. 다른 수준의 간접 지정을 추가하는 것입니다.

2

예에서 cint*에 대한 포인터를 보유합니다. 즉, c은 포인터에 대한 포인터입니다. 행렬과 같은 다차원 배열에 사용할 수 있으며 함수 매개 변수로 사용하여 사용자의 int*을 변경할 수 있습니다.

1

모든 포인터는 메모리 주소를 보유합니다. 이 경우 cint*에 대한 포인터이므로 해당 변수의 메모리 주소를 보유합니다.

종종, 더블 포인터는 C에서 동적 multiarrays을 만드는 데 사용됩니다 당신은 here

2

을 볼 수 있습니다 - int 형 *의 IS, 그리고

올바른 메모리 주소를 개최한다

- * a는 int 유형이며 포인터가 가리키는 변수의 값을 보유합니다.

정확하게 : *는 주소가 가리키는 변수에 대한 참조가됩니다. * a = 8을 시도 할 때 이것을 볼 수 있습니다. int * x = & (* a)). 값이라면 변경할 수 없습니다. 그러나 참조이기 때문에 값은 원래 위치로 "라우팅"됩니다 ...이 경우에는 메모리가 가리 킵니다.

-c는 int ** 유형이며, ???????????????????

c는 int를 가리키는 메모리 주소를 가리키는 메모리 주소를 보유합니다.

* c는 int를 가리키는 메모리 주소에 대한 참조를 보유합니다. 그렇게 할 수 있습니다 : * c = a;

** c는 * a와 같습니다.

1

C 유형은 int *입니다. 그것으로부터 분명히 알 수 있듯이, 그 자체로 메모리 주소 인 int * 타입의 데이터를 보유 할 것이다. 이 개념은 far 포인터라고하며 특정 한계까지 여러 개의 far 포인터가있을 수 있습니다.

int ** c와 마찬가지로 int *** d가 int ** c를 가리킬 수도 있습니다. 이것은 모든 포인터가 다음 포인터를 가리키는 대기열과 같고 데이터를 실제 변수로 갖는 프런트입니다.

0

내가 생각할 수있는 가장 간단한 것은 공백으로 재생하는 것입니다. 컴파일러는 정말 상관하지 않지만, 추론 쉽게 때문에 선언의 구문과 사용법 (설계) 같은 사실에 있습니다 : 감안할 때

:

int ***a; // declaration 

int*** a; // type of a is an int*** (read: pointer to pointer to pointer to int) 
int** *a; // the type of the object pointed by a (*a) is int** 
int* **a; // the type of **a is int* 
int ***a; // the type of ***a is int 

면책 조항 :이 함께 데이터 유형을 존중합니다. 런타임시 포인터를 역 참조 할 수 있는지 여부는 다른 문제입니다 (초기화 되었습니까? 올바른 메모리를 가리 킵니까? ...)

관련 문제