[C프로그래밍] 240508_10주차_포인터

김나정·2024년 5월 8일
0

C

목록 보기
4/8

예제 #7 – 참조에 의한 호출

  • 포인터를 사용하는 중요한 이유
#include <stdio.h>
void modify(int* ptr)
{
	printf("[modify]ptr의 값:%u\n", &ptr);
	printf("[modify]ptr이 가리키는 값:%d\n", *ptr);
	*ptr = 99; // 매개 변수를 통하여 원본을 변경한다. 

	//printf("[modify]개조 후 ptr의 값:%u\n", &ptr);
	printf("[modify]개조 후 ptr이 가리키는 값:%d\n", *ptr);
}
int main(void)
{
	int number = 1;

	printf("number의 주소:%u\n", &number);
	printf("호출 후 number = %d\n", number);
	modify(&number); // 주소를 계산해서 보낸다. 
	printf("호출 전 number = %d\n", number);
	return 0;
}

/*number의 주소:900725188
호출 후 number = 1
[modify]ptr의 값:900725152
[modify]ptr이 가리키는 값:1
[modify]개조 후 ptr이 가리키는 값:99
호출 전 number = 99*/

Lab 1: swap() 함수

#include <stdio.h>

void swap(int* px,int* py)
{
	int tmp;

	tmp = *px;
	*px = *py;
	*py = tmp;
}

int main(void)
{
	int a = 100, b = 200;
	printf("swap() 호출 전 a=%d, b=%d\n", a, b);

	swap(&a, &b);//중요!! swap함수의 매개변수는 포인터변수이므로 a와b의 주소를 넘겨야함 &연산자 붙이는거 꼭 기억하기!!

	printf("swap() 호출 후 a=%d, b=%d\n", a, b);
	return 0;

}

예제 #8 – 두 개 이상의 결과를 반환하는 함수

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

/*
함수를 사용할 때 함수의 결과값을 한 개보다 많이 반환하는 방법?
->포인터를 사용하여 인수를 넘겨주면 결과값을 두개 이상 반환하는 효과를 얻을 수 있음
->기울기와 y절편을 계산하는 함수를 각각 작성하지않고 한번에 작성할 수 있는 이유 = 포인터, 참조에 의한 호출!
->즉 인수를 참조에 의한 호출로 전달받아 계산
*/

//기울기와 y절편계산
int get_line_parameter(int x1,int y1, int x2, int y2, float *p_incline, float *p_y_intercept)
{
	//기울기는 dy/dx이므로 dx=0인 경우는 무한대발산이므로 제외
	if (x1 == x2) {
		return -1;//계산 ERROR = 함수가 비정상적으로 종료되었다는 의미의 return -1;
	}
	else {
		*p_incline = (float)(y2 - y1) / (float)(x2 - x1); // 좌표가 정수형이므로 그대로 변화량을 나누면 몫이나오므로 float형변환
		*p_y_intercept = y1 - (*p_incline) * x1; // f(x)-> y = (*p_incline)x + (*p_y_intercept) 식에 (x1,y1)대입해서 이항
		return 0;//계산을 완료함 = 함수가 정상적으로 종료되었다는 의미의 return 0;
	}
	
}

int main(void)
{
	float incline, y_intercept; //기울기와 y절편
	int x1, y1, x2, y2; // 입력받을 좌표

	scanf("%d%d%d%d", &x1, &y1, &x2, &y2);

	if (get_line_parameter(x1, y1, x2, y2, &incline, &y_intercept) == -1) {
		printf("에러\n");
	}
	else {
		printf("기울기는 %f, y절편은 %f\n", incline, y_intercept);
	}
	return 0;

}

/*ouput
2 3 4 4
기울기는 0.500000, y절편은 2.000000
*/

Lab 2: 배열을 인수로 받는 함수 작성

#include <stdio.h>
#define SIZE 5

double get_array_avg(int values[], int size);
void print_array(int values[], int size);

int main(void) {

	int i;
	int a[SIZE] = { 10,20,30,40,50 };
	double result;

	print_array(a, SIZE);
	result = get_array_avg(a, SIZE);
	printf("배열 원소들의 평균 = %f\n", result);
	return 0;
}

double get_array_avg(int values[], int size) {

	double sum = 0;
	for (int i = 0; i < size; i++) {
		sum += values[i];
	}
	return sum / size;
}

void print_array(int values[], int size) {
	printf("[ ");
	for (int i = 0; i < size; i++) {
		printf("%d ", values[i]);
	}
	printf("]\n");
}

Lab 3: 배열의 값 역순 출력

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
	int array[5];
	int* p = array;

	printf("5개의 정수를 입력하시오 : ");
	for (int i = 0; i < 5; i++) {
		scanf("%d", (array + i)); //&array[i], &p[i], (p+i)
	}

	printf("역순 : ");
	for (int i = 0; i < 5; i++) {
		printf("%d ", p[4 - i]);
	}
	printf("\n");
}
profile
molbwa

0개의 댓글