본문 바로가기

FALL in/G.MA' s C

[C프로그래밍] - 문자배열과 포인터 문자배열과 포인터 어떤 문자열을 저장하고 싶을때char str[100] = "G.MA's LOG"; 와 같이 문자배열을 초기화 해줄수 있다. 다른 방법으로char *ptr = "G.MA's LOG"; 도 가능하다.위와 같이 하면 메모리에 "G.MA's LOG"가 들어갈 공간을 만들고 "G.MA's LOG"를 넣어준다. 그리고 그 시작주소를 ptr에 넘겨주게된다. char str[100] = "G.MA's LOG";char *ptr = str; 위와같이도 가능하다. 여기서 str은 배열의 이름이자 배열의 시작주소(=&str[0])이다. 배열의 이름은 상수 포인터라고 하기도 하는데 그 주소값이 바뀔수 없기때문이다.즉 str++;을 실행하면 에러가 난다. 따라서 산술연산을 통해 배열의 원소에 접근하고 싶다면 .. 더보기
[C프로그래밍] - Call by Value vs. Call by Reference Call by Value(값에 의한 호출)단순히 변수의 값을 복사(copy)해서 넘겨준다. 원본값이 변경될 가능성이 없다.값을 넘겨줄때마다 고비용, 복사손실의 문제가 있다. Call by Reference(참조에 의한 호출) 변수의 주소값을 넘겨준다. 원본값을 변경할수있다.고비용, 복사손실의 문제가 없다.(변수안의 값을 하나하나 인자값으로 copy해서 넘겨주지않아도 되므로 메모리양을 줄일수있다.) 실행결과 더보기
[C프로그래밍] - 메모리 메모리 영역 - Stack 영역 : 어떤함수안에 변수가 선언되면 스택영역안의 그 함수의 영역에 변수가 저장된다. 함수마다 스택영역안에 자신의 스택영역이 있다. 하지만 한 함수에 변수가 선언될수있는 스택영역은 제한이 있다. 따라서 함수안에 변수가 일정개수 이상이면 에러가 나게 된다. 함수 안에 크기가 엄청큰 배열을 선언했다가 에러가 난 경험이 있을것이다. 그것이 이같은 경우이다. 스택영역은 프로그램 수행중에 메모리영역을 바꿀수 없다. - Heap 영역: 스택영역과 달리 변수선언개수에 제한이 없다. 동적으로 메모리를 할당할 경우 힙영역에 메모리가 할당된다. 힙 영역은 공유메모리(같이 쓰는공간)이기때문에 요청을 하고 반납을 해주어야한다. 힙영역은 프로그램 수행중에 메모리 요청이 가능하다. 동적 메모리 할당 m.. 더보기
[C프로그래밍] - 재귀호출 재귀호출 재귀호출은 말그대로 자기자신을 호출하여 순환 수행이 되는것이다. 아래 소스는 팩토리얼을 계산하는 재귀함수이다. 함수안에서 자기자신을 순환적으로 호출한다.마치 함수 구조가 '마트로시카'라는 러시아의 전통인형같다. 함수안에 함수가 있고 또 함수안에 함수가 있고 또 함수안에 함수가 있다. 재귀호출은 for문에의한 반복문보다 프로그래머가 코드를 이해하기 쉽고 간단하게 작성가능하다.하지만 함수를 계속적으로 불러야되기때문에 실행하는데 시간이 많이 걸릴수있다. 메인함수에서 fact(4)가 실행되면 함수로 들어가-> return 4 * fact(3);이 실행된다.여기서 fact(3)이 실행되고(return 4 * 3 * fact(2);)fact(2)가 실행되고 (return 4 * 3 * 2 * fact(1).. 더보기
[C프로그래밍] - 포인터 포인터 개념 / 선언과 초기화 포인터(포인터 변수)는 변수의 주소값을 저장할수 있다. 예를 들어, int a =10; 정수형 변수 a를 선언하고 10으로 초기화 했다.변수a의 값은 메모리공간 어딘가에 저장되어진다. 변수의 값은 모두 메모리공간 어딘가에 저장되어지는데 이 변수값에 접근하고 싶다면 이 변수가 어디 저장되어있는지 주소값을 알아야 한다. &a는 a의 값이 저장되어있는 메모리주소를 의미한다. 즉 &a는 a의 주소값이다. 그리고 변수의 주소값을 저장하는 변수를 포인터 변수라고 한다. &a(a의 주소값)을 저장하기위한 자료형은 포인터인 것이다. int* ptr = &a; 이와 같이 정수형 포인터 변수를 선언하고 초기화 해줄수있다. ptr이라는 변수에 a의 주소값을 넣었다. 여기서 int * 는 하나의.. 더보기
[C프로그래밍] - 구조체 구조체 정의와 선언 구조체도 배열처럼 여러개의 데이터를 그룹으로 묶어서 하나의 자료형으로 정의하고 사용하는 자료형이다. 배열과 구조체가 다른점이 있다면, 배열은 같은타입의 데이터만 그룹으로 묶을수있고, 구조체는 다른타입의 데이터도 그룹으로 묶을수 있다는 것이다.예를 들어, 학생수가 30명인 어떤 반의 학생들의 수학성적을 저장하고 싶다면 int score_math[30]; 와 같이 배열을 선언하고 사용할수 있다. 하지만, 그 반 학생의 이름, 번호, 수학성적, 영어성적를 저장하고 싶다면 아래와 같이 구조체를 정의하여 사용하면 편리하다. //학생 구조체 정의struct Student //구조체 이름{//구조체에 들어갈 항목 선언char name[20];int number;int score_math;int s.. 더보기
[C프로그래밍] - 배열 배열(Array) 배열은 같은 자료형(data type)을 가진 변수들의 나열이라고 생각하면된다. 배열은 나누어서 할당 될 수 없고 메모리에 연속적으로 저장된다. (메모리에 연속된 공간이 필요하다 ) 인덱스(index) : 배열의 요소를 구별하기위해 사용하는 번호이다. C에서 인덱스는 항상 0부터 시작한다. 1차원 배열 1차원 배열의 선언 형식은 아래와 같다. 데이터타입 배열이름[배열요소(변수)개수]; 예들들어, 정수변수가 10개 들어갈 수 있는 배열 arr라는 배열을 선언하려 하면 아래와 같이 선언하면 된다.int arr[10];int형 배열요소 10개로 구성된 배열 arr이라는 뜻이다.배열요소는 arr[0]부터 arr[9]까지이고 메모리 할당크기는 int가 4byte이므로 4byte X 10 = 40.. 더보기