개인 재정 C ++에서 배열과 포인터 - 더미

C ++에서 배열과 포인터 - 더미

비디오: [C/C++ 강좌] 25강. 배열과 포인터와의 관계 2024

비디오: [C/C++ 강좌] 25강. 배열과 포인터와의 관계 2024
Anonim

배열의 이름은 배열 자체에 대한 포인터입니다. 배열 는 메모리에 저장된 일련의 변수입니다. 배열 이름 은 첫 번째 항목을 가리 킵니다.

이것은 포인터에 대한 흥미로운 질문입니다. 다음 행과 같은 함수 헤더를 가질 수 있으며 sizeof를 사용하여 배열에있는 요소의 수를 결정할 수 있습니까? 그렇다면이 함수는 호출자가 배열의 크기를 지정할 필요가 없습니다.

이 애플리케이션을 실행하면 다음과 같이 표시됩니다.

함수 외부에서 코드는 배열의 크기가 40 바이트임을 압니다. 하지만 코드가 배열 내부에있는 크기가 4라고 생각하는 이유는 무엇입니까? 그 이유는 배열을 전달하는 것처럼 보일지라도 실제로

포인터

를 배열에 전달하기 때문입니다. 포인터의 크기는 단지 4이며, 그래서 그것은 최종 출력물 라인이 출력하는 것입니다.

배열 선언은 약간의 특이성을 가지고 있습니다. int MyNumbers [5]와 같이 명확한 수의 요소를 제공하여 배열을 선언 할 때. 컴파일러는 배열이 있음을 알고 sizeof 연산자는 전체 배열의 크기를 제공합니다. 배열 이름은

포인터와 배열 모두입니다. 하지만

