포인터를 이용하면 메모리에 직접 접근이 가능하다. ( 포인터가 존재하기때문에 C언어는 저급언어이다 )

포인터변수와 &연산자


int num=7;

int * pnum = # // 포인터변수 pnum에 &연산자를 이용해  num의 주소값을 저장

int * pnum2 = NULL; // 포인터변수를 선언만 해두고, 이후에 유효한 주소값을 넣을생각이라면 주소값을 NULL로 초기화하자.

*포인터변수의 크기는 4바이트(32비트 시스템에서) 가될수도있고, 8바이트(64비트 시스템에서) 가 될수도 있다.


type * ptr; // type 형 변수의 주소값을 저장하는 포인터 변수  ptr 의 선언


다양한 포인터형이 존재하는 이유


만약 int *pnum; 이라고 선언되었다면, *pnum 으로 데이터를 읽어들일때 , int의 크기인 4바이트를 읽어온다 . 이렇듯 포인터형은 메모리 공간을 참조하는 기준이된다. 


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

C : Chapter -12 포인터와 함수  (0) 2018.03.22
C : Chapter -11 포인터와 배열  (0) 2018.03.22
C : Chapter-9 배열  (0) 2018.03.22
C : Chapter -8 함수  (0) 2018.03.19
C : Chapter -7 조건문  (0) 2018.03.19

1차형 배열의 선언


int arr1 [4]; - 자료형, 배열이름 , 길이정보

int arr2 [5] = {1,2,3,4,5}; // 배열 선언과 동시에 초기화

int arr3 [3] = {1,2}; // 이때 , 초기화되지않은 arr[2]에는 0이 채워진다.

배열에 값을 저장할때에는 arr[0] = 7; 이런식으로 저장한다. 이때 , 배열의 위치 정보를 명시하는 인덱스 값은 1이아닌 0에서부터 시작한다.

* len = sizeof(arr) / sizeof(int); 

sizeof 연산자를 이용해 배열의 길이를 알아낼 수 있다. 이때, sizeof 연산의 결과로는 바이트단위의 배열크기가 반환된다.

(따라서 길이를 알고싶다면 자료형의 사이즈로 나눠줘야한다)


char형 배열의 문자열 저장과 null 문자


char str [14] = "Good Morning!"; // 큰따옴표를 이용해서 문자열을 표현 (작은따옴표는 문자)

문자열 끝에는 \0(널문자) 라는 특수문자가 자동으로 설정되기때문에 , \0이 저장될 공간까지 고려해서 길이를 결정해야한다. 널문자의 아스키코드값은 0이다. C언어에서 널문자가 없으면 문자열이아니다. 반대로말하면 문자열의 선언방법에 관계없이 널문자가 마지막에 존재하면 문자열인것이다.


scanf 함수를 이용한 문자열의 입력


printf 함수를 이용하여 문자열을 출력할때 %s 서식문자를 사용하는것과 마찬가지로 scanf 함수를 이용하여 문자열을 입력할때도 %s 서식문자를 이용한다. 이때, 입력받을 대상에는 &연산자를 사용하지 않는다.


scanf 함수의 문자열 입력특성 - scnaf 함수의 데이터 구분기준은 공백이므로 , 만약 he is my friend 라는 문자열을 입력했을때 , he 만 입력되게된다. 따라서 scanf 함수는 문장을 입력받기엔 적절치 않다.




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

C : Chapter -11 포인터와 배열  (0) 2018.03.22
C : Chapter-10 포인터  (0) 2018.03.22
C : Chapter -8 함수  (0) 2018.03.19
C : Chapter -7 조건문  (0) 2018.03.19
C : Chapter -6 반복문  (0) 2018.03.19

함수의 정의


반환값의_자료형 함수의 이름 ( 매개변수 ) 


1. 전달인자가 있고 , 반환값이 있는경우


int Add ( int a , int b)

