C/C++ int[] vs int*(포인트 vs. 어레이 표기).뭐가 다른데?
C의 배열은 순차적으로 저장된 데이터에 대한 포인터일 뿐입니다.그러나 어떤 차이가 []와 *의 표기법의 차이를 의미하는지, 가능한 모든 사용 컨텍스트에서 알 수 있습니다.예를 들어 다음과 같습니다.
char c[] = "test";
함수 본문에 이 명령을 입력하면 스택에 문자열이 할당됩니다.
char* c = "test";
는 데이터(읽기 전용) 세그먼트를 가리킵니다.
모든 사용 상황 컨텍스트에서 이러한 두 표기법 간의 모든 차이를 나열하여 명확한 일반 보기를 구성할 수 있습니다.
C99 표준에 따라:
배열 유형은 요소 유형이라고 하는 특정 멤버 개체 유형을 사용하여 연속적으로 할당되는 비어 있지 않은 개체 집합을 나타냅니다.
- 배열 유형은 요소 유형과 배열에 포함된 요소 수에 따라 특성이 지정됩니다.배열 유형은 요소 유형에서 파생되며 요소 유형이 다음과 같은 경우
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
또는union
C++에서는 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
'programing' 카테고리의 다른 글
Java를 사용한 두 날짜 사이의 일 수 계산 (0) | 2022.08.14 |
---|---|
백엔드에서 페이지화된 데이터의 컨텍스트에서 Vuex의 사용 (0) | 2022.08.14 |
Vue 컴포넌트의 이름은 무엇입니까? (0) | 2022.08.14 |
Vue - 무선 입력이 여러 개입니까? 값이 확인되었습니까? (0) | 2022.08.14 |
v-text 필드의 최소 높이 제한을 확인하시겠습니까? (0) | 2022.08.14 |