2012-08-13 2 views
3

파이썬 문자열과 C 문자열 배열을 문자열 리터럴에 연결하려고했습니다. 예를 들어 :파이썬 문자열과 C 문자 배열의 유사성

char* word="Hello"; 
     word="Now"; 

는 읽기 전용 메모리 위치에 배치 문자 문자열 "안녕하세요"를 할당합니다. 이제 "Now"에 단어를 재 할당하면 이제 문자 배열에 "Now"에 해당하는 메모리 위치가 할당됩니다.

(분명 문자열) 파이썬 심지어 숫자

는 값 2 메모리 위치를 지정하고 값 메모리 위치를 재배치되면서처럼 작동하는 것이 C 여기서 대조 3.

a=2 
a=3 

거의 모든 변수 할당에 대해 변수는 할당 된 값을 포함합니다. 나는 여기서 좋은 비교를하고 있는가?

답변

3

C에서 char *은 "문자를 가리키는 포인터"유형입니다. 포인터는 값 자체에 대한 액세스를 제공하는 "핸들"과 같습니다. word = "Now";을 할당하면 문자열의 문자가 아니라 핸들이 변경됩니다. "Hello""Now"은 모두 상수 저장소에 바이트 그룹으로 존재합니다.

파이썬은 그 기능을 숨기고 있지만 내부적으로 내장 된 문자열 참조는 본질적으로 포인터처럼 작동합니다. 따라서 여러분의 관찰은 정확한 것입니다.

이 언어의 문자열의 큰 차이점은 파이썬에서 모든 문자열이 변경되지 않는다는 것입니다. C를 사용하면 (상수가 아닌) 문자열 내의 문자를 (할당에 의해) 조작 할 수 있습니다. 예를 들어 :

char word [] = "Hello"; 
// word is now the name of a 6-character (including final null) mutable string 
word[0] = 'h'; 
// Now word has the value "hello". 

파이썬에서, 당신은 완전히 새로운 캐릭터를 만들어야 할 것입니다 :

word = 'h' + word[1:] 

을 여기에 새로운 문자열을 구성하는 바이트 word보다 다릅니다.

당신은 파이썬이 "참조 의미론"을 가지고 있다는 것은 당연합니다. 모든 것은 값이 아닌 핸들을 조작하는 것처럼 동작합니다.

>>> a=[1] 
>>> b=a 
>>> a 
[1] 
>>> b 
[1] 
>>> a[0]=5 
>>> a 
[5] 
>>> b 
[5] 

여기서 할당 b = a은 핸들 또는 참조를 목록에 복사했습니다. 목록 자체는 복사되지 않습니다. 이것은 a의 첫 번째 요소를 변경하면 b이 변경 되었기 때문에 분명합니다.

+0

a 및 b의 출력에 변경 사항이 표시되지 않습니다. 둘 다 [1]을 인쇄합니다. 변화가 의미하는 바를 명확히 할 수 있습니까? – joebalt

+1

@Joe Baltimore : 예제를 수정했습니다. Gene은 오타가 있다고 생각합니다. 그것은 훌륭한 예입니다. +1 – dawg

+0

@JoeBaltimore 죄송합니다. 수정했습니다. 오류가 발생했습니다. 고쳐 주셔서 감사합니다. – Gene

0

char *는 word 변수가 포인터 변수임을 의미합니다. 문자열의 주소는 변수에 저장되며 문자열의 문자는 이동하지 않습니다. C의 경우 모든 할당은 거의 모든 변수가 아니라 변수에 값을 이동합니다. 이 경우 주소는 이동되는 값입니다.

파이썬은 좀 더 복잡합니다. 변수를 이전 값을 해제하는 것처럼 장면 뒤에서 다른 작업이 발생할 수있는 값에 바인딩합니다.

+0

그래도 메모리에서 별도로 불변 문자열을 만든 다음 주소가 char * (문자열 내용을 변경할 수있게하는 char var []가 아닌) 변수에 주어지기 때문에 특별합니다. . 문자열에 할당되지 않은 경우 int 또는 char *와 같은 다른 유형의 할당에는 해당되지 않습니다. – vkaul11