일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 구조체
- float
- 42cursus
- Class
- Double
- phpmyadmin
- 42Seoul
- C언어
- 자료형
- vs코드 단축키
- nginx
- list
- cout
- python
- 42
- 패킹
- for
- 함수
- libft
- While
- ft_server
- 2차원배열
- C++
- 42서울
- 동적할당
- jupyter 단축키
- else if
- docker
- 포인터
- iF
- Today
- Total
목록C언어 (28)
Developer
지금까지는 키보드로 입력받고, 화면으로 출력만 해보았다. 이제 파일로 부터 읽어오고, 파일로 출력하는 C언어의 파일 입출력을 배워보자. 파일에 입출력을 하기 위해서는 파일 포인터를 선언해 fopen함수로 원하는 파일의 포인터를 얻어야 한다. FILE *fp =fopen("test.txt","w"); 위의 코드는 test.txt 파일을 w(쓰기)모드로 열어 파일포인터 fp에 저장한 것이다. fopen함수는 파일 열기에 시작하면 파일 포인터를 반환하고, 실패하면 NULL을 반환한다. 파일 모드 기능 기능 설명 "r" 읽기 전용 파일을 읽기 전용으로 연다. 반드시 파일이 있어야 함 "w" 쓰기 전용 파일을 쓰기 전용으로 연다. 파일이 없다면 파일을 생성하고, 있다면 내용을 덮어쓴다. "a" 추가 파일이 있다면..
함수 포인터 함수의 이름도 포인터이므로 함수도 메모리 주소를 가지고 있다. 따라서 함수 포인터를 사용해 함수 자체를 배열에 넣거나, 매개변수로 넘겨줄 수 있다. 함수 포인터는 다음과 같이 선언할 수 있다. 리턴자료형 (*함수포인터이름)(매개변수자료형,매개변수자료형..); 위와 같이 선언한 함수 포인터는 리턴자료형이 같고, 매개변수자료형과, 갯수가 같은 함수를 가리킬 수 있다. #include int add(int a,int b) { return a + b; } int sub(int a, int b) { return a - b; } int main() { int fnum, a, b; int (*fp)(int, int)=NULL; scanf("%d %d %d", &fnum, &a, &b); switch (f..
이번에는 함수에서 배열을 매개변수로 사용해보자. 배열 매개변수 배열을 매개변수로 사용할 때에는 포인터를 사용하거나 변수뒤에 [](대괄호)를 붙혀주면된다. #include void f(int* a) { a[3] = 200; } int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; f(arr); printf("%d\n", arr[3]); return 0; } 코드1과 같이 배열의 이름은 배열의 첫 주소를 가리키는 포인터이므로 위와 같이 사용할 수 있다. 하지만 이렇게 작성하면 매개변수가 배열인지 함수만 봐서는 알기 어렵다는 단점이 있다. #include void f(int a[]) { a[3] = 200; } int main() { int arr[10] = { 1..
특정 기능별로 코드를 나누어 작성할 수 있도록 C에서는 함수기능을 제공한다. 이전까지 우리는 printf같은 C에 미리 만들어져 있는 함수를 사용했지만 직접 원하는 기능의 함수를 만들 수 있다. 함수 작성은 아래와 같이 할 수 있다. 리턴자료형 이름(매개변수){ 코드; } 리턴 자료형이란 해당 함수를 호출한 곳에 함수가 종료되었을 때 반환할 값의 자료형을 말한다. 만약 반환할 값이 없다면 void를 작성해 주면 된다. 매개변수는 함수를 호출한 곳에서 전달된 값이 저장되는 변수이다. 만약 매개변수가 없다면 괄호만 작성하거나 괄호 내부에 void를 작성해 주면 된다. 간단한 덧셈 함수를 만들어 사용해보자. #include int add(int a, int b) { return a + b; } int ..
지역변수 지역변수는 변수가 선언된 { }(중괄호) 내부에서만 사용이 가능한 변수이다. 중괄호로 묶인 부분을 블록(Block)라고 하는데 지역변수는 선언된 블록 내부에서만 사용이 가능한 것이다. (아직 함수를 배우지 않았지만 선언된 함수 내부에서만 사용할 수 있는 변수이다.) 다음 3가지 코드를 보며 변수의 범위를 알아보자. #include int main() { int a=3; { a++; printf("내부 : %d\n", a); } printf("외부 :%d\n",a); return 0; } main함수의 시작에 변수a를 선언하고 3으로 초기화했다. 블록의 내부에서 변수 a를 사용하지만 이 블록도 main함수의 내부이므로 정상적으로 변수 a를 사용할 수 있다. #include int main() { ..
이벤엔 멤버들이 가장 큰 자료형의 공간을 공유하는 공용체를 알아보자. 공용체 공용체는 구조체와 정의방법이 똑같다. 차이점은 구조체는 멤버변수 각각이 서로 자신의 공간을 차지하고, 공용체는 멤버변수가 공간을 공유한다. 공용체의 정의는 union키워드를 사용하며 아래와 같이 정의한다. union 공용체이름{ 자료형 멤버이름 자료형 멤버이름 자료형 멤버이름 }; 구조체와 마찬가지로 typedef로 별칭을 지정할 수 있고, .(점)을 사용해 멤버 변수에 접근할 수 있으며, 포인터도 사용할 수 있다.물론 포인터로 멤버 변수에 접근하려면 ->(화살표) 연산자를 사용해야한다. 그럼 멤버끼리 공간을 공유한다는 말이 무슨 말인지 알아보자. #include typedef union ex { char c; short..
CPU는 비트에 따라서 메모리 접근 단위가 다르다. 32비트의 컴퓨터는 32비트 단위로, 64비트의 컴퓨터는 64비트 단위로 접근한다. 대부분의 C언어 컴파일러는 CPU가 효율적으로 메모리에 접근할 수 있도록 구조체를 정렬해준다. 그럼 구조체 정렬이 무엇인지 알아보자. 구조체 정렬 #include typedef struct { //구조체 정의 char a; int b; }some; int main() { some c; //구조체 변수 선언 printf("멤버변수 a의 크기 :%d Byte\n", sizeof(c.a)); printf("멤버변수 b의 크기 :%d Byte\n", sizeof(c.b)); printf("구조체 변수 c의 크기 :%d Byte\n", sizeof(c)); return 0; ..
구조체도 다른 자료형과 같이 포인터, 배열을 사용할 수 있다. 구조체 포인터 #include #include typedef struct Student{ char name[30]; //이름 char phone_number[30]; //전화번호 int student_id; //학번 }Student; int main(){ Student s={"김모군","010-xxxx-xxxx",123456}; Student *sp; sp=&s; printf("-> 사용\n"); printf("%s\n",sp->name); printf("%s\n",sp->phone_number); printf("%d\n",sp->student_id); printf("\n역참조 사용\n"); printf("%s\n",(*sp).name); p..