programing

C/C++ int[] vs int*(포인트 vs. 어레이 표기).뭐가 다른데?

javaba 2022. 8. 14. 16:55
반응형

C/C++ int[] vs int*(포인트 vs. 어레이 표기).뭐가 다른데?

C의 배열은 순차적으로 저장된 데이터에 대한 포인터일 뿐입니다.그러나 어떤 차이가 []와 *의 표기법의 차이를 의미하는지, 가능한 모든 사용 컨텍스트에서 알 수 있습니다.예를 들어 다음과 같습니다.

char c[] = "test";

함수 본문에 이 명령을 입력하면 스택에 문자열이 할당됩니다.

char* c = "test";

는 데이터(읽기 전용) 세그먼트를 가리킵니다.

모든 사용 상황 컨텍스트에서 이러한 두 표기법 간의 모든 차이를 나열하여 명확한 일반 보기를 구성할 수 있습니다.

C99 표준에 따라:

배열 유형은 요소 유형이라고 하는 특정 멤버 개체 유형을 사용하여 연속적으로 할당되는 비어 있지 않은 개체 집합을 나타냅니다.

  1. 배열 유형은 요소 유형과 배열에 포함된 요소 수에 따라 특성이 지정됩니다.배열 유형은 요소 유형에서 파생되며 요소 유형이 다음과 같은 경우T어레이 타입은 의 어레이라고 불리기도 합니다.요소 유형에서 배열 유형을 구성하는 것을 배열 유형 파생이라고 합니다.

포인터 유형은 참조 유형이라고 하는 함수 유형, 개체 유형 또는 불완전한 유형에서 파생될 수 있습니다.포인터 유형은 참조된 유형의 엔티티에 대한 참조를 제공하는 값을 가진 개체를 나타냅니다.참조된 유형에서 파생된 포인터 유형T는, 에의 포인터라고 불리기도 합니다.참조된 유형에서 포인터 유형을 구성하는 것을 포인터 유형 파생이라고 합니다.

표준 선언에 따르면...

char s[] = "abc", t[3] = "abc";
char s[] = { 'a', 'b', 'c', '\0' }, t[] = { 'a', 'b', 'c' };

…동일합니다.어레이의 내용은 변경할 수 있습니다.반면 선언문은...

const char *p = "abc";

…유형이 상수에 대한 포인터로 p를 정의하고 문자열 리터럴로 요소가 초기화되는 길이 4의 (C++)유형 상수 배열이 있는 개체를 가리키도록 초기화합니다.를 사용하려고 하면p어레이의 내용을 수정하는 동작은 정의되어 있지 않습니다.

6.3.2.1따르면 어레이 서브스크립션 참조와 어레이 서브스크립션은 동일합니다.

첨자 연산자의 정의[]그것이다E1[E2]와 동일하다(*((E1)+(E2))).

어레이와 포인터의 차이는 다음과 같습니다.

  • 포인터의 배후에 메모리사이즈 정보가 없습니다(포터블로는 취득할 수 없습니다).
  • 불완전한 형식의 배열을 구성할 수 없습니다.
  • 포인터 타입은 불완전한 타입에서 파생될 수 있다
  • 포인터는 재귀 구조를 정의할 수 있다(이것이 앞의 두 개의 결과이다).

이 주제에 대한 더 유용한 정보는 http://www.cplusplus.com/forum/articles/9/에서 찾을 수 있습니다.

char c[] = "test";

문자열 테스트를 포함하는 배열이 생성되므로 임의의 문자를 수정/변경할 수 있습니다.

c[2] = 'p';

그렇지만,

char * c = "test"

스트링 리터럴입니다.- const char 입니다.
따라서 이 문자열 리터럴을 변경하면 segfault가 발생합니다.그렇게

c[2] = 'p';

이제 불법이 되어 세그먼트 폴트를 부여합니다.

char []는, 「알 수 없는 바운드의 문자 배열」의 타입을 나타내고 있습니다.char *는 "char" 타입을 나타냅니다.지금까지 살펴본 바와 같이 "array of unknown bound of char" 유형의 변수 정의가 문자열 리터럴로 초기화되면 유형이 "array[N] of char"로 변환됩니다.여기서 N은 적절한 크기입니다.어레이 애그리게이트로부터의 초기화에도 일반적으로 같은 것이 적용됩니다.

int arr[] = { 0, 1, 2 };

arr은 "array[3] of int" 유형으로 변환됩니다.

사용자 정의 유형 정의(struct,class또는unionC++에서는 array-of-unknown-bound 타입이 금지되어 있습니다.단, C 버전에 따라서는 구조체의 마지막 멤버로 사용할 수 있습니다.이러한 타입을 「플렉서블 어레이」라고 부릅니다.

재귀형 구성도 다른 차이점입니다. 포인터를 구성할 수 있습니다.char *(예:char **,char (*)[10]). 단, 알 수 없는 바운드의 배열에는 적합하지 않습니다.기입할 수 없습니다.char []* ★★★★★★★★★★★★★★★★★」char [][10], (비록,char (*)[] ★★★★★★★★★★★★★★★★★」char [10][](어느 쪽인가)

은 다르게이 경우 cv-qualification은 다르다.typedef char *ptr_to_char ★★★★★★★★★★★★★★★★★」typedef char array_of_unknown_bound_of_char[]은 예상대로 cv-qualifying ", cv-qualifying "으로 const array_of_unknown_bound_of_char const char []인 것이 char (const) []합니다.Array-to-pointer decovery는 Array-to-pointer decovery입니다.

void foo (int const a[]) {
    a = 0;
}

는 합법입니다.array-of-bound 파라미터를 변경할 수 없습니다.

포인터 변수를 선언해도 변수 유형이 생성되지 않고 다음을 가리키는 경우 로트 전체가 명확해집니다. 포인터 변수를 만듭니다.

따라서 실제로 문자열이 필요한 경우 문자 배열을 지정해야 하며 나중에 포인터를 사용할 수 있습니다.

실제로 배열은 상수 포인터와 동일합니다.

또한 char c[]는 기본 주소가 c인 어레이에 메모리를 할당합니다.이 주소를 저장하기 위한 개별 메모리는 할당되지 않습니다.

문자 *c를 쓰면 기본 주소가 c에 저장되어 있는 문자열에 메모리가 할당됩니다.또, c를 격납하기 위해서 다른 메모리 로케이션을 이용한다.

언급URL : https://stackoverflow.com/questions/11555997/c-c-int-vs-int-pointers-vs-array-notation-what-is-the-difference

반응형