void ProcessArray (int Numbers []) {

와 같이 배열 크기가없는 함수 헤더를 선언하면 컴파일러는이를 단순히

포인터 와 같이 처리합니다. 이 마지막 줄은 사실 다음 줄과 같습니다. void ProcessArray (int * Numbers) {

따라서 두 줄 중 하나가 선언 한 함수 내에서 다음 두 줄의 코드는

: 숫자 [3] = 10; * (Numbers + 3) = 10; 이 같은 의미는 배열에서 extern 선언을 사용하는 경우 (예:

extern int MyNumbers [];

그리고 나서이 배열의 크기를 취하면 컴파일러는 혼란 스러울 것이다. 예를 들면 다음과 같습니다. 두 개의 파일이있는 경우 숫자입니다. cpp와 main. cpp, 여기서 숫자. cpp는 배열과 main을 선언합니다. cpp가 Array02 예제에서와 같이 외부에서 선언하면 sizeof를 호출하면 컴파일러 오류가 발생합니다. #include using namespace std; extern int MyNumbers []; int main (int argc, char * argv []) {cout << sizeof (MyNumbers) << endl; 코드:: 블록에서 gcc 컴파일러가 다음 오류를 표시합니다.

오류: 'sizeof'가 불완전한 유형 'int []'에 잘못 적용되었습니다.

해결책은 크기를 지정하는 것입니다. 대괄호 안의 배열크기가 다른 소스 코드 파일과 동일한 지 확인하십시오! 번호를 변경하여 컴파일러를 가짜로 만들면

에 오류가 발생하지 않습니다

. 그러나 이것은 잘못된 프로그래밍 스타일이며 오류를 묻는 것입니다.

배열

는 단순히 메모리에서 서로 인접한 일련의 변수이지만 배열의

이름은

실제로 배열의 첫 번째 요소에 대한 포인터입니다. 이름을 포인터로 사용할 수 있습니다. 그러나 포인터로 작업해야하는 경우에만 수행하십시오. 어쨌든 * (Numbers + 3) = 10과 같이 암호화 된 코드를 작성할 이유가 없습니다.. 그 반대도 마찬가지입니다. 이 함수를 보자. void ProcessArray (int * Numbers) {cout << numbers [1] << endl;} 이 함수는 포인터를 매개 변수로 받지만 배열로 접근한다. 다시 말하지만, 이와 같은 코드를 작성하지 마십시오. 대신

이 코드가 작동하는 이유 를 이해해야합니다. 그렇게하면 배열에 대한 깊은 지식과 컴퓨터 내부에서의 배열에 대한 지식을 얻게되며이 지식은 적절하게 작동하는 코드를 작성하는 데 도움이됩니다. 배열 이름은 단지 포인터 일 뿐이지 만 정수 배열의 이름은 정수에 대한 포인터와 완전히 똑같지 않습니다. 다음 코드 행을 확인하십시오 (Array03 예제에서 찾을 수 있음). int LotsONumbers [50]; int x; LotsONumbers = & x; Lotsonumbers

포인터

를 다른 것으로 지정하십시오: 정수로 선언 된 것이 있습니다. 컴파일러는이 작업을 수행 할 수 없습니다. 당신은 오류가 발생합니다. LotsONumbers가 int * LotsONumbers로 선언 된 경우에는 그렇지 않습니다. 이 코드가 작동합니다. 그러나 작성된 것처럼이 코드는 컴파일러 오류를 발생시킵니다. 믿거 나 말거나, 여기에 컴파일러 오류가 있습니다:: Blocks:

오류: 'int *'를 'int [50]'에 할당 할 때 호환되지 않는 유형입니다. 이 오류는 컴파일러에서 int *와 int []의 두 가지 유형을 확실하게 구분할 수 있습니다. 그럼에도 불구하고, 배열 이름은 실제로 포인터이며, 당신은 그것을 하나의 이름으로 사용할 수 있습니다; 재 지정과 같은 일반 포인터로 할 수있는 모든 작업을 수행 할 수 없습니다. 배열을 사용할 때는 다음 정보를 참고하십시오. 다음은 배열을 버그없이 유지하는 데 도움이됩니다.

코드 일관성 유지. 예를 들어, 정수를 가리키는 포인터를 선언하면 배열로 취급하지 마십시오.

명확하고 이해할 수있는 코드를 작성하십시오. 포인터를 전달하면 & (MyNumbers [0])와 같이 코드가 명확 해지면 첫 번째 요소의 주소를 가져 오는 것이 좋습니다. 다만 MyNumbers와 동일하지만 말입니다.

배열을 선언 할 때, 배열을 취하는 함수를 쓰지 않는 한 항상 괄호 안에 숫자를 넣으십시오. extern 키워드를 사용하여 배열을 선언 할 때는 배열 크기를 대괄호 안에 넣으십시오. 그러나 일관성있게하십시오! 한 번에 하나의 번호를 사용하고 다른 번호는 다른 번에 사용하지 마십시오. 일관성을 유지하는 가장 쉬운 방법은 const int와 같은 상수를 사용하는 것입니다. ArraySize = 10; 일반적인 헤더 파일에 다음 배열 선언에 사용: int MyArray [ArraySize];.

C ++에서 배열과 포인터 - 더미

편집자의 선택

Dragon Go! iPhone 및 iPad 용 앱 - 인형

Dragon Go! iPhone 및 iPad 용 앱 - 인형

Dragon Search를 사용하시는 분이라면 Dragon Go를 사용하는 것이 좋습니다! Nuance는 iPhone 3GS, iPhone 5, iPhone 4, iPod touch (3 세대), iPod touch (4 세대) 및 iPad에서 사용할 수 있도록 무료로 다운로드 할 수있는이 앱을 만들었습니다. (iOS 4.0 이상이어야합니다.) Android 기기에서도 사용할 수 있습니다. 드래곤가! ...

드래곤에서 피할 수있는 10 가지 실수 말하기 - 인형

드래곤에서 피할 수있는 10 가지 실수 말하기 - 인형

모두가 실수를 저지르고 어떤 사람들은 정말 크고 재미있게 만든다. 실수. NaturallySpeaking을 사용하여 많은 실수를 저 지르므로 때때로 수시로 일부를 만들 수도 있습니다. 내가 묻는 것은 다음과 같습니다. 내가 미리 짐작했던 10 가지 분명한 실수를하지 마십시오. 원래의 수. 창조적으로 행동하십시오. 거기서 나가서 ...

NaturallySpeaking을위한 10 가지 시간 절약 팁 - 인형

NaturallySpeaking을위한 10 가지 시간 절약 팁 - 인형

때로는 잘하고 그냥 사용하는 것의 차이 새로운 소프트웨어는 더 지혜롭고 경험 많은 스승의 충고 한 부분입니다. 누군가가 당신에게 전에 말했었 으면 좋을 10 가지가 있습니다. 대화 상자의 단축키 사용 대화 상자, 라디오 버튼, 확인란의 다양한 기능 ...

편집자의 선택

Google SketchUp 8에서 새로운 지형 모델을 만드는 법 - Google에서 모델링 할 때 인형

Google SketchUp 8에서 새로운 지형 모델을 만드는 법 - Google에서 모델링 할 때 인형

SketchUp을 사용하면 지형을 만들어야 할 수 있습니다. 건물에 대한 패치를 모델링하든 센트럴 파크를 다시 디자인하든 기존 데이터로 지형을 모델링 할 수 있습니다. 기존 데이터는 일반적으로 등고선 또는 토폴 라인 형태로 도착합니다. 지형지도에서 볼 수있는 삐걱 거리는 선을 알고 있습니다.

SketchUp에서 드레이프로 경로와 도로를 만드는 법 - 스케치 업에서 드레이프 도구

SketchUp에서 드레이프로 경로와 도로를 만드는 법 - 스케치 업에서 드레이프 도구

드레이프 도구가 작동 함 쿠키 커터와 조금 같다. 그것을 사용하여 객체의 가장자리를 직접 그 아래에있는 다른 표면으로 전송합니다. 아마도 당신은 부드럽게 경 사진 지형을 가지고 있으며, 당신은 그것에 사행 경로를 그리기를 원할 것입니다. 경로는 윤곽선을 따라야합니다.

SketchUp 모델을 3D 인쇄 용 부품으로 자르는 방법 - 인형

SketchUp 모델을 3D 인쇄 용 부품으로 자르는 방법 - 인형

SketchUp 모델 자르기 Intersect Faces 도구를 사용하여 그룹을 결합하는 것과 매우 유사합니다. 더 큰 오브젝트와 교차하여 커팅의 새 가장자리가 될 커터로 지오메트리를 사용할 것입니다. 모델이 매우 단순하고 SketchUp을 사용하는 경우 ...

편집자의 선택

Route Prefix를 사용하여 Junos - dummy에서 라우팅 필터를 생성하는 방법

Route Prefix를 사용하여 Junos - dummy에서 라우팅 필터를 생성하는 방법

라우팅 정책은 특정 경로가 라우팅 테이블에 수용되거나 일부 인접 라우터에 보급되는 것을 방지하기위한 것입니다. 경우에 따라 특정 경로 또는 경로 집합을 일치시키는 것이 유용 할 수 있습니다. 이렇게하려면 경로 필터를 사용합니다. 경로 필터는 특정 IP 주소 또는 접두어 범위에서 일치합니다. ...

Junos 라우터에서 COS의 코드 포인트 별명을 사용하는 방법 - 인형

Junos 라우터에서 COS의 코드 포인트 별명을 사용하는 방법 - 인형

전달 수업은 고통 스러울 수 있습니다. 더 좋은 방법은 코드 포인트 별칭을 사용하는 것입니다. CoS (Class of Service) 정책을 결정할 때 비트 패턴을 지정하는 대신 비트 패턴을 나타내는 별칭 이름을 정의 할 수 있습니다. 이러한 별칭을 코드 포인트 별칭이라고합니다. 간단히 말하자면 코드 포인트를 사용하십시오 ...

Junos 라우팅 정보를 요약하는 방법 - 더미

Junos 라우팅 정보를 요약하는 방법 - 더미

때때로 라우팅 정보를 간단하게 요약 할 수 있습니다 라우터. 예를 들어, 네트워크에서 OSPF를 방금 구성 했으므로 라우팅 테이블에 특정 수의 OSPF 경로가 표시 될 것으로 예상됩니다. show route summary 명령을 실행하여 모든 경로를 볼 수 있습니다 ...