공부 STUDY/C | C++

    [ C ] 응용 포인터 | 포인터의 주소는? | 부분 배열의 주소 | 2차원 배열의 배열명 | 배열 포인터

    [ C ] 응용 포인터 | 포인터의 주소는? | 부분 배열의 주소 | 2차원 배열의 배열명 | 배열 포인터

    주소 값 자체를 처리할 데이터로 생각해보자. 주소를 저장한 포인터도 하나의 변수이고, 따라서 그 주소를 구할 수 있으며 또 다른 포인터에 저장하고 가리키는 것도 가능하다. 쉽게 말하자면 찾아간 주소 위치에 또 주소 값이 있다는 말이다! 이중 포인터 포인터도 메모리에 저장 공간을 갖는 하나의 변수이다. 따라서 주소 연산으로 포인터의 주소도 구할 수 있다. 예를 들어 어떤 변수를 가리키는 포인터 pi가 있다고 가정해보자. 이 포인터 pi가 할당된 메모리의 시작 위치가 200번지일 때 그 주소를 구한다고 해보자. 그러면 이 주소를 저장하는 포인터가 바로 이중 포인터다. 포인터의 주소는 이중 포인터에 저장하고, 포인터를 가리킨다. 포인터의 주소를 저장한 이중 포인터에 간접 참조 연산을 수행하면 가리키는 대상은 ..

    [ C ] 변수 사용 영역 | 지역 변수 | 전역 변수 | 정적 지역 변수 | 레지스터 변수

    [ C ] 변수 사용 영역 | 지역 변수 | 전역 변수 | 정적 지역 변수 | 레지스터 변수

    변수는 사용 범위와 메모리에 존재하는 기간에 따라 종류가 다양하다. 지역변수 Local Variable 지녁 변수는 함수 내(일정 지역)에서만 사용하는 변수이다. 지역 변수는 사용 범위가 블록 내부로 제한되므로 다른 함수에서는 사용할 수 없다. 따라서 다른 함수에서 같은 이름의 변수를 선언해도 충돌하지 않는다. 지역 변수는 이름이 같아도 선언된 함수가 다르면 각각 독립된 저장 공간을 갖는다. 즉, 두 함수에 선언된 변수 a는 이름만 같을 뿐 메모리에 별도의 저장 공간을 갖는다. 지역 변수 사용의 장점: 지역 변수의 사용 범위를 함수 단위로 제한하고 독립된 저장 공간을 확보하면 두 가지 장점이 있다. 1) 메모리를 효율적으로 사용한다. 2) 디버깅에 유리하다. ** 함수의 매개 변수 역시 지역변수이다. 함..

    [ C ] 주소와 포인터 차이? | 포인터의 크기 | 포인터 자료형 | 포인터 기능

    [ C ] 주소와 포인터 차이? | 포인터의 크기 | 포인터 자료형 | 포인터 기능

    포인터는 주소를 저장하는 일정한 크기의 메모리 공간이다. 따라서 언제든지 다른 주소를 저장하거나 포인터끼리 대입이 가능하다. 그러나 일반 변수와는 달리 대입 연산에대한 기준이 까다롭다. 주소와 포인터의 차이는 무엇일까? 주소: 변수에 할당된 메모리의 시작 주소 값 포인터: 그 값을 저장하는 또 다른 메모리 공간 따라서 특정 변수의 주소 값은 바뀌지 않지만 포인터는 다른 주소를 대입하여 그 값을 바꿀 수 있다. 예를들어, 변수 a, b 가 메모리에 할당된 상태라고 해보자. int a, b; int *p; p = &a; p= &b; 여기서 변수 a 의 주소는 100이고, 변수 b 의 주소는 200으로 실행중에는 그 값이 바뀌지 않는다. 반면, 포인터 p는 a 와 b 중 어떤 주소를 대입하냐에 따라 가리키는 ..

    [ C ] 포인터란? 메모리 주소 | 포인터 연산자( &, *)

    C 언어는 메모리에 접근해서 원하는 방식으로 데이터를 사용할 수 있는 언어이다. 이것이 가능한 이유는 바로 '포인터' 덕분이다. 변수는 함수 내부로 사용이 제한되어 있다. 같은 변수명을 사용했다고 하더라도 블록이나 함수가 다르면 별도의 저장 공간을 확보하므로 아예 다른 변수로 사용된다. 사용 범위를 벗어난 경우도 데이터를 공유할 수 있도록 하는 포인터의 개념을 알아보자! 메모리 주소 메모리는 우리가 데이터를 넣고 꺼내 쓰는 공간이다. 그래서 그 위치를 식별할 수 있어야한다. 메모리의 위치는 주소값으로 식별할 수 있다. 주소값은 '바이트 단위'로 구분된다. 0부터 시작하고, 바이트 단위로 1씩 증가한다. int a = 10; 위와 같이 선언했다고 하자. 위 문장은 100번지부터 103번지 까지 4 바이트 ..

    [ C ] 문자를 저장하는 배열 | char 형 배열 | 문자열 대입 방법 | strcpy(), gets(), puts()

    [ C ] 문자를 저장하는 배열 | char 형 배열 | 문자열 대입 방법 | strcpy(), gets(), puts()

    단어는 보통 알파벳을 연속적으로 적고 그 순서에 따라 의미가 달라진다. 이런 단어를 컴퓨터 메모리에서 데이터로 처리하려면 순서에 맞게 연속적으로 저장해야하는데, 이때 사용하면 아-주 적합한 자료형이 바로 배열이다. 특히 알파벳 문자 같은 경우 한 바이트로 표현이 가능하므로, char형 배열을 사용하는 것이 적합하다! char 형 배열의 선언과 초기화 char형 배열을 선언할 때는 저장한 문자열의 길이보다 최소한 하나 이상 크게 선언해야한다. 예를들어 문자열 'apple'을 저장하려할때, 배열은 배열 요소의 개수가 최소한 6 개 이상이어야한다. 즉, 남는 공간이 하나 이상은 있어야 한다는 것! 왜일까? 널문자(\0) 때문이다. char str[100] = "applejam"; 초기화한 문자들은 배열의 처음..

    [ C ] 배열 | 배열의 선언과 사용

    [ C ] 배열 | 배열의 선언과 사용

    동일한 자료형을 저장할 공간이 많이 필요하다면 일일이 변수를 선언하는 것은 쉽지 않다. 이때 사용하는 것이 '배열'이다. int kor, math, eng, sosial, science; //다섯 가지 변수가 있다고 생각해보자. 다섯 가지 과목의 점수를 저장하기 위해 변수 다섯 개를 선언했다고 가정하자. 따로따로 선언했으므로, 점수를 일일히 변수에 집어넣어줘야한다. 변수의 이름이 별도로 존재하니까... < 상당히 귀찮다 ㅋ 그래서 사용하는 것이 바로 '배열'! 같은 형태의 많은 데이터를 반복문으로 처리할 수 있도록 메모리에 연속적으로 저장해놓고, 이를 쪼개어 사용한다면 매우 효율적인 데이터 처리가 가능할 것이다. 배열을 선언해보자 배열 역시 선언을 통해 공간을 확보한다. 하나의 이름으로 한꺼번에 확보하면..

    [ C ] 겨울방학동안 C 포인터/ 구조체/ 동적메모리 개념 확실하게 익히기 | 자료구조 학습전 갖추어야할 베이스지식

    [ C ] 겨울방학동안 C 포인터/ 구조체/ 동적메모리 개념 확실하게 익히기 | 자료구조 학습전 갖추어야할 베이스지식

    개강까지 한 달하고 조금 넘게 남았다. 다음 학기에는 자료구조를 수강하는데, 지난번 글에도 언급했지만 C언어 교수님께서 자료구조를 제대로 공부하기 위해 C 언어의 탄탄한 베이스가 중요하다고 하셨다. 특히 포인터! 만일 자신이 생각하기에 C언어에대한 지식이 부족하다고 느낀다면 방학을 활용해 확실하게 개념을 잡으라고 하셨다. 내가 개인적으로 존경하는 교수님이기도하고, 굉장히 명교수님이셔서 조언을 꼭 새겨들어야겠다고 다짐했었다. 그래서 다음 학기에 교수님께서 활용하시는 교재를 미리 공부하는 중인데, C 언어의 개념이 확실히 중요하다는게 와닿았다. (자료구조 언어를 C로 배움) 그래서 C언어의 주요 개념들을 확실하게 다시 공부해보려고 한다! 작년 초에 C 예습한다고 구매했던 '혼자 공부하는 C 언어'와 학교에서..

    [C] fgetc() 함수의 반환값은 int

    전공 공부하는데 fget() 함수의 반환값이 왜 정수형인지 이해가 되지 않아서 찾아봤고! 그 이유를 알게되었다. 기록해둬야지. 우선, fgetc 함수의 원형은 다음과 같다. int fgetc(FILE * fp); fgetc는 문자 하나를 읽어들이는 함수인데, 왜...? - > char로 반환하면 문제가 생길 수 있기 때문이다. 다음 예를 보자. char ch; while( (ch=fgetc(fp)) != EOF ) { //something to do } fgetc 함수가 반환하는 값을 char형의 ch 변수에 대입한 후 이 변수와 EOF를 비교하는 반복문이다. 일반적으로는 파일의 끝을 만나기 전까지 while문을 돌 것이라고 예측할 것이다. 이제 여기서 발생할 수 있는 문제점을 살펴보자. 1. fgetc..

    [C] 동적 메모리 | memset() 함수

    전공 수업을 공부하던 중 안교수님이 따로 가르쳐두신 memset() 함수에 대해 정리해보고자 한다! 메모리를 초기화 해줄 수 있는 memset() 함수 1. C언어, C++에서의 memset 함수 memset 함수는 메모리의 내용(값)을 원하는 크기만큼 특정 값으로 세팅할 수 있는 함수 이다. 그냥 직관적으로 "memory + setting 메모리를 (특정 값으로) 세팅한다." 이렇게 생각하면 편할 것 같다. 함수 원형 void* memset(void* ptr, int value, size_t num); 첫번째 인자 void* ptr은 세팅하고자 하는 메모리의 시작 주소 즉, 그 주소를 가리키고 있는 포인터가 위치하는 자리이다. 두번째 인자 value는 메모리에 세팅하고자 하는 값이다. int 타입으로 ..

    [C] 동적 메모리 | malloc(), calloc(), realloc() 함수를 이용한 동적 메모리 할당

    [C] 동적 메모리 | malloc(), calloc(), realloc() 함수를 이용한 동적 메모리 할당

    메모리의 구조에 대해 이해해 보았으니 이제 동적 메모리 할당에 대해 정리하고자 한다. C 언어가 급격하게 어려워지고 이씀 ㅠ 기말이 좀 무서워지려해 malloc 함수 - 동적으로 메모리를 할당하는 함수 (힙 영역에 메모리를 할당) #include void* malloc(size_t size)// malloc 함수의 원형 함수 호출시 할당하고자 하는 메모리의 크기를 바이트 단위로 전달하면 그 크기만큼 메모리를 할당하게 된다. 그리고 할당한 메모리의 주소(첫 번째 바이트의 주소)를 리턴한다. 메모리 할당에 실패하면 NULL이 리턴된다. 리턴형이 void*(void 포인터) ?? malloc은 단순히 메모리만 할당하는 함수이기 때문에 개발자가 어떠한 데이터 형을 저장하는지 예측할 수 없다. 예를들어 4바이트를..