2013-06-15 6 views
1
main() 
{ 
int a[]={5,4,3,2,1}; 
int *p[]={a,a+1,a+2,a+3,a+4 }; 
int **ptr=p;//what does it really means 
cout<<a<<*a;/*prints the address of a, value of a[0] (i understand this line)*/ 
cout<<endl<<p<<*p<<**p;/*prints the address of p, address of a, value of a[0] (understands this line's logic too)*/ 
cout<<endl<<ptr<<*ptr<<**ptr;\*this line's o/p is same as the previous one cant understand why*/ 
} 

** ptr 의미는 무엇이며 왜 세 번째 줄의 출력은 두 번째 줄과 같은지 설명하십시오.** 포인터 사용 **

그리고 하나 더 의심 : 나는이 무엇인지 널 포인터 에 대한 모든 표현되어있는 문서의 읽기

  1. int *ptr=(char *)0;
  2. float *ptr=(float *)0;
  3. char *ptr=(char *)0;

(문자 *)를 나타냅니다.

+6

그것은 무엇을 의미합니다. 이것은 int에 대한 포인터에 대한 포인터입니다. – chris

+0

2 번 라인을 이해한다면 3 번 라인을 사용하지 않으시겠습니까? 똑같지 않니? –

+1

@ CarlNorum no .. – Elazar

답변

3

배열 붕괴를 포인터로 그들의 첫 번째 요소에 여러 상황에서 당신이 거기에서 사용하고있는 표현 문맥을 포함해서. 우리가 명백하게 array이 아닌 &array[0]을 그 라인의 몇 가지로 사용한다면 아마 더 의미가있을 것입니다. 첫째, ptr의 선언 :

int **ptr = p;  // ptr is a pointer to the first element of p 
int **ptr = &p[0]; // and this expression is equivalent. 

다음, p 친구의 인쇄 - 다시, 두 표현식은 동일합니다.이제

cout << endl << p << *p << **p; 
cout << endl << &p[0] << *&p[0] << **&p[0]; 

ptr 라인의 인쇄 - ptr&p[0]이기 때문에, 당신은 라인 모두 동일하다는 것을 볼 수 있습니다

cout << endl << ptr << *ptr << **ptr; 
cout << endl << &p[0] << *&p[0] << **&p[0]; 

을 그리고 두 번째 줄 두 번째 줄과 동일있다 바로 위에 있기 때문에 동일한 결과를 얻을 수 있습니다.

comp.lang.c FAQ section 6, Arrays and Pointers을 읽는 것이 좋습니다.

1
int **ptr=p 

포인터

INT에서 * P가 [] 내에서 예 포인터 배열 int 배열 (a)의 어드레스를 보유 int로 포인터.

예제에서 동일한 결과가 나오는 이유. ** ptr 및 * p [0] ara와 동일합니다. * ptr == * (ptr +0) == ( (p + 0)) == ** p // 배열 a의 0 번째 요소를 모두 가리 킵니다. , C에서 모든 유형의 을 우리가 int로 포인터를 가질 수 있기 때문에

` 및 포인터는 char, 및 구조에 대한 포인터는 우리가 정의한, 사실 포인터의 :

-1

http://www.eskimo.com/~scs/cclass/int/sx8.html에서 촬영 그것은 우리가 다른 포인터에 포인터를 가질 수 있다는 것을 놀랍게도 많이 으로 오지 말아야합니다. 우리는, 그리고 우리의 마음 포인터 자체 무엇, 우리는 우리가 있지만, 너무 포인터에 대한 포인터에 대해 을 생각하는 을 할 수 있어야하는 점 사이의 구별에 명확한 유지하기 위해 간단한 포인터에 대해 생각하는 데 사용하는 경우 이제는 포인터 사이에 을 구별해야하고 은 포인터가 가리키는 점을 구분합니다. 는 (그리고, 물론, 우리는 또한 있지만이 빠르게 어떤 실제 사용이 너무 난해한되고, 포인터에 대한 포인터에 포인터에 포인터 포인터 포인터, 또는 포인터로 끝날 수 있습니다.) a의 선언 포인터 투 포인터 모양 like int ** ipp; 두 개의 별표는 두 개의 포인터 수준이 관련되어 있음을 나타냅니다.

int i = 5, j = 6; k = 7; 
int *ip1 = &i, *ip2 = &j; 
: 그것을 가리 키도록 위해 그 포인터를 일부 INT들에 가리하는 익숙한, 창의성, 유치원 스타일의 예제 오프부터, 우리는 일부 포인터를 선언 IPP의 사용을 보여줄 수

이제 우리는 내가 가리키는 IP1에

ipp = &ip1; 

및 IPP 포인트를 설정할 수 있습니다. * ipp 은 ip1이고 ** ipp는 i 또는 5입니다.

...

포인터에 대한 포인터는 실제로, 좋은 무엇입니까? 하나의 사용은 함수 대신 포인터 인수를 통해 을 공식 반환 값으로 반환합니다. 이를 설명하기 위해 먼저 포인터를 통해 함수에서 int와 같은 간단한 유형을 반환하는 의 경우를 생각해 봅시다. 우리가 기능을 다음

f(int *ip) 
{ 
*ip = 5; 
} 

및 작성하는 경우 다음과 같이 호출 :

int i; 
f(&i); 

그때까지 를 통과 포인터에 의해 지정된 위치로 를 작성하여 ''값 5를 반환합니다 F 발신자; 이 경우 호출자의 변수 i에 전달됩니다. 함수는 반환 할 값이 여러 개인 경우 값을 반환 할 수 있습니다. 함수는 반환 값을 통해 값을 반환 할 수 있습니다. 즉 값을 반환 할 수 있습니다. 알아 두어야 할 중요한 점은 함수가 int 유형의 값을 반환하기 위해 포인터를 int 유형의 매개 변수로 사용한다는 것입니다. 이제 함수가 포인터를 이런 식으로 반환하려고한다고 가정합니다. 따라서 해당 매개 변수는 포인터에 대한 포인터 여야합니다. 예를 들어 문자열의 메모리를 할당하려고 시도하는 작은 함수는 다음과 같습니다. 이 성공하면 이 실패하고 1 (0이 아닌 값 또는 true '') 인 경우 0을 반환합니다 (false '') 포인터를 통해 할당 된 메모리의 실제 포인터를 반환 :

#include <stdlib.h> 
int allocstr(int len, char **retptr) 
{ 
char *p = malloc(len + 1); /* +1 for \0 */ 
if(p == NULL) 
return 0; 
*retptr = p; 
return 1; 
} 

발신자 후 할 수있는 일

char *string = "Hello, world!"; 
char *copystr; 
if(allocstr(strlen(string), &copystr)) 
strcpy(copystr, string); 
else fprintf(stderr, "out of memory\n"); 

같은 (이 상당히 원유 예이며, allocstr 기능은 정말 유용하지 않습니다 . 그것은 것 을 호출자가 malloc에 ​​직접 전화하기가 쉬워졌습니다. malloc에 ​​주변 기능 ''래퍼를 작성하기 위해 다른, 더 유용 접근 방식은 우리가 사용했던 chkmalloc 기능을들 수있다.) `

+1

이것은 무의미한 것입니다. – Ulterior

+0

@Ulterior : ** ptr이 의미하는 바를 설명합니다. 그렇지 않습니까? – refi64