본문 바로가기
흔한 학교 생활/든든한 C 프로그래밍

[C언어] 든든한 C 프로그래밍 3판 10장 연습문제 답 풀이

by 흔한 학생 2023. 7. 7.
반응형

yundu.co.kr

 

답안 코드에 필요없는 #pragma warning(disable:4996) 코드가 들어있을 수 있으니

이 점 유의하여주시기 바랍니다.

[10-1]

1) 실행중인 프로세스의 메모리 주소를 포인터라 한다.

 

2) 변수의 시작주소를 사용하기 위해 주소 연산자 &를 사용한다.

 

3) 첨자가 없는 배열변수명은 그 배열이할당된 메모리의 시작주소를 의미한다.

 

4) 메모리 주소를 저장하여 데이터로 사용하는 변수를 포인터 변수라 한다.

 

5) 포인터 변수에 저장된 주소의 데이터에 참조하기 위해 간접 연산자를 사용한다.

 

6) 모든 포인터의 메모리할당은 선언되는 자료형과 관계없이 32비트 운영체제에서는 4 바이트를 할당 받는다.

 

7) 변수의 주소를 16진수로 출력하기 위한 printf() 함수의 형식 지정자는 %p 이다.

 

8) 문자열 상수는 C 컴파일러에 의해 메모리의 빈 공간에 저장된 후 시작번지를 반환한다.
이를 문자열 상수 포인터 라 한다.

 

9) 함수에 인자를 전달할 때 값에 의한 전달은 실인수의 이 전달된다.

 

10) 함수에 인자를 전달할 때 주소(참조)에 의한 전달될 실인수의 주소가 전달된다.

 

 

 

 

[10-2]

char a;
char* b; /* 2번 다음 포인터 b에 주소가 할당이 되지 않은채로 3번이 나타났다 
때문에 2번과 3번 사이에 b=&a; 가 추가되어야 한다*/
*b = 'A';  
printf("%c \n", a);

 

 

 

 

[10-3]

array[0]의 값을 의미한다. array 즉 array[0]의 값을 의미한다.
array[2]의 값을 의미한다. array+2 즉 array[2]의 값을 의미한다.
array[1]의 주소를 의미한다. array+1 즉 array[1]의 주소를 의미한다.
array[2]의 주소를 의미한다. array+2 즉 array[2]의 값을 의미한다.

정답 4

 

[10-4]

 
array[2]의 값을 의미한다.
array[1]의 주소를 의미한다.
array[2]의 주소를 의미한다.
int* p;
*p = 200;
// 주소가 저장되지 않은 포인터로 값을 대입할 수 없다.

short int* p;
double q;
p = &q;
*p = 3.5;
//int로 지정된 포인터로 double값을 넣을 수 없다.

int* p, q = 100;
p = &q;
p = p + 1.5;
//int형 포인터로 실수를 저장할 수 없다

char* p;
printf("input string ?");
gets(p);
//p에 저장 불가

 

[10-5]

#include <stdio.h>
#include <string.h>
#pragma warning(disable:4996)

int main()
{
	char str[50];
	char* ptr;
	ptr = str;
	int i, count = 0;

	printf("Input String ? ");
	gets(str);

	for (i = 0; i < 50; i++)
	{
		if (str[i] != 0)
			count++;
		else
			break;
	}

	for(i=count;i>0;i--)
		printf("%c ", *(ptr + i - 1));
	printf("\n\n문자열의 크기 : %d", count);

	return 0;
}

gets(str); 혹은 gets(ptr); 인 이유.. gets(*ptr); 해서 틀림, 주의하기..

 

결과

Input String ? C language.
. e g a u g n a l   C

문자열의 크기 : 11

[10-6]

#include <stdio.h>
#include <string.h>

int main()
{
	int score[21] = { 57,87,64,86,97,78,61,81,73,37,54 }, i, sum = 0, cn = 0;
	int* ptr;
	ptr = score;
	printf("학생들의 점수\n");
	for (i = 0; i < 21; i++)
	{
		if (*(ptr + i) == 0)
			break;
		printf("%d, ", *(ptr + i));
		cn++;	
	}
	printf("\n\n인원수 : %d\n", cn);
	
	for (i = 0; i < cn; i++)
		sum += *(ptr + i);

	printf("합 : %d, 평균: %.2lf\n", sum, (double)sum / cn);
}

결과

학생들의 점수
57, 87, 64, 86, 97, 78, 61, 81, 73, 37, 54,

인원수 : 11
합 : 775, 평균: 70.45

[10-7]

문자열 상수 포인터 출력할 때는 *ptr 이 아닌 ptr로 사용한다.

#include <stdio.h>
#include <string.h>

int main()
{
	char str[50]=" Multi Campus.";
	char* ptr;
	ptr = str;
	int i;

	printf("before :%s\n", ptr);

	for (i = 0; i < 50; i++)
	{
		if (*(ptr + i) >= 65 && *(ptr + i) < 97) //대문자를 소문자로
			*(ptr + i) += 32;
		else if (*(ptr + i) <129 && *(ptr + i) >= 97) //소문자를 대문자로
			*(ptr + i) -= 32;
	}
	printf("\nafter :%s\n", ptr);

	return 0;
}

대문자를 변환하는 if문 입력 후 else만 사용할까 싶었지만
소문자가 아닌 띄어쓰기나 점이 오류를 발생할까 싶어 else if 쓰고 조건 추

 

결과

before : Multi Campus.

after : mULTI cAMPUS.

[10-8]

실행결과를 적어라

#include <stdio.h>
#include <string.h>
void recurse(char* ptr);
int main()
{
	char str[20]="kingdom";
	recurse(str);
	printf("\n");
	return 0;
}

void recurse(char* ptr)
{
	if (*ptr)
	{
		printf("%c", *ptr);
		recurse(ptr + 1);
	}
}

결과

kingdom

[10-9]

#include <stdio.h>
#include <string.h>
#pragma warning(disable:4996)
void my_Strcat(char*, char*);
int main() 
{
	char strDestination[20] = "king";
	char strSource[20] = "dom";
	
	printf("Source: %s, Destination : %s\n",strSource, strDestination);

	my_Strcat(strDestination, strSource);

	printf("Source: %s, Destination : %s\n", strSource, strDestination); //함수 호출 후
	return 0;
}
void my_Strcat(char*D, char*S)
{
	strcat(D, S);
}

결과

Source: dom, Destination : king
Source: dom, Destination : kingdom

 

 

[10-10]

#include <stdio.h>
#include <string.h>
#pragma warning(disable:4996)

void func(int*, int);
int main()
{
	int data[10] = { 56, 75, 450, 7, 340, 44, 120,5,20,30 }, count;
	count = 10;
	func(data, count);
	return 0;
}
void func(int *d, int c)
{
	int sum=0,i;
	for (i = 0; i < 10; i++)
		sum += *(d + i);
	printf("배열의 합 : %d, 평균 : %d", sum, sum / c);
}

결과

배열의 합 : 1147, 평균 : 114

 

반응형