본문 바로가기

C언어

11월 17일 C언어 형식인수로써의 배열,다차원 배열,함수포인터배열,문자열

함수 인수 로써의 배열

C언어 에서 함수의 인수는 값이나 주소를 전달한다. C언어에서는 배열 자체가 인수로 전달될 수 없다. 이것은 배열의 메모리 내용 자체가 피호출자에게 복사되어 넘어가지 않는다는 의미이다. 배열이 인수로 넘겨질 경우 배열의 이름을 실인수로 하고, 포인터변수를 피호출자의 형식인수로 사용하여 배열의 주소값을 받는다.




형식 인수로 다차원 배열이 사용되는 경우

다차원 배열이 형식인수로 사용되는 경우에는 첫 번쨰 색인을 생략할 수 있다. 
그러나 두 번째 색인부터는 모두 명시해 주어야 한다.

#include <stdio.h>


  int sum_matrix(int m[][3]);

  int main()
  {
    int sum;
    int mat[3][3]={{13,23,15},{11,8,25},{17,14,21}};

    sum=sum_matrix(mat);
    printf("Answer : %d\n",sum);
    return 0;
    
  }

  int sum_matrix(int mat[][3])//여기의 mat은 함수가 호출될때 크기가 정해지고
                //아래의 mat1 은 배열로써 사용된다.
  {
    int i;
    
    int mat1[][3]={{13,23,15},{11,8,25},{17,14,21}};
    
    
    
    int (*mat2)[3]; //배열 포인터로 선언했다.
    mat2=mat;
    
    
    printf("size of mat2:%d\n",sizeof(mat2)); //mat2의 사이즈는 4
    printf("size of mat:%d\n",sizeof(mat)); //mat의 사이즈는 4
    printf("size of mat1:%d\n",sizeof(mat1)); //mat1은 배열으므로 36
    i=mat[0][0]+mat[1][1]+mat[2][2]; //42
    return i;
  }

다차원 배열

#include <stdio.h>

int main()
{
  int i;
  int j;
  int array[3][4]={{15,23,45,56},
          {34,52,76,23},
          {43,62,91,84}};

  for(i=0;i<3;++i)
  {
    for(j=0;j<4;++j)
    {
      printf("%d ",array[i][j]);
    }
    printf("\n");
  }
  
  printf("%08X\n",array);
  
  printf("%08X\n",&array[0][0]+1);//&과 [] 세트로 상쇄가능하다.아래쪽의 표현방법이된다.
  printf("%08X\n",array[0]+1);
  
  printf("%08X\n",&array[0]+1);//&,[]상쇄가능.아래쪽과 같다
  printf("%08X\n",array+1);//행+1
  
  printf("%08X\n",&array+1); //배열전체 크기
  
  
  printf("%08d\n",*(array[1]+1));//=array[1][1]이므로 값의 배열&포인터식 표현방법이다.
  printf("%08d\n",*(*(array+1)+1));//위와 같음
  
  return 0;

}

함수 포인터의 배열

#include <stdio.h>

int get_operator();
int plus(intint);
int minus(int,int);
int multiply(intint);
int divide(intint);

int get_operator()
{
  int choice;

  while(1)
  {
    fprintf(stdout,"=============================\n");
    fprintf(stdout,"0: for plus\n");
    fprintf(stdout,"1: for minus\n");
    fprintf(stdout,"2: for multiply\n");
    fprintf(stdout,"3: for divide\n");
    fprintf(stdout,"4: for quit\n");
    fprintf(stdout,"=============================\n");
    fprintf(stdout,"Please Enter operator: ");
    fscanf(stdin,"%d",&choice);
    if((choice >= 0)&&(choice <= 4)) return (choice);
    
    else fprintf(stdout,"Wrong Input, exter again!\n");
  }
  
}
int main()
{
  int op,num1,num2,result;
  int (*handle[4])(intint)={plus,minus,multiply,divide};
  //*handle[4] 함수포인터배열  {}안의 함수의 주소를 저장
  while(1)
  {
    op=get_operator();
    if(op==4)
    {
      fprintf(stdout,"This is the end of program!\n");
      exit(0);//프로그램종료 정상종료시 0을 가지고 있다.
    }


    fprintf(stdout,"Enter the first operand: ");
    fscanf(stdin,"%d",&num1);
    fprintf(stdout,"Enter the second operanf: ");
    fscanf(stdin,"%d",&num2);

    result=handle[op] (num1,num2);
    fprintf(stdout,"\nthe result of operation is %d\n\n",result);
  }
}

int plus(int n1,int n2) 
{
  return (n1+n2);
}
int minus(int n1,int n2)
{
  return (n1-n2);
}
int multiply(int n1,int n2)
{
  return (n1*n2);
}
int divide(int n1,int n2)
{
  return (n1/n2);
}

  
문자열

문자열은 문자형 배열이다. 문자형 상수는 작은따옴표를 이용하여 표시하고, 문자열 상수는 큰따옴표로 표시한다.
문자 상수는 1바이트를 차지하지만, 문자열은 컴파일러에 의해 자동적으로 맨 마지막에 NULL문자('\0')가 들어간다.

#include <stdio.h>

int main()
{
  char *string="Test"//"Test"는 코드영역에 있으므로 이 문장은 코드영역을 직접 수정하는것이다
  char A[]="Test";//A[]가 "Test"를 복사해서 가지고 있으므로(Stack영역) 수정을 해도 문제가 없다.

  //*string='A'; //리눅스에서는 에러가 나기 때문에 사용할수 없다 cl에서는 동작한다
  *A='A';
  printf("%08X\n",string);//코드영역주소출력
  printf("%08X\n",A);//Stack영역주소출력
  
  printf("%s\n",A);//Aest 출력
  return 0;
}