개발자의 고군분투기

C언어 4일차_정리 본문

C언어

C언어 4일차_정리

뉴뉴베리포리 2016. 11. 4. 09:26
포인터
- 주소를 저장하는 변수
- 메모리에 직접 접근을 허용하는 저수준 프로그래밍 기능
- win32 콘솔 어플리케이션에서는 모든 포인터변수는 4byte(32bit) 크기
	ex) char포인터, int포인터, double포인터 : 모두 4byte
- 배열과 밀접한 관련이 있다

포인터 선언
- 변수형 * 변수명
	ex) char * pc, int * pi, double * pd
- * 는 변수형 또는 변수명 어느 쪽에 붙여도 상관없음
- *는 포인터 변수마다 입력하여야 함

*의 기능
- 연산자 : 곱셈
- 변수 선언시 : 포인터 변수임을 의미
- 변수 사용시 : 포인터 변수가 가리키고 있는 변수 자체

&의 기능
- 변수 앞에 사용시 변수의 주소를 의미

printf(), scanf()의 %s : 주소를 받음
ex) 
int num;
scanf("%d", &num);
printf("%d", num);

char str[10];
scanf("%s", str);
printf("%s", str);

============================================

포인터와 배열의 연관관계

#include<stdio.h>

int main(void)
{
	int *pa;
	int arr[10]={1,2,3,4,5,6,7,8,9,10};
	int i;

	for(i=0;i<10;i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n");

	pa = &(arr[0]);
	// pa = arr;

	for(i=0;i<10;i++)
	{
		printf("%d ",*(pa+i));
	}
}

========================================

배열과 포인터의 차이점

#include<stdio.h>

int main(void)
{
	int *pa;
	int arr[10]={1,2,3,4,5,6,7,8,9,10};
	int arr2[10]={3,4,5,6,7,8,9,10,1,2};
	int i;

	pa = arr;

	printf("세번째 배열 : %d %d %d %d\n", arr[2], *(arr+2), *(pa+2), pa[2]);

	pa = arr2;

	for(i=0;i<10;i++)
		printf("%d ", pa[i]);

	arr = arr2;
	
}

===========================================

const : 상수화

const [변수형] * [변수명] : 가리키고있는 변수의 값을 변경할 수 없는 포인터 변수

[변수형] * const [변수명] : 값을 변경할 수 있는 변수를 가리키지만, 다른 변수를 가리킬 수 없는 포인터 변수

const [변수형] * const [변수명] : 값을 변경할 수 없는 변수를 가리키고, 포인터를 변경할 수 없는 포인터 변수

================================================

구조체
- 서로 다른 데이터형을 묶어서 사용가능하다
- '멤버' 접근 방식을 사용하여 사용이 간편하다

구조체 멤버
- 각종 데이터타입의 변수
- 포인터 변수
- 구조체 자체를 가리키는 포인터

구조체 정의 방법
struct [구조체이름] {
	[변수형] [변수명];
	...
};

ex)
struct student {
	char name[10];
	int kor;
	int eng;
	int mat;
	double avg;
};		// 구조체 정의

구조체 사용 선언
struct [구조체명] [구조체변수명]
ex) struct student s1;


==============================================

구조체 테스트

#include<stdio.h>

int main(void)
{
	struct student {
		char name[10];
		int kor, eng, mat;
		double avg;
	};

	struct student s1 = {"홍길동"};

	s1.kor = 80;
	s1.eng = 50;
	s1.mat = 30;
	s1.avg = (s1.kor + s1.eng + s1.mat) / 3.0;

	// scanf("%s",s1.name);
	printf("%s\n",s1.name);
	printf("%d\n",s1.kor);
	printf("%d\n",s1.eng);
	printf("%d\n",s1.mat);
	printf("%f\n",s1.avg);
}


=========================================

구조체의 활용

대입
- 동일한 타입의 구조체는 대입연산자를 사용하여 데이터 복사 가능

#include<stdio.h>

int main(void)
{
	struct point {
		int x;
		int y;
	};

	struct point p1;
	struct point p2;

	p1.x = 100;
	p1.y = 50;

	p2 = p1;

	printf("%d , %d\n", p2.x, p2.y);

}

===============================================

구조체의 배열
- 구조체를 배열 형태로 선언
- 반복문 등을 통한 편리한 접근 가능

struct point {
	int x, y;
};

struct point p[3];

구조체 배열과 일반 배열의 차이점
- 일반 배열의 이름은 배열의 시작주소
	/ 구조체의 이름은 구조체의 시작주소가 아님

