2014-12-12 3 views
-2
#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    int *p, n, i; 
    printf("Enter the size of the array:"); 
    scanf("%d", &n); 
    p = (int *)malloc(n * sizeof(int)); 
    for (i = 0; i < n; i++) 
    { 
     printf("\n Enter element %d:", i + 1); 
     scanf("%d", &p[i]); 
    } 
    for (i = 0; i < n; i++) 
     printf("\n %d", p[i]); 
    return 0; 
} 

&을 scanf에 쓰는 이유는 무엇입니까? 배열 인 경우 필요하지 않습니다. p은 모든 메모리 공간을 가리키는 포인터이므로 &p[i]은 포인터의 주소를 지정해야하지만 데이터를 저장하려는 위치는 지정하지 않아야합니다. 또한 *p[i]printf에 쓰면 오류가 발생하므로 p을 포인터로 사용하여 메모리를 예약하고 메모리의 예약 된 공간에 데이터를 저장해야하지만 작동하지 않습니다. 위의 프로그램을 그대로 컴파일해도 3 개의 값을 입력으로 사용하면 작동을 멈 춥니 다. 값이 p[i]C 메모리 할당 (malloc)

p[i] = *(p+i) 

경우

+1

[malloc의 결과를 캐스팅하지 마십시오] (http://stackoverflow.com/q/605845/296974). – glglgl

+0

프로그램에 제공하는 정확한 입력은 무엇입니까? 당신이 얻고있는 정확한 결과는 무엇입니까? –

+0

"p는 포인터이므로 우리는 그것을 고쳐야한다":'* (p + i) '와 같은'p [i]'를 사용하여 그렇게한다. – glglgl

답변

2

아래 첨자 연산자 []도 역 참조를 수행합니다. 한 번에 인덱싱 및 역 참조를 수행합니다. p[n]*(p+n)과 동일합니다. 즉, 오프셋으로 이동하고 역 참조합니다. 결과적으로 &p[n]p+n과 같습니다. 그것이 아니다 필요한 배열의 경우

+0

역 참조 연산자가 아니라 첨자 연산자입니다. (단항 연산자 *는 포인터를 참조 해제합니다.) –

+0

공식적인 용어를 주셔서 감사합니다. 나는 오해를 피하기 위해 약간의 편집을했다. –

+0

@Peter Schneider p [n]이 * (p + n)과 같으면 * p [i]를 쓰면 왜 오류가 표시됩니까? 또한 & p [n]은 p + n과 같은 의미입니까? – Rooney10

2

그런 위치는이 값을 저장해야 할 위치가 무엇인지 지정해야합니다 그래서

&p[i] 

해야하며 &p[i] 될 것입니다

또는 (p+i)

&p[i] = (p+i) 
+1

일이 지나치게 복잡하지는 않습니다 :'& p [i] == & * (p + i) == (p + i)' – BeyelerStudios

+0

@BeyelerStudios 나는 그것을 다른 방식으로 집어 넣었습니다 !! 나는 여기에 아무 것도 복잡하지 않다고 생각한다 – Gopi

+0

당신은 방금 실수를 추가했다 :'& (p + i)'는'(p + i)'와 같지 않다 – BeyelerStudios

0

scanf에게 데이터를 넣을 위치를 알려면 &n을 작성해야합니다. &은 주소 연산자이며 변수가 저장된 메모리 주소를 반환합니다.

&p[i]은 배열의 i 번째 주소를 제공합니다.

+1

참조 연산자가 아닙니다. C에는 참조가 없습니다. C++에서도 참조 연산자라고 부르지 않습니다. –

1

왜 우리는 scanf와의 &를 작성해야합니까?

배열은 첫 번째 요소의 포인터로 감소합니다. 일반적으로 식 a (a은 배열 임)은 &a[0]이됩니다. 우리 * p를 쓰면

에도 [I]는 printf와, 그것은 P 포인터 정도로 이고 우리는 그것을 복종하고 메모리에 확보 된 공간에 데이터를 저장해야하지만, 작동하지 않는 오류를 범?

아니요, 단항 * 연산자를 포인터 유형이 아닌 것에 적용하려고합니다. E1[E2] 형식의 표현식은 (*((E1)+(E2)))과 같으므로 *가 나타내는 값이 포인터 유형이 아닌 경우 구문이 유효하지 않습니다.

+0

1. P는 배열에 대한 포인터이므로 & p는 요소의 메모리 주소가 아닌 포인터 주소를 표시해야합니까? 2.Say int * p = & a; a = 5; * p = 8 printf ("% d", * p); 8을 올바르게 인쇄해야하지만 8은 포인터가 아니지만 정답을 표시합니다. – Rooney10