2013-03-06 4 views
0

임의의 값을 생성하는 배열을 생성하려고 시도하고 다른 배열에서 포인터를 할당하여 다른 함수에서 사용하려고합니다.배열에 포인터 지정

질문 1 : 올바른 방법입니까?

질문 2 : 아래 코드를 실행하면 포인터 함수가 실제 배열의 값과 일치하지 않는 값을 생성합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

int size = 100; 
int theray[size]; 
for(int i=0; i<size; i++) 
{ 
    theray[i] = (rand()%100); 
} 
//Output array 
cout<<"The array: "; 
for(int j=0; j<size; j++) 
{ 
    cout<<theray[j]<<" "; 
} 
cout<<endl; 

int (*parray)[100] = &theray; 
cout<<"The array pointer: "; 
for(int k=0; k<size; k++) 
{ 
    cout<<*parray[k]<<" "; 
} 
+1

: 여기 (C++ 11)이 프로그램을 작성하기 위해 C++ 표준 라이브러리에서 클래스를 사용하는 것이 방법입니다 기능 "? 이 냄새가 나쁜 –

+0

포인터는 [** EVIL **] (http://www.parashift.com/c++-faq/defn-evil.html)입니다! –

+1

'int theray [size];'이것은 유효하지 않습니다 C++; 'size'는 이것이 작동하기 위해서'const'라고 선언 될 필요가 있습니다. –

답변

3

질문 1 :이 올바른 접근 방식인가?

호 올바른 접근 std::vector<int>size 경우 컴파일 시간 1std::array<int, size>2 경우에 공지되지 않은 사용하는 것이다. 포인터는 필요 없습니다.

void foo(const std::vector<int>& v) 
{ 
    // do stuff with v 
} 

... 

std::vector<int> v(size); // vector with size elements 
// do something with v 

// pass v to a function 
foo(v); 

질문 2 : 나는 아래의 코드를 실행하면, 내 포인터 기능은 실제 배열의 값이 무엇인지와 일치하지 않는 값을 생성합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

C++ 관용구를 사용하는 경우에도이 문제가 발생하지 않으므로 moot 질문을 고려합니다. 예제와 같이

cout<< (*parray)[k] << " "; 

1, 당신은 고정 된 크기와 같은 std::vector를 사용할 수 있습니다 액세스 [] 전에 데 참조 *을 적용하는 방법에 대한 명시 : 그러나 귀하의 경우에 당신은 연산자 우선 순위의 문제가 배열에서 런타임에 크기를 알 필요가 없습니다. 건설 후에 크기를 변경할 수 있다는 것을 명심하십시오.

예에서 size은 컴파일시 상수가 아니므로 std::array을 사용할 수 없습니다. 그러나 const int size = 100;으로 선언 한 경우 컴파일 시간 상수로 간주됩니다.

+1

@Dukeling : 대답은 "컴파일 시간"을 의미하기 때문에 "컴파일 시간"으로 표시됩니다. C++에서 가변 길이 배열을 갖는 유일한 방법은'std :: vector'입니다. –

+0

@JanHudec'std :: array'가 어떻게 작동하는지 익숙하지 않지만, 지금은 빠른 Google 검색을 통해 알게되었습니다. – Dukeling

1

코드는 세 가지면에서 조금씩 다릅니다. 첫째, & 토레이을 사용할 필요가 없습니다. 배열 이름은 이미 메모리 주소를 참조합니다. 당신은 단순히 회색 머리에 포인터를 할당 할 수 있습니다. 둘째, 100 개의 포인터를 배열로 선언하고 있습니다. 설명을 기반으로, 배열을 가리키는 포인터 하나만 있으면됩니다. 선언은 int * parray 대신 int * parray 여야합니다. 마지막으로 일단 배열에 대한 포인터가 있으면 배열의 이름 대신 포인터의 이름 만 사용하여 원래 배열과 동일한 방식으로 배열 요소에 액세스 할 수 있습니다. 코드의 마지막 블록을 변경해보십시오 (이 포인터 선언으로 시작 :

int *parray; 
parray = theray; 
cout<<"The array pointer: "; 
for(int k=0; k<size; k++) 
{ 
    cout<<parray[k]<<" "; 
} 
2

질문 1

것은이 올바른 접근 방식인가 보통

하지 그것은 무엇에 따라 달라집니다?. 당신은 성취하려고 노력하고 있습니다.

상위 수준의 의미에 대해서는 대부분 std::vector<int>을 사용하거나 크기가 고정되어 있고 C++ 11을 사용하는 경우 std::array<int, size>을 사용합니다. 배열이 포인터로 저하 때문 작동

int *parray = theray; 
cout<<"The array pointer: "; 
for(int k=0; k<size; k++) 
{ 
    cout<<parray[k]<<" "; 
} 

하고 […] 첨자는가 작업처럼이 포인터 작업 : 당신이 실제로 아래로 포인터 수준으로 이동해야하는 경우 일반적으로이처럼 써서 원래의 배열.

질문 2 나는 아래의 코드를 실행하면, 내 포인터 기능은 실제 배열의 값이 무엇인지와 일치하지 않는 값을 생성

, 무슨 내가 잘못 뭐하는 거지? 당신이 (*parray)[k]로 사용하려는 동안

*parray[k]*(parray[k])으로 해석됩니다.

+0

btw,'int size = 100; int theray [size];'일부 컴파일러에서는 전달할 수 없습니다. 'const'를 사용해야합니다. – shengy

1

질문 1 : 올바른 접근 방식입니까?

아니오. 크기가 동적으로 (런타임에) 변경 될 수있는 배열의 경우 std::vector<>을 사용하십시오. 포인터 및 수동 메모리 관리를 피하십시오.

질문 2 : 아래 코드를 실행하면 포인터 함수가 실제 배열의 값과 일치하지 않는 값을 생성합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

우선 포인터를 만들어서 함수에 배열을 전달할 수 있습니다. 이것은 필요하지 않습니다. 다음 다른에서 사용하기 위해 해당 배열에 대한 포인터를 할당 "에 의해 당신에게 무엇을 의미

#include <vector> 
#include <algorithm> 
#include <iostream> 
#include <iterator> 

// Sample function that prints the vectors's content 
void foo(std::vector<int> const& v) 
{ 
    copy(begin(v), end(v), std::ostream_iterator<int>(std::cout, " ")); 
} 

int main() 
{ 
    // Populate the vector... 
    size_t sz = 10; 
    std::vector<int> v(sz); 
    generate(begin(v), end(v), []() { return rand() % 100; }); 

    // Pass it to a function... 
    foo(v); 
}