2014-09-02 2 views
4

알았어.C에서 동적 배열을 만들고 사용하는 방법을 모르겠다.

int grid_x = 5 
int * grid; 
grid = new int[grid_x]; 
*grid = 34; 
cout << grid[0]; 

5 행으로 구성해야합니까? 또는 숫자 5로 첫 번째 요소를 채우시겠습니까?

라인 4가 첫 번째 요소를 채우며 나머지는 어떻게 채우나요?

행 4가없는 행 5는 "-842150451"을 읽습니다.

나는 사용자가 지정한 x 및 y 값을 사용하여 2 차원 배열을 만든 다음 각 요소를 사용자가 지정한 숫자 값으로 하나씩 채우려고합니다. . 위의 코드는 1 차원 배열을 먼저 사용하려는 시도였습니다.

+0

_ 화재를 잡는다 "3 행은 5 개의 요소가있는 배열을 생성해야합니까?" _ "또는 숫자 5의 첫 번째 요소 채우기"_ 번호 –

+0

"줄 4가 없으면 줄 5는"-842150451 "을 읽습니다." 예, 초기화되지 않은 메모리 어딘가에 배열 포인트가 있기 때문에!그것은 4 행으로 초기화하지 않는 한 어떤 값이 될 수 있습니다 :) – Nico

+1

약간 그리고 간신히 중요한 추가. 십진수'-842150451'는 16 진수'0xCDCDCDCD'입니다. Visual Studio의 디버그 런타임이 초기화되지 않은 메모리를 나타내며 프로그래머가 메모리 버그를 찾는 데 도움이되는 방법입니다. – Drop

답변

9

3 5 개 요소 배열을 만들 줄 하는가 (grid[2]가! 2[grid]과 같은 일을 할 것입니다 이유입니다)?

예. 그것은 그들을 초기화하지 않을 것입니다, 그래서 당신은 이상한 가치를 보았습니다.

숫자 5로 첫 번째 요소를 채우시겠습니까?

new int(grid_x)

는 둥근 괄호 더불어 단일 아니라 개체 배열을 생성하고, 초기 값을 지정한다.

new과 함께 배열을 할당하는 방법은 0이 아닌 값으로 초기화 할 수 없습니다. 할당 후 값을 지정해야합니다.

라인 4는 첫 번째 요소를 채우며 나머지는 어떻게 채우나요? 그러나 일반적으로이 같은 원시 포인터를 저글링하지 않으

grid[0] = 34; // Equivalent to: *(grid) = 34 
grid[1] = 42; // Equivalent to: *(grid+1) = 42 
// ... 
grid[4] = 77; // That's the last one: 5 elements from 0 to 4. 

;

당신은[] 요소에 액세스 할 수 첨자 연산자를 사용할 수 있습니다 배열을 마치면 delete[] 배열의 부담은 성취하기 어려울 수 있습니다. 대신 표준 라이브러리를 사용하십시오. 다음은 2 차원 격자를 만드는 한 가지 방법입니다.

#include <vector> 

std::vector<std::vector<int>> grid(grid_x, std::vector<int>(grid_y)); 
grid[x][y] = 42; // for any x is between 0 and grid_x-1, y between 0 and grid_y-1 

또는 하나의 인접 배열을 사용하는 것이 더 효율적일 수 있습니다. 2 차원 그리드로 액세스하려면 약간의 기능이 필요합니다.

template <typename T> 
class Grid { 
public: 
    Grid(size_t x, size_t y) : size_x(x), size_y(y), v(x*y) {} 

    T  & operator()(size_t x, size_t y)  {return v[y*size_x + x];} 
    T const & operator()(size_t x, size_t y) const {return v[y*size_x + x];} 

private: 
    size_t size_x, size_y; 
    std::vector<T> v; 
}; 

Grid grid(grid_x,grid_y); 
grid(x,y) = 42; 
1

5 행으로 구성해야하나요? 또는 숫자 5로 첫 번째 요소를 채우시겠습니까?

5 개의 요소가있는 배열을 만듭니다.

라인 4는 첫 번째 요소를 채우며 나머지는 어떻게 채우나요? n가 설정할 및 x 요소의 인덱스입니다

grid[n] = x; 

는 값입니다.

11

동적을 만드는 기본 C++ 방법 int의 (동맹 크기 조정) 배열은 다음과 같습니다 표준 라이브러리가 이미 당신을 위해 이것을 캡슐화 할 때

std::vector<int> grid; 

안전하지 않은 포인터 및 수동 동적 할당 함께 놀러하지 마십시오.

5 개 요소의 벡터를 만들려면 다음과 같이하십시오 : 당신은 다시 새로운 요소를 추가 할 수 있습니다

grid[0] = 34; 
grid[1] = 42; 

:

std::vector<int> grid(5); 

당신은 다음 []를 사용하여 개별 요소에 액세스 할 수 있습니다

// grid.size() is 5 
grid.push_back(-42); 
// grid.size() now returns 6 

012에서 사용할 수있는 모든 작업을 보려면 reference docs에 문의하십시오.. 그들이 액세스 의해 ...

브래킷 연산자, x[y]*(x+y) 정확히 동등한 변형 될 수 있도록으로 4 라인을 변경할 수 있도록

+0

원시 어레이가 어떻게 작동하는지 또는'std :: vector'가 내부적으로 어떻게 작동 하는지를 정확히 알고 자하는 사람들을 제외하고는 질문을 받았을 때를 제외하고는 모든 경우에 절대적으로 정답입니다. 학생 또는 호기심으로). 그런 것처럼 보입니다. 나는 @ MikeSymour의 대답이 여기에 더 적절하다고 생각한다. – Drop

