한 문제 로 인 한 사고.
운행 결 과 를 묻다.
처음에는 무슨 뜻 인지 모 르 고 탐색 을 하 다가 점점...읊다, 읊조리다
사실 나 는 char * 지침 의 진정한 의 미 를 전혀 이해 하지 못 했다. 원래 이런 것 이 었 다.
예:
char *s="abc"; char str[]="abccd";
1、char *s="abc";
이 할당 보기:
오른쪽 은 'abc' 입 니 다. 문자열 상수 입 니 다. 메모리 어 딘 가 에 존재 합 니 다. (제 기계 에는 ds: 0x0046f 034) 프로그래머 가 모 르 고 컴 파일 러 가 배정 한 것 도 알 필요 가 없습니다. (물론 이 할당 후에 프로그래머 는 이 문자열 을 알 고 제어 할 수 있 습 니 다)문자열 상수 가 있 는 메모 리 는 읽 기 전용 입 니 다.
왼쪽, 문자 포인터 s, 할당 시 주소 ds: 0x0046f 034 의 오프셋 주소 (abc 가 있 는 곳) 를 포인터 변수 s (주 소 는 ds: 0x0046f 034) 에 저장 합 니 다.프로그래머 가 완전히 제어 할 수 있 는 메모 리 는 포인터 변수 가 차지 하 는 이 네 개의 바이트 메모리 일 뿐 이 포인터 의 방향 만 바 꿀 수 있 습 니 다. 가리 키 는 메모리 가 쓸 수 있 는 지 없 는 지 는 프로그램 에 달 려 있 습 니 다. 이 프로그램 은 메모리 만 읽 고 쓸 수 없습니다!
2、char str[]="abccd";
이 할당 을 다시 보 세 요:
오른쪽 은 위 와 유사 합 니 다. "abccd" 이자 문자열 상수 입 니 다. 메모리 어 딘 가 에 존재 합 니 다 (ds: 0x0046f02c 입 니 다). 프로그래머 는 모 릅 니 다. 컴 파일 러 가 배정 한 것 입 니 다. (이 할당 후에 프로그래머 는 이 상수 가 어디 에 있 는 지 모 릅 니 다. 포인터 로 이 메모 리 를 가리 키 지 않 았 기 때 문 입 니 다. 이것 은 위 와 다 릅 니 다)이 문자열 의 상수 가 있 는 메모리 도 읽 기 전용 입 니 다.
왼쪽, 문자 배열 str, 할당 할 때 주소 ds: 0x0046f02c ("abccd" 가 있 는 곳) 가 가리 키 는 메모리 의 내용 을 문자 배열 str 시작 (주 소 는 ds: 0x0013ff 74) 메모리 에 복사 합 니 다. 복사 할 때마다 하나의 바이트 (char 형 변 수 는 1 바이트) 메모리 로 이 문 자 를 저장 합 니 다.문자 배열 str 에서 시 작 된 이 부분 에 이 문 자 를 저장 하 는 메모 리 는 프로그래머 가 완전히 제어 할 수 있 고 읽 고 쓸 수 있 기 때문에 이 메모리 에 쓰 는 것 은 당연히 문제 가 없습니다!
여기 서 몇 년 전에 본 책 'C 와 지침' (Kenneth A. Reek 저, 서 파 역, 지금 은 2 판 이 있 습 니 다.역시 그래.
많은 프로그래머 들 은 배열 이름과 지침 의 차이 에 대해 잘 알 지 못 한다. 그들 은 배열 이름 이 지침 이 라 고 생각 하지만 실제 배열 이름과 지침 은 큰 차이 가 있다. 사용 할 때 정확 한 구분 을 해 야 한다. 그 구분 규칙 은 다음 과 같다.
규칙 1 배열 이름 은 하나의 데이터 구 조 를 가리 키 는데 이런 데이터 구 조 는 바로 배열 이다. char str[10]; char *pStr = str; cout << sizeof(str) << endl; cout << sizeof(pStr) << endl;
출력 결 과 는: 10 4. 이 는 배열 이름 str 가 데이터 구조 char [10] 를 가리킨다.
규칙 2 배열 이름 은 그 가 가리 키 는 실 체 를 가리 키 는 지침 으로 바 꿀 수 있 으 며 하나의 지침 상수 이 므 로 자체 증가, 자체 감소 등 조작 을 할 수 없고 수정 할 수 없다. char str[10]; char *pStr = str; str++; //컴 파일 오류, 힌트 str 는 왼쪽 값 이 아 닙 니 다. pStr++; //컴 파일 이 정확 하 다.
규칙 3 이 배열 을 가리 키 는 지침 은 다른 변수 유형 (WIN 32 플랫폼 에서 길 이 는 4) 으로 배열 의 저장 주 소 를 의미 합 니 다.
규칙 4 배열 이름 이 함수 형 삼 일 때 함수 체 내 에서 그 자체 의 의 미 를 잃 고 하나의 지침 일 뿐이다.안 타 깝 게 도 그 의 미 를 잃 는 동시에 상수 적 특성 도 잃 어 버 려 서 자체 증가, 자체 감소 등 조작 을 할 수 있 고 수정 할 수 있 습 니 다.
예 를 들 어 void arrayTest (char str []) {cout < < sizeof (str) < < endl; / 출력 포인터 길이 str +; / 컴 파일 이 정확 합 니 다. }
int main(int argc, char* argv[]) { char str1[10] = "I Love U"; arrayTest(str1); return 0; }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.