2010-05-30 9 views

답변

2

첫 번째 선언은 배열을 선언하고 두 번째는 포인터를 선언합니다.

특정 측면의 차이에 관심이 있으시면 질문을 명확히하십시오.

9

char a[]="string"; // a은 문자 배열입니다.

char *p="string"; // p은 정적 할당을 갖는 문자열 리터럴입니다. p의 내용을 수정하려고하면 문자열 리터럴이 메모리의 읽기 전용 섹션에 저장되므로 정의되지 않은 동작이 발생합니다.

2

차이가 없습니다. 배열에 실제로 쓰고 싶지 않다면 두 번째 형식을 사용하려고하면 전 세계가 폭발하게됩니다. here을 참조하십시오.

27

첫 번째 배열은 배열이고 다른 하나는 포인터입니다.

배열 선언 6 자를위한 공간이 따로 설정 "char a[6];"요청, 이름으로 알려지게 "a.는"즉, 6 자 앉을 수있는 "a"라는 이름의 위치가있다. 반면에 포인터 선언 "char *p;"은 포인터를 보유하는 장소를 요청합니다. 포인터는 이름이 "p,"으로 알려지며 임의의 문자 (또는 인접한 문자 배열)를 가리킬 수 있습니다. 이런 식으로 표현 될 수있는 데이터 구조를 초래

명령문

char a[] = "hello"; 
char *p = "world"; 

:

+---+---+---+---+---+---+ 
a: | h | e | l | l | o |\0 | 
    +---+---+---+---+---+---+ 
    +-----+  +---+---+---+---+---+---+ 
p: | *======> | w | o | r | l | d |\0 | 
    +-----+  +---+---+---+---+---+---+ 

는 X와 같은 기준 [3]에 따라 다양한 코드를 생성하는 것을 실현하는 것이 중요 x가 배열인지 포인터인지 여부 위의 선언을 감안할 때 컴파일러는 표현식 a [3]을 볼 때 "a"라는 위치에서 시작하여 코드 3을 지나서 그 문자를 가져옵니다. 표현식 p [3]을 볼 때, 위치 "p"에서 시작하여 포인터 값을 가져오고 포인터에 3을 더한 다음 마지막으로 가리킨 문자를 가져 오는 코드를 내 보냅니다. 위의 예제에서 a [3]과 p [3]는 모두 'l'문자이지만 컴파일러는 다르게옵니다.

검색에는 인터넷의 주제에 대한 설명이 많이 있습니다.

+4

여기서 첫 번째 경우에 할당 된 메모리는 어디에 있습니까? 스택? 더미? p를 somethng로 지정하기로 결정하면 "wrold"가 할당 해제됩니다. ASCII 아트웍의 경우 – Laz

+6

+1. –

+3

@Ram Bhat : 첫 번째 경우에는 정의가 어디에 배치되는지에 따라 다릅니다. 그것은 함수에, 아마도 스택에 있다면, 그것이 구조체에 있다면, 전체 구조체가 어디에 할당되어 있는가에 달려 있습니다. 그것이 어떤 함수의 바깥 쪽이라면, 글로벌 바스 (var vars) 부분에있다. 포인터 p에 대해서도 동일하게 적용됩니다. p가 가리키는 "world"문자열 대신 * 보통 *는로드 할 때 메모리에 매핑되는 실행 파일의 특정 섹션에 있으며 이는 문자열 테이블로 사용됩니다. –

1

한 가지 차이점은 sizeof (a) -1은 컴파일 타임에 문자열의 길이로 대체된다는 것입니다. p를 사용하면 strlen (p)을 사용하여 런타임에 길이를 가져와야합니다. 또한 일부 컴파일러는 char * p = "string"을 좋아하지 않지만 const char * p = "string"을 원합니다.이 경우 "string"의 메모리는 읽기 전용이지만 a의 메모리는 아닙니다. 컴파일러가 const 선언을 요구하지 않더라도 p가 가리키는 문자열 (즉 * p = 'a')을 수정하는 것은 나쁜 습관입니다. 포인터 p는 다른 것을 가리 키도록 변경할 수 있습니다. 배열 a를 사용하면 새로운 값을 배열에 복사해야합니다 (맞는 경우).