130813.7일차

|

헤더

#include <stdio.h>

#define NUM 3


void fibo( int a );

int input( );

void output( int n );

//void disp( int a , double b , char c); // 에러안남 

  void disp( int   , double   , char  ); // (선언부는 변수명 생락가능)

//void disp( int * ap , double * bp , char * cp); // 에러안남

  void disp( int *    , double *    , char *   ); 


  

//void swap( int a , int b );

void swap( int * ap , int * bp );

void disp( int & aa , double & bb );

void swap( int & , int & );

int sum( int * );

double avg( int  [] );



//숙제

void disp( char * []);

메인


#include "130813.h"



/*


// 피보나치 수열

void main() {

int a;

printf("정수 : ");

scanf("%d", &a);

fibo(a); // 입력받은 값까지의 피보나치 수열 출력





// 숙제 1

// 정수 한 개를 입력 받아서 구구단을 출력한다

// 2~9 사이 값이면 구구단 출력

// 아니면 다시 입력 받는다/

// input() 함수에서 입력받고

// output() 함수에서 출력한다.

 

output(input(1));

}


*/







/*


포인터


자료형에 상관없이 크기는 4Byte

선언시 자료형은 참조하는 곳의 데이터 자료형

주소를 얻을때는 &(변수) // ap=&a (a방의 주소를 ap에 넣어라)

데이터를 얻을 때는 *(포인터변수) // *ap a의 데이터를 가져와라


이중포인터

삼중포인터


포인터는 방의 시작주소


포인터의 주소를 모두 알 수 없기 때문에

포인터를 저장 하는 포인터 변수를 만들어 주어야 한다.

a라는 자료에는 int a로 들어가지만 포인터에는 int* ap;로 선언하자


int* double* char* 전부 4Byte이다. 

(주소는 전부 32비트. 자료형이랑 주소랑 관계 없음)

궂이 자료형을 붙여주는 이유는 주소지에 있는 자료의 자료형을 지시해줌

포인트 방의 용도는 다른방을 가르키는 용도이다. 



주소를 16진수로 표시하면 8자리가 나옴 32bit/4bit=8자리


*/




/*

void main()

{

int a = 5;

int * ap = &a; // a의 주소를 ap에 포인터로 입력


printf("a의 값 : %d\n",a); // a의 자료 출력

printf("a의 값 : %d\n",*ap); // ap의 주소에 있는 자료 출력

printf("a의 주소 : %p\n",&a); // a의 주소를 16진수로 출력

printf("a의 주소 : %p\n",ap); // ap의 자료(a방의 주소)를 16진수로 출력

//double * bp = &a; // a는 int 인데 double이라는 방의 주소를 쓸 수 없다






// 이중 포인터

// a=5(의 주소는 100, ap), ap의 주소를 자장한 bp(200)

// int ** bp;

// bp = &ap;



int ** bp = &ap; 

//int ** bp = &&a; // 이딴거 안됨

printf("a의 값 : %d\n",**bp);

printf("a의 주소 : %p\n",*bp);


}


*/





// 함수와 포인터



/*

void main()

{

int a=10;

double b=43.77;

char c='A';



int * ap = &a;

double * bp = &b;

char * cp = &c;


disp(a,b,c); // Call by Value

disp(&a, &b, &c); // Call by Address (추가로 Call by Reference도 있음)


// 함수 정보를 쓸땐 call by address 써야 에러가 안남

}


*/




// 주소로 함수를 부르지 않았을 경우 오류

/*

void main()

{

int a=5,b=2;

printf("메인 교환 전 a : %d\t b : %d\n", a, b);

//swap(a,b); // call by value 메인 출력 : (5,2)

//swap(&a,&b); // call by address 메인 출력 : (2,5)

swap(a,b); // call by reference

printf("메인 교환 후 a : %d\t b : %d\n", a, b);


// 함수교환은 function의 지역변수에서'만' 바꾸고 교환하고 출력함 

// 항상 주소로 불러줘야함

}


*/


// Call by Reference

