포인터 배열 예제

포인터는 일부 값의 주소(즉, 메모리의 위치)를 지정하는 값입니다. 포인터는 메모리 위치를 보유하는 변수입니다. 첫 번째 경우는 배열이 함수에 인수로 전달될 때 발생하는 경우가 많습니다. 함수는 매개 변수를 포인터로 선언하지만 실제 인수는 배열의 이름일 수 있습니다. 두 번째 경우는 동적으로 할당된 메모리에 액세스할 때 종종 발생합니다. 각각의 예를 살펴 보겠습니다. 다음 코드에서 calloc() 호출은 구조형 MyStruct 항목의 배열을 효과적으로 할당합니다. 배열에 대한 포인터를 선언하려면 배열의 형식을 알아야 합니다. 배열 `매`의 종류는 무엇입니까? 우리가 볼 수 있듯이 `매`는 각각 3 정수의 5 배열의 배열입니다. 식에서 배열 의 형식을 해독하는 것은 포인터 – 투 – 배열을 선언하는 핵심 포인트입니다. 포인터와 다차원 배열이 상호 작용하는 방식이 궁금할 수 있습니다. 좀 자세히 살펴보겠습니다.

A가 2차원 부동 부동 부동 배열로 선언되어 있다고 가정합니다(float A[D1][D2];) 그리고 그 pf는 부동 에 대한 포인터로 선언됩니다. pf가 A[0][0]를 가리키도록 초기화되면 *(pf+1)은 A[0][1]와 같으며 *(pf+D2)는 A[1][0]와 같습니다. 배열의 요소는 행 주요 순서로 저장됩니다. p = & val[0], 배열의 첫 번째 요소(0위치)의 주소를 가변 p에 할당하는 반면, p = val[0]은 가변 p에 1st 요소값을 할당한다는 것을 의미합니다. 함수 구문에 대한 포인터는 다소 지저분할 수 있습니다. 예를 들어 다음 기능을 고려하십시오: 컴퓨터의 메모리는 선형으로 구성되므로 행과 열에 2D 배열을 저장할 수 없습니다. 행과 열의 개념은 이론적일 뿐이며 실제로 2D 배열은 행 주요 순서로 저장되어 행이 나란히 배치됩니다. 다음 그림은 위의 2-D 배열이 메모리에 저장되는 방법을 보여 주며 있습니다. 포인터 논리 당신은 몇 포인터 산술 및 식으로 재생하는 지금 의 시간 그래서 위의 코드의 논리를 이해해야합니다.

배열 이름만 배열의 기본 주소와 동일하기 때문입니다. 우리가 메모리 낭비를 말할 때, 그것은 문자열이 적은 공간을 차지하기 시작한다는 것을 의미하지 않는다, 아니, 문자는 같은 공간을 취할 것입니다, 그러나 우리가 문자의 배열을 정의 할 때, contiguos 메모리 공간은 배열의 최대 크기와 동일합니다, 이는 낭비입니다 대신 포인터를 사용하면 피할 수 있습니다. 포인터가 가리키는 값에 액세스하려면 * 연산자가 사용됩니다. 또 다른 연산자인 -> 연산자는 구조에 대한 포인터와 함께 사용됩니다. 다음은 짧은 예입니다. 포인터 식을 다시 참조할 때 해당 포인터 식을 가리키는 값을 얻습니다. 배열에 대한 포인터는 배열을 가리키므로 참조를 해제하면 배열을 얻어야하며 배열 이름은 기본 주소를 나타냅니다. 따라서 배열에 대한 포인터가 반참조될 때마다 배열이 가리키는 배열의 기본 주소를 얻습니다. C의 포인터에 대한 이해가 있다고 가정하면 배열 이름은 배열의 첫 번째 요소에 대한 상수 포인터입니다. 따라서, 선언에서 – 내가 쓸 수 있습니다 : P = val[0]; 이유: 2D 배열 val[0]은 1D 배열인 2D 배열의 0번째 요소의 주소를 나타냅니다. 배열 이름을 상수 포인터로 사용하는 것은 합법적이며 그 반대의 경우도 마찬가지입니다. 따라서 *(balance & 4)는 균형에 있는 데이터에 액세스하는 합법적인 방법입니다[4].

여기서 ptr은 10개의 정수 배열을 가리킬 수 있는 포인터입니다. 하위 스크립트는 간접보다 우선 순위가 높기 때문에 괄호 안에 간접 연산자와 포인터 이름을 둘러싸야 합니다. 여기서 ptr의 유형은 `10개의 정수 배열에 대한 포인터`입니다. 참고 : 배열의 0 요소를 가리키는 포인터와 전체 배열을 가리키는 포인터는 완전히 다릅니다.

Posted in Uncategorized