본문 바로가기

728x90
반응형

C언어/C언어 문법

(51)
[C언어] scanf 호출 시 &연산자를 사용하는 이유 &연산자의 역할 scanf 함수는 값을 입력받아서 변수에 전달하는 역할을 한다. 해당 역할을 수행하기 위해서는 변수가 어디 저장되어 있는지 알아야 할 것이다. 따라서 &연산자를 통해 변수의 주소를 scanf 함수에 전달해주어야 하는 것이다. 그런데 문자열을 저장할 때에는 & 연산자를 필요로 하지 않는다. 이전 포스팅에서도 다루었듯이 문자열의 자료형은 char*형이다. 따라서 그 자체로 이미 주소값을 나타내고 있기 때문에 굳이 &연산자를 붙여주지 않아도 되는 것이다. 아니, &연산자를 붙이게 되면 틀린 문법이 되어버린다.
[C언어] 포인터 반환 함수 포인터 반환 함수 포인터 반환 함수를 선언하는 방법은 반환값의 자료형과 함수 이름 사이에 *을 붙여주면 된다. 그러나 아래 코드처럼 작성할 경우 제대로 사용이 불가능할 것이다. int *Num() { int num = 5; return # } 위 코드처럼 사용하게 되면 지역변수인 num은 Num함수의 호출이 종료되면 사용이 끝났다고 판단되어서 프로그램 실행 중에 값이 손상될 수 있기 때문이다. 따라서 올바른 포인터 반환 함수의 사용법은 아래와 같다. int *Num() { int *ptr = malloc(sizeof(int)); *ptr = 5; return ptr; } 동적할당으로 메모리를 할당해주면 함수가 끝났을 때 ptr을 역참조 할 수는 없지만 free 함수로 메모리를 해제하기 전까지 메모..
[C언어] Call By Reference Call_By_Reference Call by value 함수와 Call by reference 함수를 구분하는 기준은 함수의 호출 방식이다. Call by value 함수는 인자로 변수를 받아오고 Call by reference 함수는 인자로 주소값을 받아온다. 아주 간단한 차이지만 이 둘의 차이는 극명하다. 인자로 변수를 받아오면 변수를 그대로 사용하는 것이 아니라 변수를 복제하여 함수에 전달하게 되는 것이다. 그러니 함수에서 변수를 변형시키려고 아무리 노력해도 복제본만 수정될 뿐인 것이다. 그래서 우리는 함수에 주소값을 전달하는 것으로 함수 안에서도 변수에 간접적으로 접근할 수 있게 만들 수 있다. Call By Value 방식으로 변수의 값을 증가시키려고 해보겠다. #include void fun..
[C언어] 함수 포인터 배열 함수 포인터 배열 함수 포인터를 응용하여 함수를 배열에 넣어서 사용할 수 있다. 함수 포인터 배열은 함수 포인터를 선언할 때 함수 포인터 이름 뒤에 괄호와 배열의 크기를 넣어서 선언한다. 아래 코드처럼 int (*fptr[3])(int, int) = {FuncA, FuncB, FuncC}; 함수 포인터를 함수의 매개변수로 사용 함수 포인터를 함수의 매개변수로 사용할 수도 있다. #include #pragma warning(disable:4996) double add(int a, int b) { return (double)a + b; } double sub(int a, int b) { return (double)a - b; } double mul(int a, int b) { return (double)a ..
[C언어] 함수 포인터 함수와 주소 함수의 이름도 배열과 마찬가지로 주소를 나타낸다. 아래 코드를 통해서 확인이 가능하다. #include void helloworld() { printf("Hello, World!"); } int main() { printf("%p", helloworld); return 0; } 함수 포인터 함수 포인터에는 함수의 주소값을 저장할 수 있다. 함수 포인터를 선언할 때에는 저장될 함수의 반환형과 매개변수가 필요하다. 예를 들어 int형 변수 2개를 매개변수로 갖는 double형 함수의 주소를 저장하는 함수 포인터는 다음과 같인 선언할 수 있다. double (*ptr)(int, int) = calc; double calc (int a, int b) { return (double)a/b; } 매개변..
[C언어] 리터럴 상수 (Literal Constant) 리터럴 상수 (Literal Constant) 리터럴 상수란 자료형만 정해져있고 이름 없이 메모리에 저장된 데이터를 뜻한다. 다음 코드를 예시로 설명해 보겠다. int num = 50 + 20; 위 코드는 50과 20의 덧셈을 먼저 진행한 후에 그 결과 값을 num에 대입하게 된다. 그렇다면 50과 20도 CPU에서 계산되기 위해 메모리상에 존재하는 값이어야 할 것이다. 따라서 위 코드는 다음과 같은 형태가 된다. 이때 50과 20을 이름이 없는 상수, 즉 리터럴 상수라고 부른다. 이전에 문자열을 다루던 포스팅에서도 문자열을 설명할 때 여러 번 말했던 개념이기도 하다. 상수 형태의 문자열을 선언할 경우에 선언한 문자열도 마찬가지로 '리터럴 상수'가 되는 것이다.
[C언어] 문자열 배열 문자열 배열 문자열도 배열에 저장하는 것이 가능하다. 변수 형태의 문자열은 다차원 배열을 사용하면 되고 상수 형태의 문자열은 포인터 배열을 사용하면 된다. #include int main() { char name1[3][20] = {"ENCHUPIN1", "Enchupin1", "enchupin1"}; char *name2[3] = {"ENCHUPIN3", "Enchupin3", "enchupin3"}; printf("%s %s %s\n", name1[0], name1[1], name1[2]); printf("%s %s %s\n", name2[0], name2[1], name2[2]); return 0; } 위 코드를 실행시켜 보면 각각 3개의 문자열이 정상적으로 출력되는 것을 확인할 수 있다. 변수 형..
[C언어] 문자열 (변수 형태의 문자열, 상수 형태의 문자열) 변수 형태의 문자열 char형의 배열에 문자를 집어넣음으로써 문자열을 저장할 수 있다. 문자열을 입출력할 때 반복문을 사용하여 다음과 같이 코드를 작성할 수도 있다. #include #pragma warning(disable:4996) int main(void) { int i; char arr[5]; for(i=0;i

728x90
반응형