/*

void main()

{

int a=10;

double b=25.7;


// int & b=a; // 방에 이름하나 더 붙여라


int & aa=a; // 기존에 a라는 방의 이름을 참조하라

aa=20; // aa의 값을 바꿔줘도 a의 값이 바뀐다.

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

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


disp(a,b); // call by reference(&)

  // main은 a라 부르고 reference는 aa라고 부른다.

}

*/





// 1차원 배열과 포인터


/*

#define SIZE 3


void main()

{

int m[SIZE] = { 10, 20, 30 };


// 4가지 방법으로 출력

// 엄밀히 말하면 배열은 포인터

// 1차원 배열은 포인터 2차원 배열은 2중 포인터


// ★★★★★


/////////////////////////////////////////////////////////////////////////////////////

///// /////

///// 데이터: 10 20 30 /////

///// 값 : m[0] m[1] m[2] /////

///// 주소 : &m[0] &m[1] &m[2] /////

///// 100 104 108 // 4Byte 씩 차이나야함 /////

///// (mp=&m) mp mp+1 mp+2 /////

///// 값 : *mp *(mp+1) *(mp+2) /////

///// 주소 : m m+1 m+2 // 이거도 된다 /////

///// 값 : *m *(m+1) *(m+2) // 이거도 된다 /////

///// mp[0] mp[1] mp[2] // 포인터 변수로 데이터 사용 /////

///// 주소 : &mp[0] &mp[1] &mp[2] // /////

///// /////

/////////////////////////////////////////////////////////////////////////////////////


//  m++ 쓰지말자 ( 배열을 통채로 들어내서 한칸 옮기라는말, 집을 통채로 옆으로 이동)

//  mp++ 사용 가능


int i;

for (i=0; i<SIZE ; i++) {

printf("m[%d] 값 : %d\n", i, m[i]);

printf("m[%d] 주소 : %p\n", i, &m[i]);

}

printf("\n");


int * mp = &m[0];

for (i=0; i<SIZE ; i++) {

printf("m[%d] 값 : %d\n", i, *(mp+i) );

printf("m[%d] 주소 : %p\n", i, mp+i);

}

printf("\n");


//printf("%p\n",m); // 첫번째 배열 시작값이랑 같다 

 // 배열의 이름은 맨앞의 시작주소를 갖는다.



for (i=0; i<SIZE ; i++) {

printf("m[%d] 값 : %d\n", i, *(m+i) );

printf("m[%d] 주소 : %p\n", i, m+i);

}

printf("\n");


for (i=0; i<SIZE ; i++) {

printf("m[%d] 값 : %d\n", i, mp[i] );

printf("m[%d] 주소 : %p\n", i, &mp[i]);

}




printf("\n");


for (i=0; i<SIZE ; i++) {

printf("m[%d] 주소 : %p\n", i, mp++);

}


printf("\n");


for (i=0; i<SIZE ; i++) {

printf("m[%d] 값 : %d\n", i, *mp++); // 안됨

}

}


*/




// 예제

/*

void main()

{

int m[]={ 45, 56, 34, 47, 64};

printf("합계 : %d\n", sum(m) );

printf("합계 : %.2lf\n", avg(m) );

}




// header는 ( int * ) = ( int [] ) 로 쓰자


*/







// 이중 포인터


/*

#define SIZE 3


void main()

{

char * ap[SIZE] = { "apple", "banana", "pear" };

// 100  300 500

//  ap[*] : {100,300,500}

//

// a p p l e \0

//  b a n a n a \0

//  p e a r \0

//

//  바나나 만큼 방(7개)을 잡아줘야 한다

//  charater 포인터 배열로 만들자(포인터가 들어갈 방이 3개)

// 문자는 어딘가에 저장되어있고 그 시작 주소만 저장함


int i;


for ( i=0 ; i<SIZE ; i++ ) {

printf("%s\n",*(ap+i) ); // = ap[i]

}

printf("%c\n", *(ap+1)+2 ); // banana의 n 출력


// 3번째에만 있는 p,n,a 찍기

for ( i=0 ; i<SIZE ; i++ ) {

printf("%c\n", *(*(ap+i)+2) );

printf("%c\n", ap[i][2] );

}


}


*/



// 숙제 1

