K & R 학습 노트 제5 장

7606 단어 K&R학습 노트
지침 은 C 언어의 정수 다.이 장 은 처음부터 하나의 예 로 swap (두 수의 값 을 교환) 로 설명 한다.생각해 보 니 이상 하 다. 내 가 대학 때 C 언어 를 공 부 했 을 때 정말 엉망 이 었 다. 여기 도 그 당시 에 어 지 러 웠 다. 형 삼, 실 삼, 지침 이런 것들 은 아무리 해도 이해 하지 못 했다. 나중에 데이터 구 조 를 독학 한 후에 갑자기 깨 달 았 다.포인터 성명 에는 보통 두 가지 방법 이 있다.
int a = 0;
int b = 0;
int *pa = &a;
int* pb = &b;

저 는 두 번 째 유형 을 사용 하 는 것 을 좋아 합 니 다. 왜냐하면 그 는 특정한 변수의 유형 을 명확 하 게 지 적 했 기 때 문 입 니 다. 예 를 들 어 pb 는 int * 유형 이 고 매개 변 수 를 전달 할 때 이해 하기 쉽 습 니 다. 한편, 작 가 는 첫 번 째 유형 을 사용 하 는 경향 이 있 습 니 다. 왜냐하면 이것 은 pa 에 대해 내용 을 취 할 때 int 유형의 값 을 얻 을 수 있 음 을 나타 내기 때 여러분 은 자신의 습관 에 따라 고 칠 필요 가 없습니다.
지침 의 연산 에 대해 서도 주의해 야 할 부분 이 있다.
C 언어의 연산 자 순서에 따라 자체 감소 조작 자 는 주소 와 * 를 찾 는 것 보다 우선 합 니 다.그래서 + + * p 는 p 가 가리 키 는 변 수 를 1 로 증가 시 킵 니 다.* p + + 는 p 가 가리 키 는 다음 변수 에 대한 값 입 니 다.
포인터 와 배열 은 밀접 한 관 계 를 가진다. 배열 은 매개 변수 로 전달 할 때 실제 적 으로 그의 첫 번 째 주 소 를 전달한다.한편, 배열 요소 a [i] 는 컴 파일 러 에 의 해 * (pa + i) 로 수정 되 고 포인터 의 효율 은 배열 아래 표 시 를 사용 하 는 것 보다 약간 높 습 니 다.
다시 한 번 말씀 드 리 지만 회사 필기시험, 면접 문제 가 모두 망 가 졌 을 수도 있 는 strcpy 와 strcmp:
void strcpy1(char *s,char *t)
{
	int i = 0;
	while((s[i] = t[i]) != '\0')
		i++;
}

void strcpy2(char *s,char *t)
{
	while((*s = *t) != '\0')
	{
		s++;
		t++;
	}
}

void strcpy3(char* s,char* t)
{
	while((*s++ = *t++) != '\0')
		;
}

void strcpy4(char *s, char* t)
{
	while(*s++ = *t++)
		;
}