구조체 포인터
- 포인터를 사용해서 구조체에 접근이 가능
struct  point * pp = p[0];


============================================

구조체 배열 사용예

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

int main(void)
{
	int i;
	struct student{
		char name[10];
		int kor,eng, mat;
		double avg;
	};

	struct student s[3]={{"홍길동",100,100,100,100},{"정우성",50,50,50,50},{"강동원",70,70,70,70}};

	for(i=0;i<3;i++)
	{
		printf("%s, %d, %d, %d, %f\n", s[i].name, s[i].kor, s[i].eng, s[i].mat, s[i].avg);
	}

}


==============================================

구조체 포인터 사용 예

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

int main(void)
{
	int i;
	struct student{
		char name[10];
		int kor,eng, mat;
		double avg;
	};

	struct student s1 = {"홍길동",100,100,100,100};
	struct student * ps1;

	ps1 = &s1;

	printf("s1을 사용하여 이름 출력 : %s\n", s1.name);
	printf("ps1을 사용하여 이름 출력 : %s\n", (*ps1).name);
	printf("ps1을 사용하여 이름 출력 : %s\n", ps1->name);
}



===============================================

공용체 사용 예
ex) 회원정보 저장 데이터 변수 생성

struct sosok {
	char school[30];
	char job[30];
};

union sosok {
	char school[30];
	char job[30];
};


===========================================

열거체
- 정수형의 일종

ex) 요일 검사
int weekday;
	// 0이면 일요일, 1이면 월요일....

enum week {sun, mon, tue, wed, thu, fri, sat};

enum week weekday;

====================================

열거체 사용예

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

int main(void)
{
	enum week {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
	enum week weekday;

	weekday = Wed;

	printf("%d\n", weekday);

	switch(weekday){
	case 0 :
	case Mon :
	case Tue :
	};
}


=============================================

typedef
- 새로운 자료형 명명 (별명)
- 주로 구조체 정의시 사용
- 가독성 증가 및 편의성을 위해 사용

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

int main(void)
{
	typedef unsigned char UCHAR;
	struct student {
		char name[10];
		int no;
	};
	typedef struct student STUDENT;

	struct student s1;
	STUDENT s2;
	UCHAR ch;
	
}

==========================================

함수 호출방식
- Call by Value (Passing by Value) : 값을 전달
- Call by Reference (Passing by Pointer) : 포인터를 전달


함수 호출시 필요한 것
- [리턴 타입] 함수명([전달인자]...)


ex) 함수를 사용한 swap 

#include<stdio.h>

void swap(int *, int *);

int main(void)
{
		int a=10,b=20;

		swap(&a,&b);

		printf("a: %d, b: %d\n", a,b);
}

void swap(int *x, int *y)
{
	int temp;
	temp = *x;
	*x = *y;
	*y = temp;
}

// Call By Reference 를 사용하여 main() 함수 내의 변수를 직접 접근
// 기본 변수형인 int 이므로 사용이 간편

==============================================

배열(문자열)의 함수 인자 전달
- 배열의 전달은 언제나 포인터로 전달
- 배열의 이름은 배열의 시작주소
- 문자열의 이름은 문자열의 시작주소


문자열의 Call by Reference 함수 호출 예

#include<stdio.h>

void print_str(char *);

int main(void)
{
	char str[20] = "Merong";
	print_str(str);
}

void print_str(char *recv_str)
{
	recv_str[0]='Q';
	printf("%s", recv_str);
}

==========================================

구조체의 함수 호출

#include<stdio.h>

typedef struct {
	char name[10];
	int kor,eng,mat;
	double avg;
} STUDENT;

void input_std(STUDENT *);

int main(void)
{
	STUDENT s1;

	input_std(&s1);

	printf("%s, %d, %d, %d, %f\n", s1.name, s1.kor, s1.eng, s1.mat, s1.avg);
}

void input_std(STUDENT *pstd)
{
	printf("이름을 입력하시오 : ");
	scanf("%s", pstd->name);
	
	printf("국어 영어 수학 성적을 입력하시오 : ");
	scanf("%d %d %d", &(pstd->kor), &(pstd->eng), &(pstd->mat));
	
	pstd->avg = (pstd->kor + pstd->eng + pstd->mat) / 3.0;
}


'C언어' 카테고리의 다른 글

C언어 4일차_실습  (0) 2016.11.04
C언어 3일차_실습  (0) 2016.11.03
C언어 3일차_정리  (0) 2016.11.03
C언어 2일차_실습  (0) 2016.11.03
C언어 2일차_정리  (0) 2016.11.03
Comments