c + 중 배열 이름과 함수 의 차이

5391 단어
문장http://tech.163.com/05/0823/11/1RR94CAS00091589.html
머리말
지침 은 C/C++ 언어의 특색 이 고 배열 명 은 지침 과 너무 비슷 하 며 심지어 배열 명 은 지침 으로 사용 할 수 있 는 경우 가 많다.그래서 많은 프로 그래 밍
헷 갈 려.그리고 많은 대학 선생님 들 이 C 언어 를 가 르 치 는 과정 에서 학생 들 에 게 '배열 이름 이 지침' 이 라 고 잘못 설명 했다.다행히 나의 대학 선생님 은 그 중의 하나 이다.지금까지 나 는 하루 하루 C/C++ 프로젝트 의 개발 을 진행 하고 있다.
주변 에는 '배열 이름 이 지침' 이라는 오해 가 남아 있 는 프로그래머 들 로 가득 했다.
이런 오해의 근원 은 국내의 유명한 C 프로 그래 밍 튜 토리 얼 에 있 을 것 이다.
.만약 이 글 이 많은 중국 프로그래머 들 이 배열 이름과 지침 에 대한 오 해 를 바로 잡 을 수 있다 면 필 자 는 그다지 기 쁘 지 않 을 것 이다.이 글 을 통 해 필 자 는 지식 에 굶 주 린 수많은 중국 프로그래머 들 사이 에서 국내 컴퓨터 도서 작성 자 들 에 게 '깊이 있 는 탐색' 을 할 수 있 기 를 기대한다.
"의 사고방식 과 더욱 정교 해 지 는 진지 한 태도 로 도서 편찬 업 무 를 대 할 수 있 습 니 다. 시장 에 작가 의 사고 결정 을 융합 시 킨 심혈 을 기울 인 작품 이 많 기 를 바 랍 니 다!"
  
판 타지 배열 명
프로그램 을 보십시오. (본 프로그램 은 WIN 32 플랫폼 에서 컴 파일 됩 니 다.)1. #include <iostream.h>
2. int main(int argc, char* argv[])
3. {
4.  char str[10];
5.  char *pStr = str;
6.  cout << sizeof(str) << endl;
7.  cout << sizeof(pStr) << endl;
8.  return 0;
9. }

1. 배열 이름 은 포인터 가 아 닙 니 다.
우 리 는 먼저 '수조 명 이 지침' 이라는 말 을 뒤 집 고 반증 법 을 사용한다.
배열 이름 이 포인터 가 아니 라 는 것 을 증명 합 니 다.
가설: 배열 이름 은 포인터 입 니 다.
pStr 와 str 는 모두 지침 입 니 다.
왜냐하면 WIN 32 플랫폼 에서 포인터 길 이 는 4 입 니 다.
그래서 6 줄 과 7 줄 의 출력 은 모두 4 여야 한다.
실제 상황 은 6 줄 출력 10, 7 줄 출력 4 이다.
그래서 만약 에 성립 되 지 않 는 다 고 가정 하면 배열 이름 은 지침 이 아 닙 니 다.
2. 배열 이름 은 포인터 와 같다.
위 에서 우 리 는 배열 이름 이 확실히 지침 이 아니 라 는 것 을 증명 하 였 으 나, 우 리 는 프로그램의 다섯 번 째 줄 을 다시 보 았 다.이 줄 프로그램 은 배열 이름 을 포인터 에 직접 할당 합 니 다. 이것 은 배열 이름 이 지침 인 것 처럼 보 입 니 다!
우 리 는 또 발견 할 수 있다.
배열 이름 이 포인터 처럼 보 이 는 예:1. #include <string.h>
2. #include <iostream.h>
3. int main(int argc, char* argv[])
4. {
5.  char str1[10] = "I Love U";
6.  char str2[10]; 
7.  strcpy(str2,str1);
8.  cout << "string array 1: " << str1 << endl;
9.  cout << "string array 2: " << str2 << endl;
10.  return 0;
11. }

표준 C 라 이브 러 리 함수 strcpy 의 함수 원형 에서 받 아들 일 수 있 는 두 개의 매개 변 수 는 모두 char 형 포인터 이 고 우리 가 호출 에서 전달 하 는 것 은 두 개의 배열 이름 입 니 다!함수 출력:string array 1: I Love U
string array 2: I Love U

배열 이름 이 다시 지침 처럼 보 입 니 다!
배열 이름 은 지침 이 아 닌 데 왜 여기저기 서 배열 이름 을 지침 으로 사용 합 니까?그래서 많은 프로그래머 들 은 배열 명 (주) 은 지침 이 아 닌 지침 이라는 결론 을 내 렸 다.
온 마귀.
  
배열 이름 을 폭로 하 다.
이제 배열 이름 의 본질 을 밝 힐 때 가 되 었 습 니 다. 먼저 세 가지 결론 을 내 립 니 다.
(1) 배열 이름 의 의 미 는 실체 가 데이터 구조 라 는 것 을 말 하 는데 이런 데이터 구 조 는 바로 배열 이다.
(2) 배열 이름 의 외연 은 그 가 가리 키 는 실 체 를 가리 키 는 지침 으로 전환 할 수 있 고 지침 상수 이다.
(3) 배열 을 가리 키 는 지침 은 다른 변수 유형 (WIN 32 플랫폼 에서 길 이 는 4) 으로 배열 의 저장 주 소 를 의미 합 니 다!
1. 배열 이름 은 하나의 데이터 구 조 를 가리킨다. 배열
현재 첫 번 째 프로그램의 여섯 번 째 줄 의 출력 이 10 인 이 유 를 설명 할 수 있 습 니 다. 결론 1 에 따 르 면 배열 이름 str 의 의 미 는 데이터 구조, 즉 길이 가 10 인 char 형 배열 이기 때문에 size of (str) 의 결 과 는 이 데이터 구조 가 차지 하 는 메모리 크기: 10 바이트 입 니 다.
다시 보기:1. int intArray[10];
2. cout << sizeof(intArray) ;

