2011-09-26 7 views
6

다음과 같은 포인터 초기화의 차이점은 무엇입니까?C에서 포인터를 초기화하는 올바른 방법은 무엇입니까?

char array_thing[10]; 

char *char_pointer; 

다음 초기화의 차이점은 무엇입니까?

1.) char_pointer = array_thing; 

2.) char_pointer = &array_thing 

두 번째 초기화가 유효합니까?

+3

@ k-ballo 숙제라고 결론을내는 방법을 확신 할 수 없습니다. – MGZero

+0

숙제가 아니라 .. 단지 C 언어를 배우려고하는 것입니다. – diesel

+1

@ K-ballo : 기본 질문을하는 사람들은 누구나 학술 정보학을 속이려고 노력하는 것이 아니라 실제로 배우고 싶은 사람들이 있습니다. – orlp

답변

5

두 번째 초기화가 유효하지 않습니다. 당신은 사용할 필요가 :

char_pointer = array_thing; 

또는

char_pointer = &array_thing[0]; 

&array_thing이 경우 배열에 대한 포인터 (입력 char (*)[10], 당신은 배열의 첫 번째 요소에 대한 포인터를 찾고

+0

고마워요! 이게 내가 생각한거야. – diesel

+0

그러나 두 번째 초기화가 여전히 작동 할 수는 있지만 호환되지 않는 포인터 유형에 대한 경고가 표시됩니다. – Dmitri

+1

@Dmitri, 명백한 타입 변환이없는 포인터 변환 ('void *'을 제외하고)은 C에서 불법입니다. ** 6.5.4 캐스트 연산자 **, 3 절 : "포인터와 관련된 변환 ...은 명백한 던지기의. " –

0

게시 한 코드에는 초기화가 전혀 없습니다. 즉, 배열은 포인터 (배열의 첫 번째 요소에 대한 포인터)로 부패한다는 점을 기억해야합니다. 배열의 주소 가져 오기 확실히 유효하지만 지금은 0입니다. char* 대신입니다. 당신이 (오히려 그것의 주소) array_thing의 첫 번째 요소에 char_pointer를 설정하는 첫 번째 경우에 http://c-faq.com/aryptr/aryvsadr.html

+1

배열 (즉, 배열 유형의 표현식)이 대부분의 컨텍스트에서 포인터로 감쇠됩니다. * (암묵적으로 인정함). 예외는 단항'&'연산자의 피연산자, 단항'sizeof' 연산자의 피연산자 및 배열 객체를 초기화하는 데 사용되는 이니셜 라이저의 문자열 리터럴 (예 :'char s [] = "hello"; '). –

1

이 때 comp.lang.c 자주 묻는 질문, 질문 6.12를 참조하십시오. 포인터 산술을 사용하면 색인 생성과 마찬가지로 다른 요소로 이동합니다. 예를 들어

char_pointer[3] = 'c'; 

char_pointer = + 3과 동일하다; char_pointer = 'c';

두 번째 예제 ... 나는 그것이 당신이 그것을하는 방식으로 유효하다고 생각하지 않습니다.

관련 문제