배열을 인수로 포함하는 함수를 작성하고 다음과 같이 배열의 값을 전달하여 호출합니다.
void arraytest(int a[])
{
// changed the array a
a[0]=a[0]+a[1];
a[1]=a[0]-a[1];
a[0]=a[0]-a[1];
}
void main()
{
int arr[]={1,2};
printf("%d \t %d",arr[0],arr[1]);
arraytest(arr);
printf("\n After calling fun arr contains: %d\t %d",arr[0],arr[1]);
}
내가 찾은 것은 arraytest()
값을 전달하여 함수를 호출하고 있지만 원본 int arr[]
이 변경 된다는 것 입니다.
이유를 설명해 주시겠습니까?
답변
배열을 매개 변수로 전달할 때
void arraytest(int a[])
정확히 같은 의미
void arraytest(int *a)
그래서 당신 은 main의 값을 수정하고 있습니다.
역사적 이유로 배열은 일류 시민이 아니며 값으로 전달할 수 없습니다.
답변
당신이 할 경우 함수에 인수로 1 차원 배열을 통과 각각 때문에, 당신은 세 가지 방법으로 모두 세 가지 선언 방법을 다음 중 하나의 형식 매개 변수를 선언 비슷한 결과를 생산해야 정수 포인터가가는 것을 컴파일러를 알려줍니다 받을 수 있습니다 .
int func(int arr[], ...){
.
.
.
}
int func(int arr[SIZE], ...){
.
.
.
}
int func(int* arr, ...){
.
.
.
}
따라서 원래 값을 수정하고 있습니다.
감사 !!!
답변
배열을 복사본으로 전달하지 않습니다. 배열의 첫 번째 요소가 메모리에있는 주소를 가리키는 포인터 일뿐입니다.
답변
배열의 첫 번째 요소 주소를 전달합니다.
답변
C의 배열은 대부분의 경우 배열 자체의 첫 번째 요소에 대한 포인터로 변환됩니다. 그리고 더 자세하게 함수에 전달 된 배열은 항상 포인터로 변환됩니다.
에서 인용 한 이곳까지 K & R2nd를 :
배열 이름이 함수에 전달 될 때 전달되는 것은 초기 요소의 위치입니다. 호출 된 함수 내에서이 인수는 지역 변수이므로 배열 이름 매개 변수는 포인터, 즉 주소를 포함하는 변수입니다.
쓰기:
void arraytest(int a[])
쓰기와 같은 의미입니다.
void arraytest(int *a)
따라서 명시 적으로 작성하지 않더라도 포인터를 전달하므로 기본 값을 수정하는 것입니다.
자세한 내용은 정말 읽기 제안 이 .
답변
배열의 첫 번째 멤버의 메모리 위치 값을 전달합니다.
따라서 함수 내에서 배열 수정을 시작하면 원래 배열이 수정됩니다.
그 기억 a[1]
이다 *(a+1)
.
답변
C에서 몇 가지 특별한 경우를 제외하고 배열 참조는 항상 배열의 첫 번째 요소에 대한 포인터를 “감쇠”합니다. 따라서 “값으로”배열을 전달할 수 없습니다. 함수 호출의 배열은 포인터로 함수에 전달되며 이는 참조로 배열을 전달하는 것과 유사합니다.
편집 : 배열이 첫 번째 요소에 대한 포인터로 붕괴되지 않는 세 가지 특별한 경우가 있습니다.
sizeof a
과 같지 않습니다sizeof (&a[0])
.&a
은&(&a[0])
(와&a[0]
) 동일하지 않습니다 (과 동일하지도 않음 ).char b[] = "foo"
과 같지 않습니다char b[] = &("foo")
.