파트 C 어레이 (1 차원 배열 - AT)

그런 다음 문서 C에서 배열에 대해 뭔가 말을 계속

 

함수 파라미터 6. 어레이 이름

배열 이름이 어떻게 될지의 함수에 인수로 전달 될 때?

값 어레이 이름 어레이의 첫 번째 요소에 대한 포인터이며,이 함수에 전달 이때 명백 것은 포인터의 사본이다. 다음 기능은 첨자 참조가 실제로 액세스 동작에 간접 포인터 및 간접 액세스를 수행 수행 한 경우에 액세스하고 기능을 호출하는 프로그램 배열 요소를 수정할 수 있습니다.

지금 모순의 송신 파라미터의 상면 C에 대하여 설명한다. 전에 상기 함수에 전달 된 모든 파라미터 값에 의해 수행되고 있지만, 배열 이름 인수의 동작은 그것이 통과 호출을 통해 전달되는 경우. 데이터 패스 통화 연결이 원하는 요소에 대한 포인터를 전달함으로써 달성하고 함수 포인터 간접 액세스 동작을 수행한다. 파라미터로 배열 이름 포인터이며, 첨자 기준은 실제 실행을 간접 접속된다.

행동의 값 배열에 의해 호출은 어떤 장소에 반영됩니다 그래서? 인수로 대응 변성 포인터에 대한 걱정없이 파라미터 (사본의 배열 위치 포인터 시작 지점)에서, 함수는 자유롭게 그 포인터 변수를 조작 할 수의 사본이 함수에 전달이다.

그래서, 여기에 모순이 없다. 모든 매개 변수는 값으로 전달됩니다. 당신이 변수에 대한 포인터를 전달하는 경우 물론, 함수 포인터 및 간접 액세스 작업을 수행 한 다음 함수는 변수를 수정할 수 있습니다. 분명 보이지 않지만, 그러나 공식적 상황이 발생했을 때 매개 변수 이름과 같은 배열입니다. 이 매개 변수 (포인터)가 실제로 값 전달 함수 포인터는 수정 될 수 복사본을 획득하지만, 호출 프로그램에 전달 인자는 영향을받지 않는다.

다음은 간단한 기능 설명이 전망된다.

void strcpy(char *buffer, char const *string){  /* 复制字符,直到遇到NULL字节 */  while((*buffer++ = *string++) != '\0');}

복사하는 가리키는 버퍼에서 첫 번째 파라미터 두번째 파라미터 스트링. 버퍼 호출 프로그램은 간접 액세스 동작의 파라미터의 함수로서 수정한다. 그러나 관계없이 수정, 발신자의 포인터 인수 자체를 수정하지 않습니다 (하지만이 가리키는 내용을 수정할 수 있음) 어떻게 함수의 매개 변수 (포인터)의.

주 동안 * 문자열 ++ 식 문이. 그것은 문자열가 지적했고, 부작용을 생산, 다음 문자를 가리키는 문자열을 수정하는 것입니다. 호출 프로그램에 영향을주지 않습니다 이러한 방식으로 변형 된 형상 매개 변수 인수에서와 같은 복사 기능의 공유를 통과하도록 수정되었습니다.

7. 선언 어레이 파라미터

여기서 흥미로운 질문이다. 당신이 함수에 배열 이름 매개 변수를 전달하려면 올바른 함수 매개 변수는 같은되어야 하는가? 그것은 포인터 나 배열로 선언해야 하는가?

당신이 볼 수 있듯이, 실제 함수 호출에 대한 포인터를 전달, 함수 매개 변수는 어떤 컴파일러는 함수 매개 변수의 배열을 받아 실제로는 포인터이지만, 초보자를위한 사용하기 쉬운. 따라서, 기능은 다음 두 가지 유형이 동일하다 :

INT의 strlen (문자 스트링 *);

INT의 strlen (문자 스트링 []);

이 평등 포인터를 의미하고 배열 이름은 실제로 동일 있지만 속지 마세요! 이 두 문장은 동일한 작업을 수행,하지만 현재 환경의 맥락이다. 다른 곳이 있다면, 그것은 완전히 다른 않도록 이전에 논의 될 수있다. 그러나 배열 매개 변수를 들어, 문장의 어떤 양식을 사용할 수 있습니다.

당신은 어떤 문장의 형태로, 그러나 어떤을 사용할 수 있습니다 "보다 정확한"의미? 대답은 포인터입니다. 인수가 실제로 포인터 대신 배열이기 때문이다. 마찬가지로, 값를 sizeof (문자열) 어레이의 글자보다 길이에 대한 포인터이다.

배열 형상 함수 프로토 타입 매개 변수가 요소의 수를 지정할 필요가 없습니다 왜 함수가 배열 매개 변수에 대한 메모리를 할당하지 않기 때문에 당신은 지금, 명확해야한다. 매개 변수는 좋은 메모리가 다른 공간에 할당 된 단지 포인터입니다. 이 사실은 배열 변수 어레이의 실제 길이 중 하나와 일치 할 수있는 이유 ---- 단지 어레이의 첫 번째 요소에 대한 포인터를 전달 설명한다. 반면에,이 구현은 배열의 길이의 기능이 있음을 알 수 없다. 당신이 배열의 길이를 알 필요가 있다면, 그것은 명시 적 함수에 매개 변수로 전달해야합니다.

8. 초기화

스칼라 변수가 자신의 성명으로 초기화 할 수처럼 배열은 동일한 기능을 수행 할 수 있습니다. 유일한 차이점은 어레이가 일련의 값을 필요로 초기화한다. 이러한 값은 괄호의 쌍 사이에 위치되며, 각각의 값은 쉼표로 구분. 아래 예와 같이