// 문자열 세개를 함수로 출력한다

// 단 %c 만 사용해서 출력한다.

// 포인터 배열 둘 다 표현


void main()

{

char * ap[NUM] = { "apple", "banana", "pear" };


disp(ap);

}





// 숙제 2

// 문자열을 한번 출력하고 그 개수도 출력한다.

// 포인터 배열 둘 다 표현

//void main()

//{

// printf("개수 : %d\n", disp("Hello World!") );

//}


함수


#include "130813.h"

#define NUM 3


// 피보나치 수열

void fibo( int a) {

int n1=1, n2=1;

int n3;

printf("피보나치 수열 값 : ");

if (a==1) printf("%d",n1);

  else if (a==2) printf("%d %d",n1,n2);

else {

printf("%d %d ",n1,n2);

for ( int i=0 ; i<a-2 ; i++) {

n3=n1+n2;

n1=n2;

n2=n3;



printf("%d ",n3);

} // for

} // else

printf("\n\n");

} // void





int input( ) {

int n;

printf("단 입력 : ");

scanf("%d",&n);

while (1){

if ( n<= 9 && n >= 2) return n;

else { 

printf("다시 입력 : ");

scanf("%d",&n);

}

}

}



void output( int n ) {

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

for ( int i=1 ; i<=9 ; i++) printf("%d * %d = %d\n",n,i,n*i);

printf("\n");

}



void disp( int a , double b , char c) {  // 함수를 값으로 취한다 (call by value)

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

printf("%.2lf\n",b);

printf("%c\n",c);

printf("\n");

}


void disp( int * ap , double * bp , char * cp) { // call by address

printf("%d\n",*ap);

printf("%.2lf\n",*bp);

printf("%c\n",*cp);

printf("\n");

}


void swap( int a , int b ) {

int c;

printf("call by value\n");

printf("함수 교환 전 a : %d\t b : %d\n", a, b);

c=a;

a=b;

b=c;

printf("함수 교환 후 a : %d\t b : %d\n", a, b);

}


void swap( int * ap , int * bp ) {

int c;

printf("call by address\n");

printf("함수 교환 전 a : %d\t b : %d\n", *ap, *bp);

c=*ap;

*ap=*bp;

*bp=c;

printf("함수 교환 후 a : %d\t b : %d\n", *ap, *bp);

}



void swap( int & aa , int & bb ) {

int c;

printf("call by reference\n");

printf("함수 교환 전 a : %d\t b : %d\n", aa, bb);

c=aa;

aa=bb;

bb=c;

printf("함수 교환 후 a : %d\t b : %d\n", aa, bb);

}



void disp( int & aa , double & bb ) {

printf("aa : %d\n",aa);

printf("bb : %.2lf\n",bb);

}





int sum( int  * m ) { // 포인터 던짐  ( int  m[SIZE] ) 와 같다 

 // 들어오는 순간 포인터됨

 // 헤더 다르게 써도 같에 인식

     // 선언부에서 ( int [] ) 가능

 // 선언부에서 ( int * ) 가능

int s=0;

for ( int i=0 ; i < 5 ; i++ ) {

s+= *m++;


}

return s; 

}


double avg( int  * m ) { 


int py=0;

for ( int i=0 ; i < 5 ; i++ ) {

py+= *m++;


}

return double(py)/5; 

}




void disp( char * m ) { 


for ( int i=0 ; i<NUM ; i++ ) {

printf("%s\n",*(m+i) ); 

}

/*for ( int i=0 ; i<NUM ; i++ ) {

int k=0;

while (1) {

if ( *(*(m+i)+k) == NULL) break;

printf("%c\n", *(*(m+i)+k) );

k++;

printf("\n");

}*/



}



저작자 표시 비영리 변경 금지
신고

'Study > C, C++' 카테고리의 다른 글

130816.9일차  (0) 2013.08.19
130814.8일차  (0) 2013.08.19
130813.7일차  (0) 2013.08.19
130812.6일차  (0) 2013.08.19
130809.5일차  (0) 2013.08.19
130808.4일차  (0) 2013.08.08
Trackback 0 And Comment 0

티스토리 툴바