목록C (47)
NULL
putchar는 하나의 문자를 출력하는 것이고fputc는 인자가 두개인데 첫번째 인자는문자이고 두번째 인자는 출력 대상을 의미한다. 한마디로 문자를 어디에다가 출력할것인지그 대상을 지정할수있다. 두번째 인자에 stdout을 입력하면모니터로 출력하게 된다. getchar는 키보드로 입력된 문자를 반환하고fgetc는 문자를 입력받을 대상을 인자로 전달한다. 한마디로 입력받을곳을 지정할수있다. 인자에 stdin을 입력해주면키보드로 입력을 받는다. 여기서 fgetc는 엔터키까지문자로 받아들이고 fputc로 엔터키를출력하는 결과를 볼수있다.
스트림이란 흐름을 의미한다. 데이터를 컴퓨터내부로 받아들이는것을 입력이라하고외부로 전송하는 것을 출력이라고 한다. 입출력 스트림은 OS가데이터의 입출력을 위해 놓아주는소프트웨어적인 형태의 다리이다.이유는 OS가 소프트웨어이기때문.OS가 자동적으로 스트림을 제공해준다. stdin과 stdout은 표준출력스트림이고stderr는 표준 에러스트림을 의미한다. 여기서 나와있는입출력의 대상들은 바꿀수있다. 스트림은 운영체제에 의해서자동으로 형성되고종료와 동시에 자동으로 소멸된다.
함수의 선언 컴파일이 위에서 아래로 진행이 되기 때문에함수의 배치순서는 중요하다. 컴파일 되지 않은 함수는 호출이 불가능하다. 컴파일러는 위에서 아래로 읽기때문에 메인함수가 필요로 하는 함수보다 위에 있으면컴파일러는 필요로 하는 함수를 인식하지 못해서필요로 하는 함수를 호출할수없게 된다. 그래서 일반적으로 함수의 선언을 해준다. 예시) int add(int n) 이런 함수가 존재한다면 정의는 중요하지않다. 변수선언하듯이함수도 선언해주는것이다. int add(int n); // 선언 예시 1int add(int); // 선언 예시 2 예시 1도 선언하는덴 지장없지만변수 이름이 중요한게 아니라그 함수에 매개변수와 반환값이 중요하지변수이름이 중요한게 아니기때문에 예시 2로 해도 상관없다.
함수이름에도 주소값이 있다. 함수포인터도 포인터과 같이그 함수의 함수반환형과매개변수의 타입도 동일해야한다. 함수포인터에 타입을매개변수로 인자를 전달할때굳이 정해주지않아도 된다. 하지만 그 함수내에서 변수의사용을하려면 변수이름을 정해줘야한다. 그리고 매개변수의 타입형갯수도1개면 1개 2개면 2개이렇게 갯수도 동일하게 넘겨줘야한다. 함수포인터 선언법을 알아보자. int SoSimple(int num1, int num2) { }이런 함수가 있다고 가정해보자. int (*fptr) (int, int);이런식으로 함수를 지정해줄포인터를 선언하고가리킬 함수에 매개변수와동일한 자료형타입과 갯수를괄호안에 적어준다. fptr=SoSimple;그리고 fptr에 함수의 이름을대입시키면 함수의 주소를가리키게 된다. fptr(..
int * parr[20;는 [ ] 역시 가리키는것이기때문에포인터와 같아서 *을 하나 더 붙여서이중포인터가 된다. int arr2d[3][4];2차원 배열은 쉽게 포인터형으로결정짓을수없다. (*ptr)[4]; 이런식으로 선언해야된다.뒤에 [4]는 안써줘도 자동으로 할당된다. ptr=arr2d; 이렇게 해주면arr2d에 주소값을 저장한다. 배열의 1열의 인덱스마다 첫번째 행의 주소값을 가리킨다. 2차원배열에서는 배열이름과배열의 이름[0]의 값은 틀리다. 이유는 ?배열이름은 배열전체의 크기이고배열이름[0]은 1행의 크기이다.그래서 다르다. 배열의이름에 +1 이런식으로 연산을 하게되면1열씩 증가하게 되는 결과를 볼수있다.크기또한 1열의 길이만큼 크기만큼 증가한다. 가로의 길이가 다르기때매증감하는 크기에 차이가..
이중포인터는 ?변수를 가리키고있는 포인터변수를가리키고 있는 포인터이다. 쉽게 생각하면dptr은 ptr을 가리키고 있고ptr은 num을 가리키고 있다. 이중포인터는일중포인터의 주소값 저장하는 용도다. 삼중포인터라고 치면이중포인터의 주소값을 저장하는 용도다. 이렇듯 가리키는덴 제한이없으며*는 메모리공간을 접근하는 것인데 이중포인터가 있는데*를 한개만 사용한다면 그 의미는*dptr접근하면 ptr의 주소값을보게되지만 ptr을 한번 더 접근해야num을 보게되는 것. 그래서 이중포인터라면 **를 써줘야댄다. 삼중포인터라면***를 써주면 된다. 선언은 이런식으로 한다.
흔히 주로 쓰이는것은 1차원 배열이며쓸일이 있어도 2차원 배열까지만 쓴다.3차원 배열부터는 별로 쓰이지않는다. 이유는 사람의 머리로는 상상할수없다. 1차원배열이 아파트로 따지면아파트의 1층이며 2차원 배열은 층층을 표현할수있고 3차원 배열은2차원배열을 3면으로 표현가능하다. 2차원 배열의 선언 방식은 ? 이미지대로 이며 행렬의 개념이다.배열은 0부터 시작이다. 그러면 1층의 1번방은arr[0][0] 인것이다. 2차원배열의 이름역시 주소값을 가리키고2차원배열의 이름과 세로인덱스만 쓰면그 층의 첫번째주소값을 가리킨다. 2차원배열의 가변배열선언은int arr[3][3]={{ } , { } , { }} 이런식으로 괄호한번 열어주고그안에 괄호를 한번 더 열어줘야댄다.괄호마다 한 층을 의미한다. 굳이 인덱스도 다 ..
const가 자료형앞에 선언되면포인터변수가 가리키는 값을변경하지않는다. const가 포인터변수앞에 오면 포인터변수의 값을 상수화시키며저장된값은 변경불가능하다.가리키는 대상도 변경할수없다.
함수에 값을 전달한 것과주소값을 전달한 것의 차이는 매개변수에 값을 전달하게 되면? 값이 복사되는것이지 그 값이 실제로전달된것이 아니기때문에 다른함수에서값을 변경하였다고 해도 서로 다른 값이다. 주소값을 함수로 전달하게 되면? 함수에 주소값을 전달하고값을 변경해도 그 주소값에들어있는 값이 변경되는것이고주소값은 동일하기때문에어떠한 함수에서라도 값변경이 가능하다.
인자전달의 기본방식은 값의 복사다. age를 인자로 전달할때 값이age변수로 전달되는게 아니라age의 값을 복사해서 전달한다. C언어는 매개변수로 배열의선언을 허용하지 않는다.배열을 통째로 복사하는 방법은C언어에선 존재하지 않기때문에 그 대신에 배열의 주소값을전달 하는 방식을 취한다. 배열의 이름을 전달하고길이는 sizeof(배열이름)/sizeof(타입)이렇게 하면 길이가 나오게 된다. 매개변수선언에서int * param과 int param[]은동일한 선언이다.뭘 쓰게 되던 포인터이기때문이다.다만 배열로 선언해주는 이유는배열을 넘기는 표현으로 쓴다. 매개변수 의외엔동일하지않으니 주의하자.