[c] 배열을 C의 함수에 인수로 전달

배열을 인수로 포함하는 함수를 작성하고 다음과 같이 배열의 값을 전달하여 호출합니다.

내가 찾은 것은 arraytest()값을 전달하여 함수를 호출하고 있지만 원본 int arr[]이 변경 된다는 것 입니다.

이유를 설명해 주시겠습니까?



답변

배열을 매개 변수로 전달할 때

정확히 같은 의미

그래서 당신 main의 값을 수정하고 있습니다.

역사적 이유로 배열은 일류 시민이 아니며 값으로 전달할 수 없습니다.


답변

당신이 할 경우 함수에 인수로 1 차원 배열을 통과 각각 때문에, 당신은 세 가지 방법으로 모두 세 가지 선언 방법을 다음 중 하나의 형식 매개 변수를 선언 비슷한 결과를 생산해야 정수 포인터가가는 것을 컴파일러를 알려줍니다 받을 수 있습니다 .

따라서 원래 값을 수정하고 있습니다.

감사 !!!


답변

배열을 복사본으로 전달하지 않습니다. 배열의 첫 번째 요소가 메모리에있는 주소를 가리키는 포인터 일뿐입니다.


답변

배열의 첫 번째 요소 주소를 전달합니다.


답변

C의 배열은 대부분의 경우 배열 자체의 첫 번째 요소에 대한 포인터로 변환됩니다. 그리고 더 자세하게 함수에 전달 된 배열은 항상 포인터로 변환됩니다.

에서 인용 한 이곳까지 K & R2nd를 :

배열 이름이 함수에 전달 될 때 전달되는 것은 초기 요소의 위치입니다. 호출 된 함수 내에서이 인수는 지역 변수이므로 배열 이름 매개 변수는 포인터, 즉 주소를 포함하는 변수입니다.

쓰기:

쓰기와 같은 의미입니다.

따라서 명시 적으로 작성하지 않더라도 포인터를 전달하므로 기본 값을 수정하는 것입니다.

자세한 내용은 정말 읽기 제안 .

또한 여기 에서 다른 답변을 찾을 수 있습니다.


답변

배열의 첫 번째 멤버의 메모리 위치 값을 전달합니다.

따라서 함수 내에서 배열 수정을 시작하면 원래 배열이 수정됩니다.

그 기억 a[1]이다 *(a+1).


답변

C에서 몇 가지 특별한 경우를 제외하고 배열 참조는 항상 배열의 첫 번째 요소에 대한 포인터를 “감쇠”합니다. 따라서 “값으로”배열을 전달할 수 없습니다. 함수 호출의 배열은 포인터로 함수에 전달되며 이는 참조로 배열을 전달하는 것과 유사합니다.

편집 : 배열이 첫 번째 요소에 대한 포인터로 붕괴되지 않는 세 가지 특별한 경우가 있습니다.

  1. sizeof a과 같지 않습니다 sizeof (&a[0]).
  2. &a&(&a[0])(와 &a[0]) 동일하지 않습니다 (과 동일하지도 않음 ).
  3. char b[] = "foo"과 같지 않습니다 char b[] = &("foo").