INT 벡터 [5] = {10, 20, 30, 40, 50};

하나에 의해 지정된리스트에 하나의 어레이의 각 요소에 할당 한 값을 초기화 벡터 [0] 값은 벡터 [1]의 값이 20을 수득 등되어, 열이 얻어진다.

정적 및 자동 초기화

웨이 배열 초기화 스토리지 유형에 따라 인 초기화 스칼라 변수 ---- 유사하다. 정적 초기화의 메모리 어레이에 저장 만이, 즉, 이전에 프로그램이 시작되었다. 프로그램은 올바른 위치에 이러한 명령 값을 수행 할 필요가 없습니다, 그들은이 시작. 이 프로세스는 실행 프로그램을 적절한 값을 포함하는 파일의 배열 요소로 초기화되는 링커에 의해 수행된다. 어레이가 초기화되지 않은 경우, 배열 요소의 초기 값은 자동으로 0으로 설정된다. 이 파일을 메모리에 로딩되어 실행되고, 경우 초기화 후에 어레이 값으로 프로그램 명령어는 메모리에로드된다. 프로그램이 실행될 경우에 따라서 정적 배열 초기화되었다.

그러나, 자동 변수 초기화 과정은 자동 가변 위치 런타임 스택 각 항목은 그 실행 흐름은 코드 블록은, 각각의 이러한 변수가 동일한 메모리 위치에 위치되지 않을 때, 그렇게 간단하지 않다 . 프로그램이 시작하기 전에, 컴파일러는이 위치를 초기화 할 수있는 방법은 없습니다. 그래서 기준 기본 자동 변수는 초기화되지 않은 것입니다. 자동 변수의 선언이 초기 값을 실행이 선언 된 변수의 범위로 자동적으로 흐를 때마다 주어진 경우, 변수 암시 할당 초기화 될 것이다. 시간과 공간 등이 암시 적 과제의 요구와 일반 과제 수행합니다. 문제는 배열 초기화 목록은 많은 과제를 생산할 수 많은 가치를 가질 수 있다는 것이다. 그 아주 큰 배열의 경우, 초기화 시간이 상당 할 수 있습니다.

그래서 여기가 무게를하는 것이 필요하다. 함수 (블록) 로컬 배열을 초기화 할 때,주의 깊게 프로그램의 구현에, 당신은 스트림 기능 (또는 블록), 각 시간을 입력 할 때마다 고려해야 배열이 가치가 없어 재 초기화. 답이없는 경우에는 배열 초기화 한 번만 프로그램이 시작되기 전에 수행되도록 배열이 정적으로 선언 넣어 없습니다.

9. 불완전한 초기화

다음에 두 문장은 일어날 것이라고 선언?

INT 벡터 [5] = {1, 2, 3, 4, 5, 6};

INT 벡터 [5] = {1, 2, 3, 4};

두 경우, 배열 요소의 개수는 상기 초기화 된 값과 일치하지 않는다. 첫 번째 문은 잘못, 우리는 다섯 개 정수 변수에로드 여섯 개 정수 값 방법이 없습니다. 그러나, 제 성명, 그것은 배열의 첫 번째 네 개의 요소에 대한 초기 값을 법적 제공되며, 마지막 요소는 0으로 초기화된다.

그래서, 우리는 그것의 중간에 해당 값의 목록을 생략 할 수 있습니다?

INT 벡터 [5] = {1, 5};

컴파일러는 초기 값이 충분하지 않습니다 알고 있지만, 그것은없는 사람들의 가치를 알 수 없다. 따라서, 마지막 몇 초기 값은 생략.

10. 어레이 길이가 자동으로 계산

여기에 유용한 정보의 또 다른 예입니다

INT 벡터 [] = {1, 2, 3, 4, 5};

문이 배열의 길이를 제공하지 않는 경우, 컴파일러는 배열의 길이가 모두 초기 값의 길이를 수용 할 만 할 수 있도록 설정되어 넣어. 값의 초기 목록이 자주 변경 한 경우,이 기술은 특히 유용합니다.

11. 문자의 배열을 초기화

배운 현재의 지식에 따르면,이 양식 다음과 같은 문자 배열이 초기화 될 것으로 생각할 수 있습니다 :

문자 메시지 [] = {H ','E ','L ','L ','O ', 0};

이 방법은 물론 가능하다, 그러나 아주 짧은 문자열을 제외하고,이 방법은 정말 서투른입니다. 따라서, 언어 표준은 빠른 방법은 문자의 배열을 초기화하는 데 사용됩니다 제공합니다 :

문자 메시지는 [] "안녕하세요";

그것은 문자열 상수처럼 보이지만 정말 . 그것은 전례 초기화 목록의 또 다른 방법입니다.

그들은 정확히 동일한 보면, 당신은 어떻게 문자열 상수와 빠른 초기화 목록이 표기 그것을 구별합니까? 그들은이 위치한 문맥에 따라 구별된다. 문자의 배열을 초기화하는 데 사용하는 경우, 그것은 초기화 목록입니다. 다른 곳에서는 문자열 상수를 나타냅니다.

다음은 그 예이다 :

숯 message1 [] = "안녕하세요";

문자 * message2 = "안녕하세요";

모두 초기화 모습은 좋아하지만, 그들은 다른 의미를 가지고있다. 후자는 실제 문자열 상수 반면 전자는, 문자의 배열 요소를 초기화한다. 아래와 같이 포인터 변수 문자열 상수의 저장 위치를 ​​가리 키도록 초기화된다 :


게시 60 개 원래 기사 · 원 찬양 18 ·은 20000 +를 볼

추천

출처blog.csdn.net/BadAyase/article/details/101369236