특정 유형의 포인터를 선언하는 중에 실제로 어떻게됩니까? 포인터 산술 또는 인덱싱 이외의 포인터에 유형을 지정하는 용도가 있습니까?포인터 유형을 지정하는 이유는 무엇입니까?
답변
유형은 다음 포인터를 역 참조의 예는 다음과 같은 경우 포인터를
간접 참조
- 필요하다.
{ char *ptr; //pointer of type char short j=256; ptr=&j; // Obviously You have to ignore the warnings printf("%d",*ptr) }
지금은 하나의 바이트를 읽을 수 있도록
ptr
는 char 형의이기 때문이다. 그러나 256의 이진 값은0000000100000000
이지만ptr
은 유형이char
이므로 첫 번째 바이트 만 읽으므로 출력은0
이됩니다.참고 : j = 127을 지정하면 127이 첫 번째 바이트로 유지되므로 127이됩니다. 이제
,
pointer arithmetic
의 예 : 문var++
이{ int *ptr; int var=0; ptr=&var; var++; ptr++;// pointer arithmetic }
하고
ptr++
이 같은 일입니까? 아니,var++
은var=var+1
을 의미하고ptr++
은ptr=ptr+4
을 의미합니다. 컴파일러는이 포인터를 가리키며 포인터가int
을 가리키므로4
을ptr
에 1 대신 추가하므로 포인터가 다음 정수를 가리키고 있습니다.
이유 중 하나는 포인터를 역 참조 할 때 읽어야 할 바이트 수를 알아야한다는 것입니다. Dereferencing char
포인터는 int
의 경우 메모리에서 1 바이트를 가져 오는 것을 의미하지만 4 바이트가 될 수 있습니다.
그게 전부입니까? 나는 대답이 "당신이해야하기 때문에"- auto x = * ptr;, func (* ptr); ... – LogicStuff
@LogicStuff 내가 당신을 쫓고 있는지 미안하다고 생각했습니다. 부족한 점이 있으면 다른 답변을 추가하십시오. 나는 또한 질문이 그것 같이 표를 붙여 졌기 때문에 주로 C 관점에서이 질문에 대답했다. –
오, 그럼. 이 질문에 대한 첫 번째 의견을 말하고있는 것입니다. – LogicStuff
포인터를 역 참조 할 때 데이터 유형이 필요하므로 읽어야하는 데이터의 양을 알 수 있습니다.
예를 들어, dereferencing char 포인터는 가리키는 주소에서 다음 바이트를 읽어야하고 int 포인터는 2 바이트를 읽어야합니다.
더 이것을 참조 :
int *ip; /* pointer to an integer */
double *dp; /* pointer to a double */
float *fp; /* pointer to a float */
char *ch /* pointer to a character */
실제 데이터 유형 : Why is it necessary to declare the types that pointers point to?
포인터 값이 포인터 타입에 대한 다른 변수
여기있는 몇 가지 예 주소 인 변수 integer, float, character 또는 다른 포인터와 같은 모든 포인터의 값은 메모리 주소를 나타내는 긴 16 진수로 동일합니다.
다른 데이터 유형의 포인터의 유일한 차이점은 데이터 변수의 종류 나
이것은 모두 정의가 좋습니다. 나는 질문이 포인터의 사용에 대해 더 많은 것, 그것이 당신이 데이터 타입을 아는 것에 또한 얻는 것이라고 생각한다? –
"모든 포인터 값의 실제 데이터 유형은 ... 동일합니다." 그건 (반드시) 사실이 아닙니다. 단어로 주소가 지정된 컴퓨터는 단어의 주소 (일반적으로 정수, 부동 및 구조 포인터 포함)에 대해 하나의 데이터 유형을 사용할 수 있으며 단어의 주소 + 단어 내의 오프셋 (char 포인터 및 void 포인터). 분할 된 아키텍처는 "함수 포인터"에 대해 다른 유형을 사용하는 경우가 많습니다. 마지막으로 완전히 다른 짐승 인 "멤버 함수 포인터"/ "멤버 함수 포인터"의 모든 재미와 게임이 있습니다. –
포인터 포인터 포인트는 또한 클래스의 유효한 오브젝트를 가리키는 지 일정하다. 유형이없는 경우 클래스 구성원에게 액세스하기위한 정보를 얻을 수 없습니다. 포인터
class CPerson
{
public:
std::string GetName();
};
CPerson oPerson;
CPerson *pObj_1 = &oPerson;
pObj_1->GetName();
void *pObj_2 = &oPerson;
pObj_2-> ?? // what all I can access now ?
- 크기 : 몇 바이트까지 액세스합니까? 1 바이트의
char
읽기/쓰기는long
≥ 4 옥텟을 쓰는 것과 같지 않습니다. - 정렬 : 두 가지 유형은 길이가 같지만 정렬이 다를 수 있습니다. 하나의 데이터 유형을 특수 레지스터에 넣고이 레지스터에서 /로 이동하는 메모리는 특별한 정렬 요구 사항을 갖습니다.
- 표현 : 동일한
sizeof
및_Alignof
일지라도 표현이 다를 수 있습니다.*float_ptr = 4
을 지정하면4
은4.0
으로 변환됩니다. - 유형 안전 :
void **ptr1, **ptr2; *ptr1+*ptr2;
과 같은 중대한 위법 행위가 탐지 될 수 있습니다.
- 1. 다른 유형을 가리키는 포인터
- 2. 인쇄 유형을 지정하는 방법은 무엇입니까?
- 3. 웹 API에서 경로 매개 변수 유형을 지정하는 이유는 무엇입니까?
- 4. 포인터 유형을 사용한 산술/
- 5. JPA CriteriaBuilder에서 시간 유형을 지정하는 방법은 무엇입니까?
- 6. 컬렉션 리터럴의 대상 유형을 지정하는 방법은 무엇입니까?
- 7. 제약 조건이있는 유형을 지정하는 방법은 무엇입니까?
- 8. Drools 5.5에서 목록 유형을 지정하는 방법은 무엇입니까?
- 9. app.config에서 클래스 유형을 지정하는 방법은 무엇입니까?
- 10. 일반적인 방법으로 개체 유형을 지정하는 방법은 무엇입니까?
- 11. MS Access에서 BLOB 유형을 지정하는 방법은 무엇입니까?
- 12. 표현식 트리의 반환 유형을 지정하는 방법은 무엇입니까?
- 13. groovy에서 요청시 콘텐츠 유형을 지정하는 방법은 무엇입니까?
- 14. 선호하는 MIME 유형을 지정하는 방법은 무엇입니까?
- 15. CMake에서 연결 유형을 지정하는 방법은 무엇입니까?
- 16. cblas_dgemm과 cblas_sgemm이 함수 포인터 배열에서 다른 포인터 유형을 갖는 이유는 무엇입니까?
- 17. iterator_traits에서 중첩 포인터 유형을 사용하는 것은 무엇입니까?
- 18. WinRT 유형을 봉인해야하는 이유는 무엇입니까?
- 19. 정적 유형을 던지는 이유는 무엇입니까?
- 20. GLib이 유형을 재정의하는 이유는 무엇입니까?
- 21. 힙의 다른 객체를 가리키는 힙의 포인터 유형을 가리키는 포인터 유형을 할당 해제하는 방법은 무엇입니까?
- 22. 나는이 유형을 지정하는 방법을 일식
- 23. 키보드 유형을 지정하는 방법이 있습니까?
- 24. 런타임에서 genric 유형을 지정하는 방법
- 25. 팩토리 객체의 유형을 지정하는 방법
- 26. NativeQuery에서 열의 반환 유형을 지정하는 방법
- 27. #define은 변수 유형을 지정하는 데 어떻게 필요하지 않습니까?
- 28. int32_t가 stdint.h에서 int로 별명을 지정하는 이유는 무엇입니까?
- 29. InitialHeapSize를 1m 이상으로 지정하는 이유는 무엇입니까?
- 30. 인쇄 결과에 잘못된 구문을 지정하는 이유는 무엇입니까?
유형이 없으면 포인터가 가리키는 점을 어떻게 알 수 있습니까? – RedX
위치가 할당 된 데이터 유형을 모른 채 포인터를 통해 메모리 위치에 데이터를 쓰는 방법은 무엇입니까? – haccks
관련 또는 중복 : [C++에서 포인터 변수와 참조 변수의 차이점은 무엇입니까?] (http://stackoverflow.com/q/57483/514235) – iammilind