{

return a+b;

}


2. 전달인자가 있고 , 반환값이 없는경우


void ShowAddResult(int a)

{

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

}


3. 전달인자가 없고 , 반환값이 있는경우


int GetNum( void )

{

int num;

scanf("%d",&num);

return num;

}


4. 전달인자가 없고 , 반환값이 없는경우


void InitProgram( void )

{

printf(" 프로그램 시작\n " );

// void 여도 return; 이런식으로 return 의 두가지기능중 하나인 함수 종료기능을 사용하여 함수를 종료시킬 수 있다

}


함수의 선언


함수는 main 함수에서 컴파일되기전에 컴파일된 상태여야한다. 따라서 main 함수 위에 선언되어야 하는데, 함수의 정의 내용이 클때는 함수의 선언만 앞에서 하고 뒤로 정의를 뺄 수 있다.


ex)

int Add(int , int ); // 함수를 선언만 할 때에는 매개변수의 자료형만 써도된다.


int main ( void )

{

//

}

int Add ( int a , int b)

{

return a+b;

}


지역변수


지역변수는 중괄호 내에 선언되는 모든 변수를 말하며 , 이 변수들은 중괄호를 벗어나게되면 자동으로 소멸되게된다.

지역변수는 스택(stack) 이라는 메모리 영역에 할당된다.

지역변수는 반복문이나 조건문에도 선언이 가능하다.

지역변수는 변수의 이름이 같을때 가장 나중에 컴파일된 변수가 앞에컴파일된 변수를 가린다.


전역변수 


전역변수는 중괄호 내에 선언되지않는다.

전역변수는 프로그램의 시작과 동시에 메모리 공간에 할당되어 종료시까지 존재한다

전역변수는 별도의 값으로 초기화하지 않으면 0 으로 초기화된다.

전역변수는 프로그램 전체 영역 어디서든 접근이 가능하다.

전역변수와 동일한 이름의 지역변수가 선언되면 지역변수가 전역변수를 가린다.

전역변수는 프로그램의 구조를 복잡하게만들기때문에 가급적 사용을 자제해야한다.


static변수


지역변수에 static 선언을 하게되면 , 전역변수의 성격을 지니는 변수가된다.

1. 선언된 함수 내애서만 접근이 가능하다( 지역변수 특성 )

2.딱1회 초기화되고, 프로그램 종료시까지 메모리 공간에 존재한다 ( 전역변수 특성 )

static 지역변수는 프로그램 종료시까지 사라지지않지만, 접근범위를 선언된 함수 내로 제한하기때문에 전역변수를 사용하는것보다 안정적이다.


register 변수


register 로 지역변수를 선언하면 CPU내의 레지스터라는 메모리공간에 저장될 확률이 높아진다.

레지스터는 CPU내에 존재하는 아주 크기가 작은 메모리이다. 하지만 연산속도가 매우 빠르다 . 따라서 연산을 자주필요로하는 변수는 register 변수를 이용해 빠른 연산을 기대할 수 있다. ( 하지만 변수를 레지스터에 저장하기로 결정하는것은 컴파일러기때문에 반드시 레지스터에 저장된다고는 할 수 없다.  register 선언을 하지 않아도 컴파일러가 그래야겠다고 결정하면 레지스터에 저장된다 )


재귀함수


재귀함수란 함수 내에서 자기자신을 다시 호출하는 함수이다.


ex) 


int Factorial( int n)

{

if(n<2)

return 1;

else

return n*Factorial(n-1);

}


하나의 함수는 하나의 기능을 지녀야한다

 

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

C : Chapter-10 포인터  (0) 2018.03.22
C : Chapter-9 배열  (0) 2018.03.22
C : Chapter -7 조건문  (0) 2018.03.19
C : Chapter -6 반복문  (0) 2018.03.19
C : Chapter -5 상수와 기본자료형  (0) 2018.03.17

+ Recent posts