+0

표준 라이브러리 내부를 조사하려는 사람이 C++ 저수준 구조에 익숙하기를 바랍니다. – stefaanv

+0

@stefaanv 그게 바로 우리가 신참 C++ 프로그래머를 표준 라이브러리의 편리한 "래퍼"에 강제적으로 밀어 넣으면 안된다고 생각하는 이유입니다. 그러나 우리가 한 번 해보았 듯이 포인터 광기를 겪을 수있는 기회를 제공해야합니다. C++ 14 시대에도. – Drop

0

라인 (3)는 메모리에 나란히 5 정수 측 메모리를 할당 grid[0] = 34; 만들에 더 읽기

0
int grid_x = 5 
int * grid; 
grid = new int[grid_x]; 
*grid = 34; 
cout << grid[0]; 

Should line 3 create an array with 5 elements? Or fill the first 
element with the number 5? 
확실히

이전 : 이런 식으로 뭔가 좋은 출발점이 될 수 있습니다. 연산자 "new"를 사용하면 메모리를 할당합니다.

Line 4가 첫 번째 요소를 채우며 어떻게 나머지를 채울 수 있습니까?

사용 사업자 [], 예컨대 : 4 호선없이

for int (i=0; i < grid_x; i++) { //Reset the buffer 
    grid[i] = 0; 
} 


, 5 호선 읽기 "-842150451".

초기화되지 않은 메모리를 읽는 중일뿐입니다.

내가, 내가 x와 사용자가 지정한 y 값을 사용하여 2 차원 배열을 만들려고 해요 진행하고 는 숫자 값을 하나의 각 요소를 채울 무엇인지 이해하지 않는다 사용자가 지정했습니다. 위의 코드는 1 차원 배열 을 먼저 사용하려는 시도였습니다.

다른 사용자는 벡터 사용 방법을 설명했습니다.배열의 크기를 한 번만 설정해야하는 경우 변수가 범위를 벗어날 때 삭제를 처리하는 것이 일반적으로 boost::scoped_array을 선호합니다.

컴파일 타임에 알려지지 않은 크기의 2 차원 배열의 경우 scoped_arrays의 scoped_array처럼 조금 더 까다로운 것이 필요합니다. 그것은 for 루프를 반드시 필요로합니다.

using boost::scoped_array; 
int grid_x; 
int grid_y; 
///Reading values from user... 
scoped_array<scoped_array<int> > grid(new scoped_array<int> [grid_x]); 
for (int i = 0; i < grid_x; i++) 
    grid[i] = scoped_array<int>(new int[grid_y]); 

당신은 귀하의 격자 요소에 액세스 할 다음 수

grid[x][y]; 

참고 : 그것은 게임에서 포인터를 컨테이너 복용도

typedef int* p_int_t; 
p_int_t* grid = new p_int_t [grid_x]; 
for (int i = 0; i < grid_x; i++) 
    grid[i] = new int[grid_y]; 

하지만 일을 할 배열의 수명 말기에 모든 하위 배열의 삭제를 처리해야합니다.

0

배열은 단순히 연속적인 메모리 블록입니다. 따라서 시작 주소가 있습니다.

int * grid; 

는 정수의 주소의 C 표현입니다, 당신은 '포인터'로 *를 읽을 수 있습니다. 배열은 정수 배열이므로 배열의 첫 번째 요소의 주소는 실제로 배열의 주소와 같습니다. 따라서 3 행

grid = new int [grid_x];

은 배열을 보유 할 수있는 충분한 메모리 (힙에)를 할당하고 그 주소를 변수 grid에 넣습니다. 이 시점에서 해당 메모리의 내용은 실제 실리콘을 마지막으로 사용한 시점과 동일합니다. 초기화되지 않은 메모리를 읽으면 예측할 수없는 값이 생기므로 4 행을 벗어나면 이상한 결과가 나오는 것을 관찰 할 수 있습니다.

* 포인터가 기억 나십니까? 4 번에서 당신은 '포인터의 내용'로 읽을 수 있으므로

*grid = 34; 

는 메모리의 내용이 값 (34)에 grid 가리키는 그러나 라인 3 grid에게 처음의 주소를 주었다 설정 의미 배열의 요소. 따라서 4 행은 배열의 첫 번째 요소를 34로 설정합니다.

C에서 배열은 0부터 시작하는 인덱스를 사용합니다. 즉, 배열의 첫 번째 요소는 숫자 0이고 마지막 요소는 요소 수입니다. -in-the-array - 1. 배열을 채우는 한 가지 방법은 차례대로 각 요소에 값을 설정하기 위해 각 요소를 인덱싱하는 것입니다.

for(int index = 0; index < grid_x; index++) 
{ 
    grid[index] = 34; 
} 

또는 동일한 작업을 수행하기 위해 계속 포인터를 사용할 수 있습니다.

for(int* pointerToElement = grid; 0 < grid_x; grid_x--) 
{ 
    // save 34 to the address held by the pointer 
    /// and post-increment the pointer to the next element. 
    *pointerToElement++ = 34; 
} 

들이 일관 코드, PC 재부팅 작동하지 않는 이유를 궁금 불면의 시간을 보낼 수있는 기회의 거대한 범위를 제공, 배열 및 포인터와 재미를 가지고, 라우터 등 등

관련 문제