한 문제 로 인 한 사고.

자 이언 트 인터넷 채용 문 제 를 보고 기초 지식 이 부족 하 다 는 것 을 느 꼈 다.마을 사람들 은 병 이 있 는 사람 은 병 을 치료 하고, 병 이 없 는 사람 은 몸 을 건강 하 게 할 수 있다.
운행 결 과 를 묻다.
처음에는 무슨 뜻 인지 모 르 고 탐색 을 하 다가 점점...읊다, 읊조리다
사실 나 는 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; }

좋은 웹페이지 즐겨찾기