이 네 가지 문법 은 성능 차이 가 크 지 않 은 것 같 지만 가 독성 은 많이 떨어진다.개인 적 으로 좀 화려 하고 실속 이 없다 고 생각 합 니 다.
책 에서 다 차원 배열 하 나 를 소개 하고 수업 후 문 제 를 냈 는데 대체적으로 배열 아래 표 시 를 통 해 2 차원 배열 을 방문 하 는 것 이 아니 라 지침 을 통 해구체 적 인 해답 도 간단 합 니 다. 저 는 더 간단 한 예 로 개념 을 밝 히 고 싶 습 니 다. (이 유형의 문 제 는 프로그래머 면접 보전 에서 나 왔 습 니 다)
int main(void)
{
	int Arr[3][4] = {10,20,30,40,50,60,70,80,90,100,110,120};
	int (*pArr)[4] =Arr;//  pArr   
	printf("%d
",**pArr); printf("%d
",**(pArr+1)); printf("%d
",*(*pArr+1)); }

이 문 제 는 pArr 가 어떤 유형 인지 이해 하 는 것 이 관건 이다.pArr 는 하나의 포인터 입 니 다. 하나의 배열 을 가리 키 고 배열 에는 4 개의 요소 가 있 으 며 모든 요 소 는 성형 입 니 다.이 지침 은 Arr 와 어떤 관계 입 니까?사실 C 언어 에는 고 차원 배열 이 없고 기본 적 인 배열 만 있 지만 배열 의 모든 요 소 를 배열 로 허용 합 니 다. 이렇게 해서 이른바 고 차원 배열 로 구성 되 었 습 니 다.이 개념 을 정리 하고 우 리 는 Arr, Arr 는 3 차원 배열 이 고 모든 배열 의 요 소 는 4 차원 배열 이다.따라서 Arr (첫 번 째 주소) 를 4 차원 배열 을 가리 키 는 가리 키 는 pArr 에 할당 할 수 있 습 니 다. 즉, 4 차원 배열 의 주 소 를 4 차원 배열 을 가리 키 는 지침 에 부여 할 수 있 습 니 다.
이렇게 많아pArr 는 3 차원 배열 Arr 의 첫 번 째 주 소 를 가리 키 며 그 에 게 처음으로 연결 * pArr 에서 얻 은 것 은 Arr 의 0 번 째 요소 입 니 다. (이 요 소 는 배열 {10, 20, 30, 40} 의 첫 번 째 주소 입 니 다) 그래서 * pArr 는 배열 {10, 20, 30, 40} 의 첫 번 째 요 소 를 얻 었 습 니 다.한편, paArr + 1 은 Arr 의 첫 번 째 요소 {50, 60, 70, 80} 을 얻 었 습 니 다. * * (pArr + 1) 가 바로 그의 첫 번 째 요소 50 입 니 다. *(* pArr + 1) 출력 이 20 인 이 유 는 * pArr 가 앞에서 말 한 것 처럼 배열 {10, 20, 30, 40} 의 첫 번 째 주소 이 고 * pArr + 1 은 두 번 째 요소 20 의 주소 이기 때 문 입 니 다.
명령 행 인자 에 대해 말하자면 매우 간단 하 다.
int main(int argc, char* argv[])
에서 argc 는 매개 변수의 개 수 를 기록 했다 (최소 1 개, 이 매개 변 수 는 프로그램 이름).한편, argv 는 argv [argc - 1] 의 배열 로 배열 의 모든 요 소 는 지침 이 고 지침 은 각 명령 행 인 자 를 가리킨다.그러나 실제 적 으로 사용 하면 약간 복잡 하 다. 대표 적 인 문 제 는 바로 유 닉 스 와 Liux 의 많은 매개 변 수 를 가 진 프로그램 이다. 예 를 들 어:
find - x - n 모드
패턴 과 일치 하지 않 는 모든 줄 을 인쇄 하고 줄 번 호 를 인쇄 합 니 다.(- x 와 - n 을 조합 하여 사용 할 수 있 습 니 다) 책 에서 제 시 된 프로그램 을 살 펴 보 겠 습 니 다.
#include 
#include 

#define MAXLINE	1000

int getline(char* line, int max);

int main(int argc, char* argv[])
{

	char line[MAXLINE];
	long lineno = 0;
	int c, except = 0, number= 0,found= 0;
	while(--argc > 0 && (*++argv)[0] == '-')//             "-"		      (*++argv)[0]  *++argv[0]   
	{
		while(c = *++argv[0])
		{
			switch (c)
			{
			case 'x':
				except = 1;
				break;
			case 'n':
				number =1;
				break;
			default:
				printf("find: illegal option %c
",c); argc = 0; found = -1; break; } } } if(argc != 1) printf("Usage: find -x -n pattern
"); else { while(getline(line,MAXLINE) > 0) { lineno++; if((strstr(line,*argv) != NULL) != except) { if(number) { printf("%ld:",lineno); } printf("%s",line); found++; } } } return found; } int getline(char s[],int lim) { int c, i ; for(i = 0; i < lim-1 && (c = getchar())!= EOF && c != '
';++i) s[i] = c; if(c == '
') { s[i] = c; ++i; } s[i] = '\0'; return i; }

while (-- argc > 0 & & & (* + argv) [0] = '-') 두 번 째 명령 행 인자 가 '-' 인지 확인 합 니 다. 여기 서 주의해 야 할 것 은 (* + argv) [0] 과 * + argv [0] 의 차이 입 니 다.(* + argv) [0] 은 먼저 argv 를 추가 하여 두 번 째 명령 행 인 자 를 가리 키 게 한 다음 에 이 를 풀 고 두 번 째 명령 행 매개 변수 문자열 의 첫 주 소 를 가 져 온 다음 에 첫 번 째 주소 가 '-' 인지 판단 합 니 다.한편, * + argv [0] 는 argv [0] 를 먼저 취하 고 이때 '-' 를 가리 키 며 증가 한 다음 에 다시 인용 합 니 다.while (c = = = * + argv [0]) 는 바로 이 작용 을 이용한다.이 이중 순환 을 통 해 명령 행 인자 중 - x 또는 n 이 선택 되 었 는 지 여부 가 except 와 number 를 통 해 기록 되 었 습 니 다.그리고 이때 argv 도 명령 행 의 세 번 째 매개 변수, 즉 모드 를 가 리 켰 다.이 때 getline 함 수 를 통 해 한 줄 한 줄 입력 을 가 져 와 line 에 저장 한 다음, line 에 패턴 에 대응 하 는 단어 가 있 는 지 비교 합 니 다.있 으 면 이 단어 가 처음 나타 난 위 치 를 되 돌려 줍 니 다. 그렇지 않 으 면 NULL 로 돌아 갑 니 다.여기 문장:
if((strstr(line,*argv) != NULL) !=  except)
약간 구 부 러 졌 으 니 여기 서 설명해 주세요.두 가지 상황 으로 나 뉘 어 1: except = 0, 이 때 프로그램 이 인쇄 를 요구 하 는 것 은 이 모드 가 나타 나 는 줄 입 니 다. 찾 으 면 strstr (line, * argv)! =NULL 은 1, 1! =0. if 구문 조건 이 성립 되 어 이 줄 을 인쇄 합 니 다.찾 지 못 하면 strstr (line, * argv)! =NULL 은 0, 0! =0, if 구문 조건 이 성립 되 지 않 으 면 이 줄 을 인쇄 하지 않 습 니 다.2: except = 1. 위 와 정반 대로 잔소리 하지 않 겠 습 니 다.동 리 lineno 의 역할 은 유사 하 다.
책 에서 마지막 으로 C 언어의 복잡 한 유형 성명 체제 에 대해 이야기 했다. (이 문제 가 발생 한 주요 원인 은 C 의 성명 이 왼쪽 에서 오른쪽으로 읽 은 것 이 아니 기 때문이다) 즉, 면접 에서 강 상 고 는 가리 키 는 함수 의 지침, 반환 값 이 지침 인 함수, 가리 키 는 배열 의 지침, 모든 요 소 는 지침 의 배열 이 고 책 에서 예시 절 차 를 통과 했다.이 프로그램 은 이 문 제 를 설명 하기 위해 간단 한 상황 을 분별 할 수 있다.이 프로그램 은 보기 에는 길지 않 은 것 같 지만, 여전히 매우 어렵다.
나 는 여기 서 이 문제 들 에 대한 처리 방법 에 대해 이야기 하 는 김 에 사실은 3 시 이다.
(1) 변수 이름 을 먼저 보고 중간 에서 양쪽 을 보면 배열 을 구성 할 수 있 는 [] 또는 함수 매개 변수 가 있 는 지 주의 하 십시오.
(2) 기억 () 과 [] 의 우선 순위 가 * 보다 높다.
(3) 빈 () 또는 () 안에 유형 이 있다 는 것 은 이 안에 반드시 함수 포인터 가 있 고 앞으로 함수 의 반환 값 을 찾 는 것 을 의미한다.
나 는 몇 가지 예 를 들 었 다. (이 예 들 은 프로그래머 면접 보전 에서 나 왔 다): (1) float (* def) [10];(2)double*(*gh)[10]; (3)duble(*f[10])(); (4)int*((*b)[10]); (5)long(*fun)(int); (6) int (* F) (int, int) (int) 책 에서 그들 에 대해 상세 한 설명 을 하지 않 았 습 니 다. 제 분석 방법 을 자세히 말씀 드 리 겠 습 니 다.첫 번 째 예 는 변수 이름 이 def 이 고 def 를 수식 하 는 * * 이 며 def 는 2 급 지침 임 을 설명 합 니 다.이 지침 은 무엇 을 가리 키 고 있 습 니까?오른쪽 을 보 세 요. [10] 입 니 다. 왼쪽 은 float 이기 때문에 하나의 배열 을 가리 키 고 배열 에는 10 개의 요소 가 있 으 며 모든 요 소 는 float 유형 입 니 다.두 번 째 예 는 변수 이름 하 이 를 먼저 보고 하 이 를 수식 하 는 것 은 * 이 며 하 이 는 지침 임 을 나타 낸다.무엇 을 가리 키 는가?10 개의 요소 의 배열, 배열 의 유형 은 double * 입 니 다.세 번 째 예, 주의: 괄호 우선 순위 가 * 보다 높 기 때문에 f 는 10 개의 요소 의 배열 입 니 다.배열 의 모든 요 소 는 하나의 지침 입 니 다. 어떤 지침 입 니까?() 를 보 았 습 니 다. 앞으로 되 돌아 오 는 값 을 찾 습 니 다. double 형식 이기 때문에 형 삼 이 없고 되 돌아 오 는 값 이 double 형식 함수 인 지침 의 네 번 째 예 입 니 다. * b 는 b 가 지침 임 을 설명 합 니 다. [10] 설명 은 배열 을 가리 키 는 지침 입 니 다. int * 설명 배열 의 모든 요 소 는 int * 유형 (int 를 가리 키 는 지침) 입 니 다.다섯 번 째 예, * F 는 F 가 지침 이라는 것 을 설명 합 니 다.무엇 을 가리 키 는 지 오른쪽 에서 (int, int) 를 보 았 습 니 다. 이것 은 함 수 를 가리 키 는 지침 입 니 다. 그러면 함수 의 반환 값 은 무엇 입 니까?(* F) 왼쪽 은 * 이 고 함수 반환 값 도 지침 입 니 다.이 지침 은 또 어떤 유형 입 니까?아니면 오른쪽 에 (int) 가 있 는 지, 함 수 를 가리 키 는 지침 인지 설명 합 니 다.앞의 int 는 이 함수 의 반환 값 이 int 형식 임 을 설명 합 니 다.여기까지 말 하면 '프로그래머 면접 보전' 도 특색 있 는 책 이라는 것 을 느 낄 수 있다. 프로 그래 밍 을 어떻게 하 는 지, 이렇게 프로 그래 밍 을 정확하게 하 는 지, 아니면 그렇게 프로 그래 밍 을 잘못 하기 쉬 운 책 이 아니 라 C 와 C + + 의 세부 적 인 문 제 를 많이 파 서 시험 해 봤 다.자신의 기본기 에 대한 정보 가 있다 면 해 보 세 요.

좋은 웹페이지 즐겨찾기