2011-11-11 6 views
1

정보 : 배열 a[1000], a를 형성우리가

1) 포인터 어드레스이다. 나는의 두 항목에 대해이 함수를 호출 할 때

2)

void swap(int &c, int &b) 
{ 
    c=c+b; 
    b=c-b; 
    c=c-b; 
} 
// this is a method of swapping two variables without using temp variable. 
// We use call by reference for the swap to actually take place in memory. 

지금, a[i],a[j]가 ... 무슨 일이 말을

? 함수가 C/C++의 내부 구조로 인해 배열의 두 셀 주소를 받거나 a[i]a[j]을 가리키는 포인터의 주소를 수신합니까?

답변

0

a[i]&a[i] = a + i이 (내부적으로) 전달되는 값을 나타냅니다. 마찬가지로 a[j]에 대해서도 마찬가지입니다.

2

a[i]i 요소에 대한 참조로 평가됩니다. *(a+i)과 같습니다. a+ii 번째 요소에 대한 포인터입니다.

내부적으로 참조가 작동하는 방식은 구현 정의 (사용자가 신경 쓰지 않아야 함)이지만 대부분의 (모든) 컴파일러는 내부적으로 포인터를 사용합니다. 이 경우 배열의 두 요소에 대한 포인터가됩니다.

2

장면 뒤에서는 a[i]a[j]에 대한 포인터가 표시됩니다.

#include<iostream> 
extern "C" void swap(int&c,int&b){ 
    c=c+b; 
    b=c-b; 
    c=c-b; 
} 
int main(){ 
    int*a=new int[1000]; 
    a[10]=10; 
    a[42]=42; 
    swap(a[10],a[42]); 
    std::cout << a[10] << " " << a[42] << std::endl; 
    delete[] a; 
    return 0; 
} 

내가 diff 출력 할 수 extern "C" 사용

#include<iostream> 
extern "C" void swap(int*c,int*b){ 
    *c=*c+*b; 
    *b=*c-*b; 
    *c=*c-*b; 
} 
int main(){ 
    int*a=new int[1000]; 
    a[10]=10; 
    a[42]=42; 
    swap(a+10,a+42); 
    std::cout << a[10] << " " << a[42] << std::endl; 
    delete[] a; 
    return 0; 
} 

, 그렇지 맹 글링 상이 다음 두 프로그램에 g++ -S 실행

는 동일한 결과를 생성한다.

사이드 노트, 예를 들어 쓸 때 a+42 컴파일러는 으로 주소를 계산하며 aint의 포인터입니다. 이 특정 예제는 생성 된 어셈블리 소스에 addl $168, %eax으로 표시됩니다.

+0

이다 (메모리에는 동적 할당이없는 경우) ++ 그는 * 참고 문헌을 전달합니다 * –

+2

@BrianRoach : 99 %의 컴파일러가 장면 뒤에서 포인터를 사용하여 참조를 구현합니다. 블라드는 이렇게 말했습니다. –

+0

@Ben - 구현은 중요하지 않습니다. 그는 참고 문헌이있다; 그가 포인터를 가지고 있다고 말하는 것은 C++ 프로그래밍의 맥락에서 간단하지 * 않습니다. –

1

A) C 및 C++은 두 가지 다른 언어입니다. 그것은 C의 ++ 및 참조을 전달하는 때문에 swap(int &c, int &b) 방법 정의 감안할 때, 그것은) C++

B, 당신은 메모리에 a + i에있는 배열 요소()

이 인 경우에 대한 참조를 가져 C를 사용하면 함수를 swap(int *c, int *d)으로 정의했을 것이고 배열 은 포인터로 자동으로을 디그레이 드하므로 포인터 a + i을 전달할 것입니다.

1

우선, 합계 값이 오버 플로우 할 수 있으므로 스왑 함수는 좋지 않습니다. 임시 변수를 사용하십시오.

swap (a [i], a [j])를 호출하면 함수에 대한 인수가 메모리 위치 a [i]와 a [j]에 대한 두 포인터가됩니다. 포인터는 두 int의 주소를 포함합니다.swap() 함수는 두 개의 int가 같은 배열에 있다는 개념을 가지고 있지 않습니다.

c 및 d를 참조로 선언하는 것은 포인터를 전달하는 것과 비슷하지만이 메모리 위치에 저장된 값 (포인터의 역 참조와 동일)으로 만 작업 할 수 있지만 포인터가 가리키는 주소는 변경하지 마십시오. 어레이를 형성 a[1000]

+0

정수이기 때문에, 그의 경우 정확하게 오버 플로우됩니다. –

+1

@MooingDuck : '부호없는'정수인 경우에만 보장됩니다. 그들은 그렇지 않습니다. –

+0

첫 번째와 마지막 요점이 정확합니다. 나머지는 잘못되었거나 혼란 스럽습니다. –

1
  1. , a 포인터 어드레스이다.

아니요. a은 배열입니다. 많은 경우에 은 첫 번째 요소에 대한 포인터에을 소멸 시키지만 포인터의 주소는 아닙니다 (물론 포인터의 배열을 만들지 않는 한).

+1

좋은 정보이지만 질문에 대한 답변이 아닙니다. –

1

임시가 아닌 두 숫자를 스와핑하는 아이디어는 숫자의 합이 값의 범위에있는 경우에만 유용하며 int가 보유 할 수 있습니다 (일반적으로 power (2, sizeof (int))). 그렇지 않으면 오버플로가 발생합니다. 포인터 인 여기에서 언급 한 바와 같이 문제 오는 ,

int *a=new int; 
a[1000];// if i have understood your question then.... 

[I]베이스 어드레스로서 형성 배열이다. c에서 p [i]를 내부적으로 말하면 * (p + i)로 변환됩니다. 여기서 p는 기본 주소입니다. 참조 값으로 전달할 때와 마찬가지로 값의 참조 주소가 전달됩니다.

참고 : 참조는 암시 적으로 상수이며 참조는 선언시 값을 제공해야합니다.

언급 de-referenced.It는 세그먼테이션 폴트 (segfault)로 이어질 수 포인터를 사용하는 등의 포인터보다 참조를 전달하는 안전 내재적 인 CONST 포인터처럼 작용한다. 이것은 C가