두 번 째 줄 의 출력 결 과 는 40 (전체 배열 이 차지 하 는 메모리 공간 크기) 입 니 다.
C/C + 프로그램 이 이렇게 쓸 수 있다 면:1. int[10] intArray;
2. cout << sizeof(intArray) ;

intArray 가 int [10] 라 는 데이터 구조의 인 스 턴 스 로 정의 되 었 다 는 것 을 잘 알 고 있 습 니 다. 안 타 깝 게 도 C/C++ 는 현재 이러한 정의 방식 을 지원 하지 않 습 니 다.
2. 배열 이름 은 포인터 상수 로 할 수 있 습 니 다.
결론 2 에 따 르 면 배열 이름 은 그 가 가리 키 는 실 체 를 가리 키 는 지침 으로 바 꿀 수 있 기 때문에 프로그램 1 의 다섯 번 째 줄 배열 이름 은 지침 에 직접 할당 되 고 프로그램 2 일곱 번 째 줄 은 배열 이름 을 지침 형 인삼 으로 직접 구성 할 수 있다.
다음 절차 가 성립 됩 니까?1. int intArray[10];
2. intArray++;

독 자 는 컴 파일 할 수 있 는데 컴 파일 에 오류 가 있 음 을 발견 할 수 있다.이 유 는 배열 이름 이 실 체 를 가리 키 는 지침 으로 바 뀔 수 있 지만 하나의 지침 상수 로 만 볼 수 있 고 수정 되 지 않 기 때문이다. 
한편, 지침 은 구조 체, 배열 이 든 기본 데이터 유형 을 가리 키 는 지침 이 든 모두 원시 데이터 구조의 의 미 를 포함 하지 않 고 WIN 32 플랫폼 에서 size of 작업 의 결 과 는 모두 4 이다.
많은 프로그래머 들 의 또 다른 오 해 를 바로 잡 는 김 에많은 프로그래머 들 은 sizeof 가 함수 라 고 생각 하지만, 실제로 그것 은 조작 부호 이지 만, 그 사용 방식 은 확실히 함수 처럼 보인다.구문 sizeof (int) 는 sizeof 가 확실히 함수 가 아니 라 는 것 을 설명 할 수 있 습 니 다. 함수 가 형 삼 (하나의 변수) 을 받 아들 이기 때문에 세계 에서 C/C + 함수 가 하나의 데이터 형식 (예 를 들 어 int) 을 '형 삼' 으로 받 아들 이 는 것 이 없습니다.
3. 데이터 이름 은 데이터 구조의 의 미 를 잃 을 수 있 습 니 다. 
이곳 에 서 는 여러 조 의 판 타지 문제 가 원만 하 게 해결 되 었 음 에 도 불구 하고 잔잔 한 호수 위 에 다시 파도 가 일 고 있다.다음 절 차 를 보십시오.1. #include <iostream.h>
2. void arrayTest(char str[])
3. {
4.  cout << sizeof(str) << endl;
5. }
6. int main(int argc, char* argv[])
7. {
8.  char str1[10] = "I Love U";
9.  arrayTest(str1); 
10.  return 0;
11. }

프로그램의 출력 결 과 는 4 입 니 다.말 도 안 되 죠?
무 서운 숫자 입 니 다. 앞 에 지침 의 길이 라 고 언급 되 어 있 습 니 다!
결론 1 에 따 르 면 데이터 이름 의 의 미 는 배열 이라는 데이터 구조 이 고 array Test 함수 에서 str 는 배열 이름 입 니 다. 그런데 왜 size of 의 결 과 는 지침 의 길이 입 니까?이것 은:
(1) 배열 이름 이 함수 형 삼 일 때 함수 체 내 에서 그 자체 의 의 미 를 잃 고 하나의 지침 일 뿐이다.
(2) 안 타 깝 게 도 그 의 미 를 잃 는 동시에 상수 적 특성 도 잃 어 버 려 서 증가, 자감 등 조작 을 할 수 있 고 수정 할 수 있다.
그래서 데이터 이름 이 함수 형 삼 일 때 전면적으로 일반 지침 으로 전락 합 니 다!그것 의 귀족 신분 은 박탈 되 어 4 바이트 밖 에 안 되 는 서민 이 되 었 다.
결론
  
종결 어
마지막 으로 필 자 는 저 와 제 동료 들 이 진정 으로 신중 한 연구 태도 로 개발 중의 문 제 를 진지 하 게 생각 할 수 있 기 를 바 랍 니 다. 그래 야 우리 사이 에 대사 급 프로그래머, 최고의 개발 서적 이 생 길 수 있 습 니 다.매번 미국 놈 들 의 개발 서적 을 들 고 있 을 때마다 우 리 는 이렇게 감개 무량 하 게 느낀다. 우 리 는 너무 뒤떨어 졌 다.

좋은 웹페이지 즐겨찾기