배열은 단순히 연속적인 메모리 블록입니다. 따라서 시작 주소가 있습니다.
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 재부팅 작동하지 않는 이유를 궁금 불면의 시간을 보낼 수있는 기회의 거대한 범위를 제공, 배열 및 포인터와 재미를 가지고, 라우터 등 등
_ 화재를 잡는다 "3 행은 5 개의 요소가있는 배열을 생성해야합니까?" _ "또는 숫자 5의 첫 번째 요소 채우기"_ 번호 –
"줄 4가 없으면 줄 5는"-842150451 "을 읽습니다." 예, 초기화되지 않은 메모리 어딘가에 배열 포인트가 있기 때문에!그것은 4 행으로 초기화하지 않는 한 어떤 값이 될 수 있습니다 :) – Nico
약간 그리고 간신히 중요한 추가. 십진수'-842150451'는 16 진수'0xCDCDCDCD'입니다. Visual Studio의 디버그 런타임이 초기화되지 않은 메모리를 나타내며 프로그래머가 메모리 버그를 찾는 데 도움이되는 방법입니다. – Drop