C 29

포인터 사용시 주의해야할 점

1. 초기화 하지않고 사용하기 - 만약 포인터가 선언만 되고 초기화하지 않았다면 포인터는 임의의 주소를 가리키게 된다. 포인터를 초기화시키지 않고 포인터p가 가리키는 곳에 값을 100을 대입하고 있어 위험한 코드이다. 만약 우연히 p가 중요한 영역을 가리키고 있었다면 중요한 정보를 덮어 쓸수도 있으며 따라서 전체 시스템을 다운시킬 수 있다. 2. NULL포인터 사용 포인터가 아무것도 가리키고 있지 않을 때는 NULL(0)로 설정하는 것이 바람직하다. 3. 포인터 자료형과 변수의 자료형은 일치하여야 한다.

C/포인터 2019.12.05

함수와 포인터

데이터를 전부 복사해서 함수로 넘기는 것보다 데이터가 있는 위치를 포인터로 알려주는편이 훨씬 효율적이다. 일반적으로 외부로부터 데이터를 받는 방법에는 2가지가 있다. * 값에 의한 호출(call-by-value) : 함수가 호출될 때 복사본이 함수로 전달되면 값에 의한 호출이다. 함수 안에서 매개변수를 변경하여도 원본에는 영향을 주지않는다. * 참조에 의한 호출(call-by-reference) : 만약 함수가 호출될 때 원본을 함수로 전달하는 방법이다. 함수 안에서 매개변수를 변경하면 원본 변수가 변경된다. C언어에서는 기본적으로 값에 의한 호출만 가능하다. #include void modify(int value){ value = 99; } int main(void){ int number = 1; mo..

C/포인터 2019.12.05

문자열과 포인터

문자열을 저장할때, 이때까지는 문자형 배열만을 사용하였다. 하지만 다른방법이 있는데, 문자 포인터를 선언하고 여기에 문자열의 주소를 저장하는 방법이다. char s[] = "HelloWorld"; //1번 char *p = "HelloWorld"; //2번 1번은 문자형 배열 s[]을 선언하는 문장이다. 2번은 기본적으로 문자형 포인터p를 선언하는 문장이다. 문자열 상수 "HelloWorld"는 읽기 전용 메모리에 저장되고 주소가 반환되어서 포인터 p에 저장된다. 그래서 변경되지 않는 문자열을 저장할때 2번이 좋다. 2번과 같은 방법을 사용하면 편리하면서도 메모리를 절약할 수 있다.

C/문자열 처리 2019.12.04

C언어 문자열 처리

문자열을 사용하다보면 두개의 문자열을 붙이는 작업이나 두개의 문자열을 서로 비교하는 작업들이 필요해진다. 이러한 문자열 처리 작업을 프로그래머가 직접 함수로 작성하여 사용하는것도 물론 가능하지만 시간이 너무 많이 걸린다. 그래서 C에서는 문자열 조작을 처리해주는 많은 라이브러리 함수를 제공하고 있다. 문자열 함수들은 string.h에 선언되어 있다. 따라서 이들 함수를 사용하려면 string.h를 첫부분에 포함시켜야 한다. #include 함수 설명 strlen(s) 문자열 s이 길이를 구한다. strcpy(s1, s2) s2를 s1에 복사시킨다. strcat(s1, s2) s2를 s1의 끝에 붙여넣는다. strcmp(s1, s2) s1과 s2를 비교한다. *문자열비교* s1이 s2앞에 있으면 음수가 반..

C/문자열 처리 2019.12.04

포인터를 더 활용해보기

우리는 포인터를 통해서 저배열안에 있는 인스턴스중에서 55와 22를 출력해야한다. int main(void) { int numArr[5] = { 11, 22, 33,44,55 }; int* numPtra; void* ptr; numPtra = &numArr[2]; ptr = numArr; printf("%d\n",*(numPtra+2)); //numPtra는 numArr의 3번째칸의 주소를 가지고 있으므로, 55을 출력하려면 그 주소에서 +2를 해야한다. printf("%d\n", *((int*)ptr+1)); // ptr은 numArr의 주소를 가지고 있으므로 그리고 몇번째 칸에 있는지 알려면 int로 추적이 가능하니까 일단 먼저 (int*)로 형변환을 한다. // 그리고 22는 2번째칸에 있으므로 0..

C/포인터 2019.08.12

포인터 매개변수에 대해

int main(void) { int num; //num변수를 선언한다. int* numP = # //*numP의 주소값은 &num의 주소이다. printf("숫자 입력 : "); scanf("%d", &num); printf(" num : %d\n", num); //scanf해서 받은 num의 값을 출력한다. printf("*numP : %d\n\n", *numP); // num의 주소가 나온다. printf(" &num : %d\n", &num); // num의 주소가 나온다. printf(" numP : %d\n", numP); // numP의 주소가 나온다. 하지만 numP가 num의 주소가 같으므로 똑같은 값이 나온다. return 0; } 이것과 void result(int* x) { ..

C/포인터 2019.08.12

gets, scanf, fgets 비교

scanf() ( )안에 여러가지 format을 지정할 수 있다. #include "stdafx.h" #include int main(void) { char str[100]; printf("문자열을 입력하세요.\n"); scanf("%s", &str); printf("입력한 문자열은 %s 입니다.\n", str); return 0; } 위의 출력 결과에서 알 수 있듯이 scanf()로는 공백을 읽을 수가 없기 때문에 문자열을 입력받는 적합하지 않다. gets() 함수 - 1줄을 입력할 때는 gets( ) 함수를 사용한다. - 줄 바꿈(엔터)키를 할때까지 1줄을 그대로 읽어들인다. - 읽어들인 문자열은 줄바꿈 하는 곳에서 \0이 붙여진 배열에 저장된다. #include int main(void) { cha..

C/입출력 2019.08.05

동적 메모리 활용

동적 메모리 할당 기술은 C언어에서 고급 프로그램 개발이 이루어질 때 빠질 수 없는 부분이다. 동적 메모리에 대한 활용이 익숙해지만 메모리에 대한 이해도가 높아지고 메모리를 적절하게 사용하는 방법을 알게 된다. 따라서 동적 메모리에 대한 개념을 바르게 이해하고 이를 활용할 수 있도록 반복적으로 이를 활용해 볼 필요가 있다. #include #include //구조체의 동적 메모리 할당 struct Book { int number; char title[100]; }; void showBook(struct Book* p, int n) { int i; for (i = 0; i number, (p + i)->title); } } ..

C/기초 2019.08.02